プレイヤーのハザードを作成する

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。


ハザードオブジェクトは、プレイヤーが触れると、プレイヤーの健康を低下させます。シンプルなスタート地点として、このチュートリアルのセクションでは、経験中の水と同じレベルで大きな見えない部分を作成する方法を教えてください、そうすると、落下によりプレイヤーの体力がゼロになり、経験の始まりに戻ります。

基本的な水害を作成

基本的な水害を作成するには:

  1. エクスプローラ ウィンドウで、新しいフォルダを ワールド フォルダに追加し、名前を ハザード に変更します。名前が正しいスペルでスペルされていることを確認してください、そうしないとコードは機能しません。

  2. ハザード フォルダで、 ブロック パーツを挿入し、名前を ハザード に変更します。

    Studio's Explorer window with the Hazard block Part highlighted under the Hazards folder.
  3. 部品を移動してスケールして、島とプラットフォームの周りの水道をカバーします。たとえば、サンプル 島ジャンプ - スクリプト 経験は、 サイズ825, 1, 576 に設定し、 CFrame.Position174, -6.5, 38 に設定します。

    A far out view of all of the cylinder sea stacks and the island. A large block part covers the water where a player could land if they fell from a sea stack.
  4. パーツを選択し、 プロパティ ウィンドウで、次のプロパティを構成して、ハザードが見えなくなり、プレイヤーがそのまま通過できるようにします:

    • 透明度1。これにより、危険が見えなくなり、実際の水が危険と見えるようになります。
    • 無効にする CanCollide 。これは、エンジンに他の部分が中断なくハザードを通過できると伝え、プレイヤーがハザードを通過できることを意味します。
    • 有効化 アンカー済み 。これにより、エンジンは物理に関連するシミュレーションによってハザードの位置を変更しないように指示し、プレイヤーは位置に影響を与えずにハザードに触れることができます。
  5. Create a スクリプト in ServerScriptService , then rename it to ハザードサービス .

  6. デフォルトコードを次のコードで置き換えます:


    local Players = game:GetService("Players")
    local Workspace = game:GetService("Workspace")
    local hazardsFolder = Workspace.World.Hazards
    local hazards = hazardsFolder:GetChildren()
    local function onHazardTouched(otherPart)
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = 0
    end
    end
    end
    for _, hazard in hazards do
    hazard.Touched:Connect(onHazardTouched)
    end

    ハザードサービスコインサービス と多くの共通点を持っています。しかし、コインを集めるのではなく、プレイヤーは危険に触れると、 体力が 0 に設定されます

    エクスペリエンス内のハザードオブジェクトを修正、追加、または削除して、ユニークな障害を作成することをお気軽にしてください。 ハザード フォルダに含まれている限り、コードループはイベントハンドラーをすべてのハザードに接続します。

プレイヤーのライフサイクルに接続

プレイヤーのライフサイクルは、プレイヤーが体験に参加したり、退出したり、リスポーンしたりするときに発生するイベントを表します。各メジャーライフサイクルイベントに対して適切にロジックを実行するには、ハンドラーをこれらのイベントに接続してください。 コインサービス スクリプトで、スクリプトの底に次のコードをコピーして貼り付けます:


local function onPlayerAdded(player)
-- プレイヤーコインを 0 にリセット
updatePlayerCoins(player, function(_)
return 0
end)
player.CharacterAdded:Connect(function(character)
-- WaitForChild はプレイヤーループを停止するので、以下は別のスレッドで行う必要があります
task.spawn(function()
-- プレイヤーが死亡するとき
character:WaitForChild("Humanoid").Died:Connect(function()
-- プレイヤーコインを 0 にリセット
updatePlayerCoins(player, function(_)
return 0
end)
end)
end)
end)
end
-- プレーヤー追加イベントに接続する前に追加されたプレーヤーを初期化する
for _, player in Players:GetPlayers() do
onPlayerAdded(player)
end
local function onPlayerRemoved(player)
updatePlayerCoins(player, function(_)
return nil
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoved)

コードは、適切なライフサイクルイベントでコインカウントをリセットする機能を定義します:

  • Player.PlayerAdded プレイヤーがエクスペリエンスに参加すると、コイン数を 0 に設定します。
  • Player.CharacterAdded プレイヤーのキャラクタモデルが世界に追加されると、発射します。PlayerAdded と後、プレイヤーがリスポーンするたびに発生します。
  • Humanoid.Died プレイヤーが死亡すると、コイン数を 0 に設定して発射します。task.spawn() は、これを処理するための別のスレッドを作成し、プレイヤーのライフサイクルの他の側面が実行できます。
  • Player.PlayerRemoved プレイヤーがエクスペリエンスを終了してプレイヤー状態をクリーンアップするときに発火します。
  • このコードには、Players.PlayerAdded イベントが実行される前にプレイヤーがコインを収集し、その後コイン数がゼロにリセットされる可能性のある問題が含まれています。この問題を解決するには、コードのスケジューリングやプレイヤーのキャラクターを初期化終了まで凍結するようなソリューションを検討してください。しかし、これらの解決策には、このチュートリアルの範囲を超えたより複雑なスクリプトコンセプトが含まれています。

プレイテスト

プレイヤーの危険性が意図通りに機能しているかを確認する時が来ました。水に触れると、キャラクターは死に、コインを失うべきです。ゲームをテストするには:

  1. ツールバーで プレイ ボタンをクリックします。Studio がプレイテストモードに入ります。

    Play button highlighted in Studio's playtesting options.
  2. キャラクターを動かしてコインを集め、水に飛び込んでください。スクリプトが正しく機能している場合、キャラクターが死に、リーダーボードのコインカウントが 0 にリセットされます。