问题
最近使用
NavMeshAgent
做怪物自动寻路和攻击功能项目运行报错"SetDestination can only be called on an active agent that has been placed on a NavMesh"
,怪物可以跑和攻击,但是不能移动追击敌人。
前提条件
我的项目中地图和怪物都是动态生成,
NavMesh
寻路网格也是动态烘培的。
解决
常规解决方案
- 检查地图是否烘焙,若没有寻路网格,在
Nagation
窗口手动bake下地图。- 检查怪物或者主角是否位于
Navmesh
寻路网格范围内。- 尝试使用
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("..."); }
如果说以上方案都未解决你的问题,那你的情况就和我遇到情况相同了,解决方案也很简单:
- 怪物或者主角在
Start()
方法中动态生成的,将物体身上的Nav Mesh Agent
组件取消勾选,在脚本中添加代码void Start() { GetComponent<NavMeshAgent>().enabled = true; }
- 若怪物和主角在
Awake()
方法中动态生成,在脚本中生成物体时,为物体动态添加Nav Mesh Agent
组件private NavMeshAgent _agent; void Awake () { _agent= this.gameObject.AddComponent<NavMeshAgent> (); } void Start () { _agent.enabled = true; }