プレイヤーハザードを作成

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


ハザードオブジェクトは、プレイヤーが触れるとプレイヤーの健康を減少させます。 シンプルな開始点として、このチュートリアルのセクションでは、大きな隠し部分を作成する方法を説明しています。これは、水のように、エクスペリエンス内のプレイヤーの健康をゼロに変更し、リスポーンするために開始点に戻ります。

ベーシックな水害を作成

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

  1. In the Explorer window, add a new folder into the World folder, then rename it Hazards . 名前が正しくスペルされていることを確認してください。コードが正しく動作することを確認するために、名前を正しくスペルしていることを確認してください。

  2. In the ハザードズ フォルダ, insert a ブロック part and rename it ハザード .

    Studio's Explorer window with the Hazard block Part highlighted under the Hazards folder.
  3. 部品を移動し、スケールして水のラインを島とプラットフォームの周りに覆うために使用します。たとえば、サンプル 島のジャンプ - スクリプト 体験は サイズ825, 1, 576 および 1>CFrame.Position

    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 HazardService .

  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

    HazardService は、 CoinService と似ています。ただし、コインを集める代わりに、プレイヤーはハザードに触れたときに 体力 を0に設定します。

    安全オブジェクトをエクスペリエンスに変更、追加、または削除して、ユニークな障害を作成します。それらが ハザード フォルダ内に含まれている限り、コードループはイベントハンドラーをすべてのハザードに接続します。

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

プレイヤーのライフサイクルは、プレイヤーがエクスペリエンスに参加、抜ける、またはリスポーンするときに発生するイベントを表します。これらのイベントには、参加、抜ける、またはリスポーンするときにハンドラーを接続する必要があります。 CoinService スクリプトのコピーと貼り付けて、スクリプトの下部に次


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
-- PlayerAdded イベントに追加されるプレイヤーを初期化する
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 はプレイテストモードに入ります。

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. キャラクターを移動してコインを集め、その後水にジャンプします。スクリプトが正しく動作すると、キャラクターが死亡し、リーダーボード上のコインカウントが 0 にリセットされます。