🏊

【Roblox】水に落ちたときにリスポーンさせる

2024/05/25に公開

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