Unity中onCollisionEnter()方法大小写错误及碰撞检测失效问题
Unity碰撞检测OnCollisionEnter不触发的问题解决
一、函数签名的核心错误
Unity的碰撞回调函数必须严格遵循固定签名,你的代码存在两个关键错误:
- 函数名大小写/拼写错误:Unity消息系统只识别大驼峰开头的
OnCollisionEnter,小写开头的onCollisionEnter不会被自动调用;而OnColliosnEnter是拼写错误(Collision拼写有误),自然也无法被识别。 - 参数类型错误:
OnCollisionEnter的参数必须是Collision类型,而非Collider——这就是你遇到“签名不正确”提示的原因。
二、碰撞触发的必要前提
即使函数签名正确,以下条件未满足也会导致碰撞不触发:
- 参与碰撞的两个物体都必须添加Collider组件,且至少有一个物体是非静态的
- 其中一个物体必须带有Rigidbody组件:如果是静态物体,Rigidbody可开启
Is Kinematic;动态物体必须使用非Kinematic的Rigidbody - 两个物体的Collider组件都不能勾选Is Trigger(若勾选则需改用
OnTriggerEnter回调) - 检查
Edit > Project Settings > Physics中的碰撞矩阵,确保两个物体所在Layer未被设置为忽略碰撞
三、修正后的代码示例
public class MoveToTarget : Agent { [SerializeField] private GameObject target; [SerializeField] private GameObject walls; // 正确的碰撞回调签名 private void OnCollisionEnter(Collision collision) { // 推荐用Tag代替Name判断,更稳定(需先给Target和Walls设置对应Tag) if (collision.gameObject.CompareTag("Target")) { AddReward(10); EndEpisode(); } else if (collision.gameObject.CompareTag("Walls")) { AddReward(-2); EndEpisode(); } } }
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

