如何在Roblox的Touched函数中获取触发碰撞的闸门名称?
如何在Roblox的Touched事件里知道是哪个闸门被小球碰撞了
嘿,我明白你的需求啦——现在你的脚本能检测到小球碰闸门,但分不清是蓝色还是红色的对吧?问题出在你当前的goal函数里,没法拿到触发碰撞事件的那个闸门实例,因为Touched事件默认只给你碰撞的对象(也就是小球hitter)。给你两种简单好用的解决办法:
方法1:用闭包把闸门实例传进函数
这种方法很直观,绑定事件的时候用匿名函数把对应的闸门对象传给goal,这样函数里就能直接知道是哪个闸门触发的:
function goal(gate, hitter) if hitter.Name == "ball" then print("触发碰撞的闸门:", gate.Name) print("撞到闸门的小球:", hitter.Name) print("=============") end end -- 给蓝色闸门绑定事件,把gate_blue实例传进去 game.Workspace.gate_blue.Touched:Connect(function(hit) goal(game.Workspace.gate_blue, hit) end) -- 红色闸门同理 game.Workspace.gate_red.Touched:Connect(function(hit) goal(game.Workspace.gate_red, hit) end)
方法2:利用Roblox事件的隐式self参数
Roblox里用:Connect()绑定事件时,回调函数的第一个参数其实就是触发事件的那个实例(也就是闸门本身),只要你把函数定义加上这个参数就行:
-- 第一个参数self就是触发碰撞的闸门 function goal(self, hitter) if hitter.Name == "ball" then print("触发碰撞的闸门:", self.Name) print("撞到闸门的小球:", hitter.Name) print("=============") end end -- 直接用:Connect绑定,self会自动传进函数 game.Workspace.gate_blue.Touched:Connect(goal) game.Workspace.gate_red.Touched:Connect(goal)
顺便提一下你原来代码的小问题
你之前写的print(Instance.Parent)是不对的,Instance是Roblox所有对象的基类,不是当前触发事件的那个闸门,所以根本拿不到你要的信息。用上面两种方法就能准确获取闸门的名称啦。
另外如果你的小球是个模型(不是单个部件),可以改成判断hitter.Parent.Name == "ball",这样能避免只碰到模型的某个部件时误判的情况哦。
内容的提问来源于stack exchange,提问作者VictorDDT
相关产品推荐
相关产品推荐

