我发现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)
答案 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)()
希望我的回答有帮助。