关于 “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天,终于在国外论坛上看到真正的解决方案了。
常规解决方案:
- 检查场景是否烘焙。
- 检查目标或自己是否位于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("...");
}
如果常规方法没解决,且寻路是时好时坏,对象和自己均是代码生成的,那八九不离十肯定碰到了我碰到的问题。
解决方法很简单:
在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;
}
Laravel在使用model的时候,总是会自动加S,导致错误的解决方法
很简单的处理方式,只要在model里指定表名就可以了。
class XX extend Model{
public $table='tableName';
//...
}