如何让GLua中的ENT:Touch仅检测特定实体的触碰
解决GLua中ENT:Touch仅检测特定实体的问题
ENT:Touch的参数是固定的,就是触发触碰的实体,不能随意修改参数。要实现仅检测特定实体,必须在函数内添加有效性判断+类型/类名判断,以下是正确的实现方式:
情况1:仅响应玩家实体的触碰
function ENT:Touch(entity) -- 先判断实体是否有效,再判断是否为玩家 if not IsValid(entity) or not entity:IsPlayer() then return -- 不是目标实体,直接退出函数 end EmitSound(Sound("buttons/lightswitch2.wav"), self:GetPos(), 1, CHAN_AUTO, 1, 75, 0, 100) self:Remove() end
情况2:仅响应特定类名的实体
比如要检测prop_physics类的实体,或者你自定义的实体类:
function ENT:Touch(entity) -- 第一步必须检查实体有效性,避免访问已销毁的实体导致逻辑中断 if not IsValid(entity) then return end -- 替换成你需要检测的实体类名 local targetClass = "prop_physics" if entity:GetClass() ~= targetClass then return end EmitSound(Sound("buttons/lightswitch2.wav"), self:GetPos(), 1, CHAN_AUTO, 1, 75, 0, 100) self:Remove() end
常见问题排查
- 不要修改
ENT:Touch的参数列表,它的参数固定为触碰过来的实体,改参数会导致函数无法被引擎正确调用 - 必须先执行
IsValid(entity)判断,否则触碰已销毁的实体时,后续代码会报错,导致整个逻辑失效 - 检查目标实体的类名拼写是否正确,自定义实体的类名要和注册时一致
内容的提问来源于stack exchange,提问作者Pacman09
相关产品推荐
相关产品推荐

