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

Unity继承类OnEnemyColliderEnter未触发的问题排查求助

Unity 敌人碰撞检测未触发问题排查建议
  • 检查碰撞器组件配置

    • 敌人和箭头必须都挂载Collider组件(如BoxCollider、SphereCollider),且Is Trigger不能勾选——因为你用的是基于物理碰撞的逻辑,触发器模式会走OnTriggerEnter而非碰撞回调
    • 确认碰撞器的范围完全覆盖敌人模型,避免箭头视觉上击中但实际没触发碰撞器
  • 修正方法触发逻辑

    • OnEnemyColliderEnter是自定义方法,Unity不会自动调用它。必须在基类中先监听原生的OnCollisionEnter回调,再手动触发你的自定义方法:
      void OnCollisionEnter(Collision col)
      {
          if (col.gameObject.CompareTag("Arrow"))
          {
              OnEnemyColliderEnter(col);
          }
      }
      
      public virtual void OnEnemyColliderEnter(Collision col)
      {
          // 基类碰撞逻辑
      }
      
    • 派生类重写时必须用override关键字,不要直接定义同名方法导致隐藏基类逻辑
  • 核对Rigidbody设置

    • 敌人的Rigidbody不能勾选Is Kinematic——勾选后会禁用物理碰撞检测,除非你刻意用触发器逻辑
    • 箭头的Rigidbody要确保有足够的速度或开启重力,保证碰撞时能触发物理交互(地面逻辑正常的话,箭头的Rigidbody大概率没问题,但可以再确认)
  • 检查层碰撞矩阵

    • 打开Edit > Project Settings > Physics,查看Layer Collision Matrix,确认Enemy层和Arrow层的碰撞权限是开启的——如果层之间被设置为不能碰撞,标签再正确也没用
    • 再次核对标签拼写,比如"Arrow"和"Enemy"的大小写是否完全匹配
  • 加日志调试定位问题

    • 在敌人的OnCollisionEnter里加日志,确认是否接收到碰撞事件:
      void OnCollisionEnter(Collision col)
      {
          Debug.Log($"碰撞对象:{col.gameObject.name},标签:{col.gameObject.tag}");
      }
      
    • 如果日志没输出,说明物理碰撞根本没触发;如果有输出但没调用OnEnemyColliderEnter,就是自定义方法的调用逻辑出了问题
  • 派生类重写检查

    • 如果EnemyCrocodile重写了OnEnemyColliderEnter,记得加base.OnEnemyColliderEnter(col),否则基类的逻辑不会被执行

内容的提问来源于stack exchange,提问作者難波八郎

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:04:58