当一名球员站在Roblox的一个街区时会发生什么事?

时间:2017-02-11 12:02:13

标签: events lua roblox

当玩家站在它上面时,我想改变一个部分的颜色但是我可以将脚本放在工作区中并从一个事件中识别出部件,比如Humanoid被触摸或者什么东西? / p>

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

伪代码可能是

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

由于

3 个答案:

答案 0 :(得分:1)

正如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

这样做意味着你的角色触摸部件的任何东西都会触发Touched-event,所以你必须加上一张支票来检查领带部分是否是一条腿。

将函数绑定到每个部分而不是腿部的优点是,只有当您实际触摸其中一个预期部分而不是触摸任何部分时才会调用该函数。但是,随着您连接的部件数量的增加,还会增加一些事件,这些事件将被触发并存储在内存中。可能在你工作的规模上并不明显,但值得记住。

答案 1 :(得分:0)

因为我在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

这可能是最有效的方式之一,如果不是最有效的方式。

答案 2 :(得分:0)

当玩家站在一个块上时,值“ FloorMaterial”(在类人动物中)将告诉您用户所站立的是哪种材料,但是如果用户不站立在任何东西上,则该值为零

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

示例:

    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

这将从HumanoidRootPart朝地面应投射的方向投射光线,距离为6个螺柱。

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