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

Unity2D中NavMesh AI碰撞后无法销毁生成的隐形对象问题求助

问题根因与解决方案

核心问题1:物理体系不匹配

你当前混用了2D和3D的物理接口:

  • 生成对象时使用的是Physics.Raycast(3D物理体系接口),说明场景用的是3D物理规则
  • 挂载在AI上的碰撞回调是OnCollisionEnter2D(2D物理体系回调),完全不会被3D物理事件触发,所以对象不会被销毁

核心问题2:AI路径被阻挡

生成的隐形对象带有实体碰撞体,会被NavMesh识别为静态障碍物,阻挡AI行进路线,所以AI会卡在对象位置


具体修复步骤
  • 替换AI上的碰撞回调代码:
// 如果用实体碰撞,用这个回调
void OnCollisionEnter(Collision col) 
{
    Debug.Log("Collision Detected: " + col.gameObject.name);
    if (col.gameObject.name == "Spawnmovement") 
    {
        Destroy(col.gameObject);
    }  
}

// 更推荐用触发检测,不会物理阻挡AI,回调用这个
void OnTriggerEnter(Collider other) 
{
    Debug.Log("Trigger Detected: " + other.gameObject.name);
    if (other.gameObject.name == "Spawnmovement") 
    {
        Destroy(other.gameObject);
    }  
}
  • 调整组件配置:
    • AI对象必须挂载3D Collider组件,以及3D Rigidbody组件(不需要物理受力可勾选Is Kinematic)
    • 生成的隐形对象预制体必须挂载3D Collider组件,如果用触发检测需勾选Is Trigger
  • 修复对象名称匹配问题:
    你生成的对象默认名称是预制体名(Clone),如果预制体本身名称不是Spawnmovement,需要在生成时手动指定名称,修改SpawnAtMousePos方法:
if (Physics.Raycast(ray, out hit))
{
    GameObject spawnedObj = Instantiate(cubePrefab, hit.point, Quaternion.identity);
    spawnedObj.name = "Spawnmovement";
}
  • 优化NavMesh路径适配:
    如果不用触发模式,可给隐形对象添加NavMesh Obstacle组件,勾选Carve选项,生成对象时会动态更新NavMesh路径,避免AI卡路

内容的提问来源于stack exchange,提问作者RieL Hatsune

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 22:30:01