Skip to main content

物理触发器

概述

当需要检测某一特定形状范围内进出的物体,并获得回调实现游戏逻辑时,可以尝试使用物理触发器功能。

相关组件

可以通过点击创建游戏对象(Create Game Object) -> 物理( Physics)选中并摆放这些对象; 选中场景对象,点击观察器面板(Inspector)中的添加组件(Add Component)-> 场景(Scene),选择需要添加的相关组件。

当前支持物理触发功能的游戏对象和组件有:

image-20230202095640296

对象名描述
盒体触发器(Box Trigger)摆放后自带一个盒子组件,并自动开启触发器功能。
球体触发器(Sphere Trigger)摆放后自带一个球形组件,并自动开启触发器功能。
胶囊体触发器(Capsule Trigger)摆放后自带一个胶囊体组件,并自动开启触发器功能。

image-20230202100118542

组件名描述
盒子组件( Box Component)检测盒子形状范围内进出的物体并产生触发器事件。
球形组件(Sphere Component)检测球形范围内进出的物体并产生触发器事件。
胶囊体组件(Capsule Component)检测胶囊体状范围内进出的物体并产生触发器事件。

注意:触发器之间不会相互触发事件。

进入触发器范围的组件 Collision Enabled 属性必须为"PhysicsOnly"或者"Query And Physics"才可以成功触发事件。

组件属性

details_physics_trigger

属性描述
触发器(Trigger)是否开启物理触发器功能。
当Trigger为true时,组件开启触发器功能。
注意:通过LBoxTrigger、LSphereTrigger、LCapsuleTrigger创建的触发器,Trigger属性默认为true且在编辑器上不可见。

触发器碰撞预设

触发器碰撞预设,是引擎提供的专用于物理触发器碰撞设置的碰撞预设类型。

点击配置(Config)-> 物理(Physics)-> 碰撞预设(Collision Preset)打开该面板。

image-20230202095445116

image-20230202094031023

组件名描述
预设名称(Preset Name)触发器(Trigger)
启用碰撞(Collision Enable)仅物理可见(PhysicsOnly)
通道(Channel)触发器(Trigger)
通道类型默认碰撞响应
世界静态(WorldStatic)忽略(Ignore)
世界动态(WorldDynamic)重叠(Overlap)
Pawn重叠(Overlap)
载具(Vehicle)重叠(Overlap)
破坏(Destructible)重叠(Overlap)
可见(Visibility)重叠(Overlap)
摄像机(Camera)重叠(Overlap)
触发器(Trigger)重叠(Overlap)

触发器事件碰撞判断机制

  • 碰撞双方的通道类型与碰撞响应进行交叉比较,当不存在Ignore结果时,即可成功触发事件。
  • 进入范围的组件 IgnoreTrigger 属性为true则不触发事件。
触发器通道与其他对象碰撞响应其他对象通道与触发器碰撞响应是否触发事件
拦截(Block)重叠(Overlap)+拦截(Block)重叠(Overlap)=Yes
忽略(Ignore)+Any=No
Any+忽略(Ignore)=No

配合脚本组件实现事件触发逻辑

组件名
脚本组件(Script Component)

组件属性

details_script_component

属性描述
脚本文件(Script File)脚本文件路径

脚本实现

trigger.lua

function on_begin_play(script_component)
--param[in] script_component Script component object
local owner = script_component.GameObjectOwner
--Bind the current script to owner
nx_bind_script(owner, nx_current())
--Registering trigger events
nx_callback(owner, "on_trigger", "on_trigger")
end

function on_trigger(trigger_object, trigger_component, enter_object, enter_component, enter)
--param[in] trigger_object Trigger game object
--param[in] trigger_component Trigger component
--param[in] enter_object The game object that enters the trigger range
--param[in] enter_component The component object that enters the trigger range
--param[in] enter In or out of trigger range
end

如何创建一个凸包形状的触发器

可以通过制作一个触发器类型带有凸包碰撞的刚体文件(.nxx),并指定给模型组件的刚体文件(Rigid File)属性,来生成凸包形状的触发器。 刚体文件的制作方法可参照刚体编辑器文档或者碰撞体制作文档中介绍的方法进行导入或者制作。