月份:2020年4月

关于 “SetDestination can only be called on an active agent that has been placed on a NavMesh” 真正的解决方案

最近碰到了 "SetDestination can only be called on an active agent that has been placed on a NavMesh" 的问题,关键点不在于不会用Navmesh,而是真的他就这么报错了。

找了很多办法,耗时1天,终于在国外论坛上看到真正的解决方案了。

常规解决方案:

  1. 检查场景是否烘焙。
  2. 检查目标或自己是否位于navmesh上,不是在半空。
  3. 尝试使用NavMesh.SamplePosition方法。
    GameObject go = new GameObject("Target");
    Vector3 sourcePostion = new Vector3( 100, 20, 100 );//The position you want to place your agent
    NavMeshHit closestHit;
    if( NavMesh.SamplePosition(  sourcePostion, out closestHit, 500, 1 ) ){
      go.transform.position = closestHit.position;
      go.AddComponent<NavMeshAgent>();
      //TODO
    }
    else{
      Debug.Log("...");
    }

如果常规方法没解决,且寻路是时好时坏,对象和自己均是代码生成的,那八九不离十肯定碰到了我碰到的问题。
解决方法很简单:
在prefab里就添加了NavMeshAgent组件的,把他勾掉,然后在物体的start里面agent.enabled = true;
如果是在awake代码生成的,AddComponent后把enabled设置成false,然后在物体的start里面agent.enabled = true;

示例:

void Awake () {
    // 添加寻路组件
    agent = this.gameObject.AddComponent<NavMeshAgent> ();
    agent.speed = 3.5f;
    agent.enabled = false;
    // ...
}

// Use this for initialization
void Start () {
    agent.enabled = true;
}