ハザードオブジェクトは、プレイヤーが触れるとプレイヤーの健康を減少させます。 シンプルな開始点として、このチュートリアルのセクションでは、大きな隠し部分を作成する方法を説明しています。これは、水のように、エクスペリエンス内のプレイヤーの健康をゼロに変更し、リスポーンするために開始点に戻ります。
ベーシックな水害を作成
基本的な水害を作成するには:
In the Explorer window, add a new folder into the World folder, then rename it Hazards . 名前が正しくスペルされていることを確認してください。コードが正しく動作することを確認するために、名前を正しくスペルしていることを確認してください。
In the ハザードズ フォルダ, insert a ブロック part and rename it ハザード .
部品を移動し、スケールして水のラインを島とプラットフォームの周りに覆うために使用します。たとえば、サンプル 島のジャンプ - スクリプト 体験は サイズ を 825, 1, 576 および 1>CFrame.Position
パーツを選択し、 プロパティ ウィンドウで、次のプロパティを構成して、ハザードが見えないように、プレイヤーがそれを通過できるようにします:
- 透明度を1に設定します。これにより、リスクが透明になり、実際の水がリスクに表示されます。
- 無効にする CanCollide 。これはエンジンに、他のパーツがハザードを無事に通過することを伝え、プレイヤーがハザードを落ちることができるようになります。
- 固定 を有効にする。これは、エンジンが任意の物理モデルシミュレーションにより、ハザードの位置を変更することのないように伝え、プレイヤーが位置に影響を与えないでハザードに触れるようになります。
Create a スクリプト in ServerScriptService , then rename it to HazardService .
次のコードをデフォルトコードと交換します:
local Players = game:GetService("Players")local Workspace = game:GetService("Workspace")local hazardsFolder = Workspace.World.Hazardslocal hazards = hazardsFolder:GetChildren()local function onHazardTouched(otherPart)local character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player thenlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = 0endendendfor _, hazard in hazards dohazard.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 とプレイヤーがリスポーンするときに発生します。
- Player.PlayerRemoved は、プレイヤーがエクスペリエンスを終了すると発動してプレイヤーの状態をクリアします。
- このコードには、プレイヤーが Players.PlayerAdded イベントが実行される前にコインを集める可能性のある潜在的な問題が含まれています。この問題をミットゲートするためには、コードスケジュールを管理するなどのソリューションを検討することができます。しかし、これらのソリューションは、
プレイテスト
プレイヤーのハザードが期待通りに機能するかどうかを確認する時が来ました。水に触れると、キャラクターは死んでコインを失う必要があります。ゲームをテストするには:
メニューバーで プレイ ボタンをクリックします。Studio はプレイテストモードに入ります。
キャラクターを移動してコインを集め、その後水にジャンプします。スクリプトが正しく動作すると、キャラクターが死亡し、リーダーボード上のコインカウントが 0 にリセットされます。