📜  roblox 如何禁用步行 (1)

📅  最后修改于: 2023-12-03 15:19:50.636000             🧑  作者: Mango

Roblox 如何禁用步行

如果你想在 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)

这段代码会恢复角色在空中移动,并将其允许飞行,但此时需要注意角色在上空时的位置。