检测碰撞¶
Time:5 分钟
Collision(碰撞)是游戏世界中虚拟形状出现交集时所产生的结果。这些虚拟形状在 Roblox 中被称为 BasePart
对象,而其出现交集时的行为取决于开发者对碰撞现象的脚本编写。
在进行碰撞处理时,请注意以下几点:
Roblox 中的碰撞会导致对象进行位移。当不希望对象位置受碰撞影响时,请禁用碰撞中涉及双方对象或其中之一的
BasePart/CanCollide|CanCollide
属性。禁用后,BasePart/Touched|Touched
(已触碰)和BasePart/TouchEnded|TouchEnded
事件仍然会触发,但碰撞对象的动量状态将不会受到影响。当需要隐藏碰撞检测部件(如大门前能够检测玩家进入建筑物的区域等)时,请将其
BasePart/Transparency|Transparency
(透明度)属性设置为 1。BasePart|BasePart
同时也可以使用自定义网格。关于如何针对自定义网格为碰撞检测进行微调,请查看Enum/CollisionFidelity|CollisionFidelity
一文。
Touched 事件¶
即使部件设置为不发生物理碰撞(也就是当 BasePart/CanCollide|CanCollide
设置为 false
时),Roblox 也会触发部件接触或相交的 BasePart/Touched|Touched
(触碰)事件。此功能对触发游戏中的特定事件非常有用,例如打开活板门、在障碍赛中通过保存点保存游戏进度、以及依照玩家位置不同更改其区域天空盒等情况。
部件触发的碰撞¶
任何部件都可以用来触发 BasePart/Touched|Touched
(触碰)事件。当需要在游戏中使用该事件时,必须通过 Connect()
为其连接一个函数。将下列 Script
(脚本)放置在部件内,即可显示如何使用 BasePart/Touched|Touched
(触碰)事件检测该部件与其他部件的碰撞。
local part = script.Parent
local function onPartTouched(otherPart)
print(part.Name .. " 触碰了 " .. otherPart.Name)
end
part.Touched:Connect(onPartTouched)
角色触发的碰撞¶
若要检测玩家的角色是否触碰了任何部件,请找到碰撞部件的父项,并检查其是否包含 Humanoid
对象。该脚本必须放在检测碰撞的部件中。
local part = script.Parent
local function onPartTouched(otherPart)
-- 获取另一个部件的父项
local partParent = otherPart.Parent
-- 在父项中寻找 Humanoid 对象
local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- 对 Humanoid 对象进行操作(例:将其生命值设为 0)
humanoid.Health = 0
end
end
part.Touched:Connect(onPartTouched)
当发生角色与其他模型间多次触发 BasePart/Touched|Touched
事件的情况时,其原因可能是角色的每个部件(脚、小腿等)都分别触发了不同的事件。为了防止这种情况,开发者可以在脚本中添加articles/Debounce|防抖动
系统。