Unity中OnCollisionEnter碰撞回调未触发问题求助
Unity碰撞检测OnCollisionEnter不触发故障排查
问题描述
- 实现对象碰撞检测逻辑时,
OnCollisionEnter回调始终无法触发 - 参与碰撞的两个对象均已挂载Rigidbody、Box Collider组件,两个碰撞体的
isTrigger属性均未勾选 - 初步怀疑故障和代码中
AddForce方法调用有关,无法定位具体根因
关联实现代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Cuplat2 : MonoBehaviour { public Vector3 Target = new Vector3(); private Rigidbody rb; public float thrust; private void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { Vector3 NewPosition = transform.position + Target; Vector3 Position = transform.position; if (transform.position.x < Target.x) { rb.AddForce(transform.position * thrust); } else { //rb.isKinematic = true; } } public void OnCollisionEnter(Collision collision) { Debug.Log("stop"); if (collision.gameObject.name == "Cupla T2") { Debug.Log("stop"); } } }
配置参考

故障排查方向
- 加力逻辑错误:当前代码
rb.AddForce(transform.position * thrust)施加的力方向是世界原点指向物体当前位置,并非朝向Target点的方向,大概率物体根本没有向另一个碰撞体移动,两者未产生实际碰撞接触自然不会触发回调。正确朝向目标点加力的写法应该取目标方向向量:rb.AddForce((Target - transform.position).normalized * thrust); - Rigidbody参数校验:碰撞触发要求两个碰撞对象中至少有一个Rigidbody关闭
isKinematic属性,如果你后续取消注释代码里的rb.isKinematic = true,且另一个碰撞体也开启运动学模式,碰撞事件将完全不触发。如果物体移动速度较快,把Rigidbody的Collision Detection属性从Discrete改成Continuous,避免高速穿透导致碰撞不触发。 - 基础配置校验:
- 确认
Cuplat2脚本直接挂载在带碰撞体、Rigidbody的活动对象上,不要挂载到空物体或者未激活的子节点上 - 打开Edit > Project Settings > Physics面板,检查两个碰撞对象所在的层,在层碰撞矩阵中是否勾选了层间碰撞许可
- 检查两个Box Collider的Size、Center参数配置,确认碰撞体尺寸和模型匹配,没有因为碰撞体过小导致接触判定失效
- 确认
- 函数签名校验:
OnCollisionEnter是Unity生命周期反射调用的方法,要保证函数名拼写完全正确、参数类型为Collision,不要误写成参数是Collider类型的触发器回调,不要给方法加静态修饰符。
内容的提问来源于stack exchange,提问作者Rus Gabriela
相关产品推荐
相关产品推荐

