現在、プレイヤーはプラットフォームから落ちても何の影響もありません。このセクションでは、ゲーム内の水面と同じ高さに大きな見えない危険を作成する方法を説明します。プレイヤーがその危険に落ちると、健康がゼロに減少し、ゲームの開始地点で再出現します。
基本的な水の危険を作成する
基本的な水の危険を作成する
Workspace > World内にHazardsという名前の新しいフォルダーを作成します。
Hazardsフォルダー内に、サイズ825, 1, 576およびCFrame.Position 174, -6.5, 38のブロックPartをHazardという名前で作成し、そのパートが島とプラットフォームの周りの水を覆うようにします。
透明度を1に設定してパートを見えなくし、実際の水が危険に見えるようにし、CanCollideを無効にしてプレイヤーがそれを通り抜けて水に落ちるようにし、Anchoredを有効にして物理的に動かないようにします。プレイヤーが危険に触れたときの検出
危険は、Touchedをリッスンしてプレイヤーの健康をゼロに下げるスクリプトを書くまで何も行いません。
HazardServiceを作成
ServerScriptService内にHazardServiceという名前のスクリプトを作成し、次のコードを追加します:
```lua
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に設定されます。
ゲーム内の危険オブジェクトを自由に変更、追加、削除して、ユニークな障害物を作成してください。Hazardsフォルダーに含まれている限り、コードループはすべての危険にイベントハンドラーを接続します。
プレイヤーライフサイクルに接続する
プレイヤーライフサイクルは、プレイヤーがゲーム内で相互作用する際に発生するイベントを表します。たとえば、参加、離脱、再出現などです。これらのイベントにハンドラーを接続して、各主要ライフサイクルイベントのロジックを実行する必要があります。
CoinServiceにライフサイクルハンドラーを追加
ServerScriptService内の既存のCoinServiceスクリプトの下部に次のコードを追加します(既存のコードを置き換えないでください — その後に追加します):
```lua
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)
```コードの説明
このコードは、適切なライフサイクルイベント中にコイン数をリセットするための関数を定義します:
- Players.PlayerAddedはプレイヤーがゲームに参加したときに発火し、コイン数を0に設定します。
- Player.CharacterAddedはプレイヤーのキャラクターモデルが世界に追加されたときに発火します。これはPlayerAddedの後に発生し、プレイヤーが再出現するたびに発生します。
- Humanoid.Diedはプレイヤーが死亡したときに発火し、コイン数を0に設定します。task.spawn()はこれを処理するための別スレッドを作成し、プレイヤーライフサイクルの他の側面が実行できるようにします。
- Player.PlayerRemovedはプレイヤーがゲームを離れたときに発火し、プレイヤーの状態をクリーンアップします。
- このコードには、プレイヤーがPlayers.PlayerAddedイベントが実行される前にコインを収集し、その後コイン数がゼロにリセットされる可能性があるという潜在的な問題があります。この問題を軽減するために、コードのスケジューリングやプレイヤーのキャラクターを初期化が完了するまでフリーズさせるなどの解決策を検討してください。ただし、これらの解決策はこのチュートリアルの範囲を超えるより複雑なスクリプトの概念を含みます。
プレイテスト
ドロップダウンからテストを選択し、プレイをクリックします。いくつかのコインを集めた後、水に飛び込みます。キャラクターは死亡し、開始地点で再出現し、コイン数は0にリセットされるはずです。