如何在OnTriggerEnter中获取GameObject子物体 解决Trigger下contacts无返回问题
Unity OnTriggerEnter 适配获取触发碰撞体方案
核心原因
OnCollisionXXX 事件的参数是Collision类型,包含碰撞点、受力、双方碰撞体等完整碰撞信息,因此可以读取contacts属性;
而OnTriggerXXX事件的参数是Collider类型,仅传入触发的对方碰撞体对象,没有原生的触点信息,也不直接提供己方触发的碰撞体引用,因此直接调用contacts属性会报错/无返回值。
适配方案
根据你的实际需求选择对应实现即可:
需求1:获取触发事件的对方子物体
直接读取传入的other参数即可,other就是触发碰撞的对方碰撞体,直接绑定对应子物体:
private void OnTriggerEnter(Collider other) { // 直接获取对方触发的子物体 GameObject targetChildObject = other.gameObject; // 后续自定义逻辑 }
需求2:获取己方触发的子碰撞体(等效原逻辑中的thisCollider)
有两种常用实现方案:
- 方案1:子物体挂载脚本(性能最优、准确率最高)
将触发逻辑脚本挂载在每个带Trigger碰撞体的子物体上,触发时直接读取自身组件即可:
// 此脚本挂载在每个带Trigger属性的子碰撞体所属GameObject上 private void OnTriggerEnter(Collider other) { Collider myCollider = GetComponent<Collider>(); // 后续自定义逻辑,如需通知父物体,直接调用父物体脚本对应方法即可 }
- 方案2:父物体统一管理脚本
如果需要把逻辑统一放在父物体脚本中,可以通过碰撞点最近匹配的方式定位己方触发的子碰撞体:
// 脚本挂载在父物体上 private Collider[] childTriggerColliders; private void Awake() { // 提前缓存所有子物体的Trigger碰撞体 childTriggerColliders = GetComponentsInChildren<Collider>(); } private void OnTriggerEnter(Collider other) { Collider triggeredMyCollider = null; float minDistance = float.MaxValue; // 先计算双方触发的近似碰撞点 Vector3 triggerContactPos = other.ClosestPoint(transform.position); // 遍历所有子碰撞体,找到距离碰撞点最近的即为触发的子碰撞体 foreach (var col in childTriggerColliders) { float currentDistance = Vector3.Distance(col.ClosestPoint(triggerContactPos), triggerContactPos); if (currentDistance < minDistance) { minDistance = currentDistance; triggeredMyCollider = col; } } // 此处triggeredMyCollider即为等效的thisCollider,可用于后续逻辑 }
注意事项
- 触发事件生效需要满足基础配置:至少一方挂载Rigidbody组件,用于触发的碰撞体勾选
IsTrigger属性。 - 存在多个碰撞体同时触发的场景时,只需在上述逻辑中加入距离阈值判断,筛选出所有符合条件的碰撞体即可。
内容的提问来源于stack exchange,提问作者parsi
相关产品推荐
相关产品推荐

