You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中onCollisionEnter()方法大小写错误及碰撞检测失效问题

Unity碰撞检测OnCollisionEnter不触发的问题解决

一、函数签名的核心错误

Unity的碰撞回调函数必须严格遵循固定签名,你的代码存在两个关键错误:

  1. 函数名大小写/拼写错误:Unity消息系统只识别大驼峰开头的OnCollisionEnter,小写开头的onCollisionEnter不会被自动调用;而OnColliosnEnter是拼写错误(Collision拼写有误),自然也无法被识别。
  2. 参数类型错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:02