📅  最后修改于: 2023-12-03 15:19:50.636000             🧑  作者: Mango
如果你想在 Roblox 游戏中禁用步行,例如当你的游戏需要玩家只能使用特定的交通工具移动时,下面是一些代码示例和说明。
可以使用 Roblox 内置的 DisableStepping 选项来禁用角色的步行能力。
-- 禁用玩家的步行能力
game.Players.PlayerAdded:Connect(function(player)
local character = player.Character or player.CharacterAdded:Wait()
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Climbing, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.FallingDown, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Freefall, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Ragdoll, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Running, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Swimming, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.GettingUp, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Physics, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.PlatformStanding, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.StrafingNoPhysics, false)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.ClimbingNoPhysics, false)
end)
这段代码会在玩家加入游戏时禁用其角色的步行能力,这使得玩家只能通过特定的交通工具移动。当需要允许步行时,只需将以上代码替换为下面的代码即可。
-- 恢复玩家的步行能力
game.Players.PlayerAdded:Connect(function(player)
local character = player.Character or player.CharacterAdded:Wait()
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Climbing, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.FallingDown, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Freefall, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Ragdoll, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Running, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Swimming, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.GettingUp, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Physics, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.PlatformStanding, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.StrafingNoPhysics, true)
character.Humanoid:SetStateEnabled(Enum.HumanoidStateType.ClimbingNoPhysics, true)
end)
当你希望玩家只能在地面或水面上移动时,可以将以下代码添加到角色的 Humanoid 对象中。
-- 禁用空中移动
local HB = game:GetService("RunService").Heartbeat
local lastPos = Vector3.new(0,0,0)
game.Players.PlayerAdded:Connect(function(player)
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
humanoid.PlatformStand = true
humanoid.FreeFalling:Connect(function()
humanoid.PlatformStand = false
while not humanoid:GetStateEnabled(Enum.HumanoidStateType.PlatformStanding) do
HB:Wait()
end
humanoid.PlatformStand = true
humanoid.Jump = true
local function recursiveCheck(character)
for _, child in ipairs(character:GetChildren()) do
if child:IsA("BasePart") and (lastPos - child.Position).Magnitude > 10 and child.CFrame.p.Y >= lastPos.Y then
character.PrimaryPart.CFrame = child.CFrame + Vector3.new(0, character.PrimaryPart.Size.Y / 2, 0)
recursiveCheck(child.Parent)
break
end
end
end
recursiveCheck(character)
end)
humanoid.Parent.ChildRemoved:Connect(function(child)
if child.Name == "HumanoidRootPart" then
character.PrimaryPart.CFrame = CFrame.new(lastPos)
end
end)
local hrp = character:WaitForChild("HumanoidRootPart")
hrp:GetPropertyChangedSignal("CFrame"):Connect(function()
lastPos = hrp.Position
end)
end)
这段代码会禁用角色在空中移动,并将它固定在水面或地面上。请注意,这除了禁用角色的各种移动状态外,还使用了递归函数来检测角色在空中的位置并将其移动到就近的地面或水面上。当需要恢复空中移动时,可以将以上代码替换为以下代码。
-- 启用空中移动
game.Players.PlayerAdded:Connect(function(player)
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
humanoid.PlatformStand = false
local function recursiveCheck(character)
for _, child in ipairs(character:GetChildren()) do
if child:IsA("BasePart") and (lastPos - child.Position).Magnitude > 10 and child.CFrame.p.Y >= lastPos.Y then
character.PrimaryPart.CFrame = child.CFrame + Vector3.new(0, character.PrimaryPart.Size.Y / 2, 0)
recursiveCheck(child.Parent)
break
end
end
end
humanoid.Died:Connect(function()
character.PrimaryPart.CFrame = CFrame.new(lastPos)
end)
humanoid.Parent.ChildRemoved:Connect(function(child)
if child.Name == "HumanoidRootPart" then
character.PrimaryPart.CFrame = CFrame.new(lastPos)
end
end)
local hrp = character:WaitForChild("HumanoidRootPart")
hrp:GetPropertyChangedSignal("CFrame"):Connect(function()
if humanoid:GetState() ~= Enum.HumanoidStateType.Freefall then
lastPos = hrp.Position
end
end)
end)
这段代码会恢复角色在空中移动,并将其允许飞行,但此时需要注意角色在上空时的位置。