🏊
【Roblox】水に落ちたときにリスポーンさせる
Roblox Studioはじめました。まだまだ手探りですが。
RobloxではTerrain(地形)の水の中で泳ぐ機能が最初からありますが、敢えて水に落ちたらリスポーンさせたいとした場合……
ワークスペースの「StarterPlayer/StarterPlayerScripts」にScriptを追加し、
こんな感じで書けばいいようです。
要するに「泳いでいることがわかったら即座にリスポーン(SpawnLocationのところにワープ)」ですね。
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
-- WorkspaceのSpawnLocationオブジェクトを取得
local spawnLocation = Workspace:WaitForChild("SpawnLocation")
-- SpawnLocationの位置を開始位置に設定
local startPosition = spawnLocation.Position
local function onCharacterAdded(character)
local humanoid = character:WaitForChild("Humanoid")
humanoid.StateChanged:Connect(function(oldState, newState)
if newState == Enum.HumanoidStateType.Swimming then
-- プレイヤーが泳ぎ始めたときに開始位置にリスポーンさせる
local rootPart = character:WaitForChild("HumanoidRootPart")
rootPart.CFrame = CFrame.new(startPosition)
end
end)
end
local function onPlayerAdded(player)
player.CharacterAdded:Connect(onCharacterAdded)
-- プレイヤーが既にキャラクターを持っている場合に対応
if player.Character then
onCharacterAdded(player.Character)
end
end
Players.PlayerAdded:Connect(onPlayerAdded)
-- 既に存在するプレイヤーに対応
for _, player in ipairs(Players:GetPlayers()) do
onPlayerAdded(player)
end
まだまだ中身ちゃんと理解していないんでなんですが、やりたい人も結構いそうだと思ったので備忘録代わりに。
ただRobloxの場合は「泳げる」のが基本のはずなんで、「このワールドでは泳げません!」と表示しておくとか、水をいかにも毒々しくしておくとかは必要かもしれませんね……
おまけ
こんな風に0.5秒待ってからリスポーンのほうがそれっぽいかもしれません。
即座に水の中から出ればOK、みたいな部分も出るんで善し悪しですが。
if newState == Enum.HumanoidStateType.Swimming then
-- 0.5秒後に開始位置にリスポーンさせる
delay(0.5, function()
if humanoid:GetState() == Enum.HumanoidStateType.Swimming then
local rootPart = character:WaitForChild("HumanoidRootPart")
rootPart.CFrame = CFrame.new(startPosition)
end
end)
end
あと、勝手に動かすのではなく、humanoid.Health=0のほうが「死亡エフェクト」とかも出るのでそれっぽさは増しそうです。
Discussion