Roblox仅在一个块上触摸事件

时间:2018-05-18 23:26:27

标签: events lua touch roblox

我发现LUA和Roblox并测试我的第一个脚本。 我想知道正确的方法来管理触摸事件当角色用脚触摸一块时,(无论是走路还是跳跃)

local function onTouch(hit)
    if hit ~= ??user.legs?? then 
        return 
    end
    -- exemple of action
    if hit.Parent.Humanoid.JumpPower < 150 then
        hit.Parent.Humanoid.JumpPower = hit.Parent.Humanoid.JumpPower + 5;
    end 
end

script.Parent.Touched:connect(onTouch)

1 个答案:

答案 0 :(得分:1)

如果您试图在玩家用腿触摸部件时处理碰撞,那么您的代码就可以了,但是,如果您想检测玩家何时站在地面上,则不是这样

一种更好的方法如下:

示例:

IsOnGround=function()
local b=false;
local range=6;
local char=game:service("Players").LocalPlayer.Character;
local root=char:WaitForChild("HumanoidRootPart",1);
if root then
local ray=Ray.new(root.CFrame.p,((root.CFrame*CFrame.new(0,-range,0)).p).unit*range);
local ignore={char};
local hit,pos=workspace:FindPartOnRayWithIgnoreList(ray,ignore,false,false);
pcall(function()
if hit then
b=true;
end
end)
else
print("root not found");
end
return b;
end

尽管这种方法不是最可靠的方法,但它既不喜欢R15字符,也不喜欢步行。

FloorMaterial是一种可以在99%的时间内工作并且易于使用的方法。

FloorMaterial是角色的人形生物的属性。如果玩家没有站在任何东西上(换句话说,不要触摸地面!),则此属性为nil。可以将此方法置于循环中,以不断检测您是否站在障碍物上。这种方法同样适用于R15和R6,并且比使用.Touched连接更不易出错。

示例:

    coroutine.wrap(function()
        while wait()do
            local floor=humanoid.FloorMaterial
            if(tostring(floor)=="Enum.Material.Air")or(floor==nil)then
                print("on air");
            else
                print("stepping over something");
            end
        end
    end)()

希望我的回答有帮助。