Events 当一名球员站在Roblox中的一个方块上时,会触发什么事件?

Events 当一名球员站在Roblox中的一个方块上时,会触发什么事件?,events,lua,roblox,Events,Lua,Roblox,当一个玩家站在上面时,我想改变一个角色的颜色,但是我可以将脚本放在工作区中,并从事件中识别该角色,而不是将脚本放在该角色中,比如人形触摸或其他什么 原因是我有100个需要对触摸事件做出反应的部分,所以我不想在每个部分都放相同的脚本 伪代码可能是 玩家触摸部分事件被触发 从事件中识别零件并更改零件颜色 谢谢正如M.Ziegenhorn所写,你可以直接把剧本放在角色或脚上。这将是实现这一目标的“最简单”的方法 但是,您也可以轻松地将函数连接到每个部分。 在下面的代码中,我们在名为“TouchPart

当一个玩家站在上面时,我想改变一个角色的颜色,但是我可以将脚本放在工作区中,并从事件中识别该角色,而不是将脚本放在该角色中,比如人形触摸或其他什么

原因是我有100个需要对触摸事件做出反应的部分,所以我不想在每个部分都放相同的脚本

伪代码可能是

玩家触摸部分事件被触发 从事件中识别零件并更改零件颜色


谢谢

正如M.Ziegenhorn所写,你可以直接把剧本放在角色或脚上。这将是实现这一目标的“最简单”的方法

但是,您也可以轻松地将函数连接到每个部分。 在下面的代码中,我们在名为“TouchParts”的工作区中检查了一个模型,该模型(假设)包含要将触摸功能绑定到的部分

function Touched(self, Hit)
  if Hit and Hit.Parent and Hit.Parent:FindFirstChildOfClass'Humanoid' then
    -- We know it's a character (or NPC) since it contains a Humanoid
    -- Do your stuff here
    print(Hit.Parent.Name, 'hit the brick', self:GetFullName())
    self.BrickColor = BrickColor.new('Bright red')
  end
end

for _, object in pairs(workspace.TouchParts:GetChildren()) do
   if object:IsA'BasePart' then
     object.Touched:connect(function(Hit)
       Touched(object, Hit)
      end)
   end
end
这样做意味着角色中任何接触到该部分的内容都将触发触摸事件,因此您必须添加一个检查,以查看领带部分接触是否是腿部


将函数绑定到每个部分而不是腿部的好处是,只有当您实际触摸其中一个预期部分时,才会调用函数,而不是触摸任何对象。然而,随着连接到的部件数量的增加,将被触发并存储在内存中的事件也会增加。在你使用的天平上可能不明显,但值得记住。

我已经有一段时间没有在roblox上编码了,所以请原谅我犯的任何错误

local parent = workspace.Model --This is the model that contains all of that parts you are checking.
local deb = 5 --Simple debounce variable, it's the minimum wait time in between event fires, in seconds.
local col = BrickColor.new("White") --The color you want to change them to once touched.

for _,object in next,parent:GetChildren() do --Set up an event for each object
    if object:IsA("BasePart") then --Make sure it's some sort of part
        spawn(function() --Create a new thread for the event so that it can run separately and not yield our code
            while true do --Create infinite loop so event can fire multiple times
                local hit = object.Touched:wait() --Waits for the object to be touched and assigns what touched it to the variable hit
                local player = game.Players:GetPlayerFromCharacter(hit.Parent) --Either finds the player, or nil
                if player then --If it was indeed a player that touched it
                    object.BrickColor = BrickColor.new(col) --Change color; note this is also where any other code that should run on touch should go.
                end
                wait(deb) --Wait for debounce
            end
        end)
    end
end

这可能是最有效的方法之一。

当玩家站在一个区块上时,值“FloorMaterial”(人形)将告诉你用户站在什么材料上,但如果用户没有站在任何东西上,该值将为零

另一种有效的方法是使用光线。您需要从HumanoidRootPart创建一条光线

示例:

这将从人形根部分向地面应该的方向投射光线,距离为6个螺柱


遗憾的是,据我所知,这种方法对R15字符不是很有效。

谢谢,这是伟大的Ravenshield!另外一个快速的问题是我点击的触摸功能,它允许我访问播放器,但我如何访问该功能中触摸的部分本身?例如,如果我想更改被触摸零件的颜色。使用循环和生成新线程将更有效。@tartanger我们可以稍微混合一下函数。将另一个参数添加到toucted函数(例如:function toucted(Hit,Object)),然后为事件创建一个匿名函数。这样我们就可以调用touch函数并传递对象。我编辑了我原来的帖子来解释这一点。看一看。谢谢Ravenshield,我会试试这个,我会试试的。spawn函数很有趣-我需要对此做更多的研究!因此,如果模型中有100个ART,那么这将同时调用100个线程,这需要运行很多吗?设置事件连接也会做同样的事情。值得注意的是,线程不会同时运行。他们在彼此之间切换。
    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