1.动态生成NavMeshAgent可能无法吸附到NavMesh上
默认关闭NavMeshAgent,启用重力和碰撞盒,在FixedUpdate中打射线判定是否接触到地面,如果接触到地面就取消重力,并启用NavMeshAgent,NavMeshAgent在启用时isStopped会重置为false,需要手动变为true
private void FixedUpdate()
{
// 射线判断是否落地,关闭重力
if (selfRigid.useGravity)
{
if (Physics.Raycast(transform.position, Vector3.down, 1, 1 << LayerIndex.floorLayer))
{
selfRigid.useGravity = false;
navMeshAgent.enabled = true;
navMeshAgent.isStopped = true;
}
}
}
2.在一个物体周围随机位置放置NavMeshAgent
private Vector3 RandomMomPosition(Transform target, float range)
{
for (int i = 0; i < 100; i++)
{
float x = Random.Range(0.8f, 0.9f);
Vector3 randomPoint = target.transform.position + new Vector3((Random.Range(0, 1.0f) > 0.5f ? 1.0f : -1.0f) * x,
0, (Random.Range(0, 1.0f) > 0.5f ? 1.0f : -1.0f) * Mathf.Sqrt(1 - x * x)) * range;
NavMeshHit hit;
// 判断随机点周围x范围内是否有在NavMesh上的点,若没有则范围false
if (NavMesh.SamplePosition(randomPoint, out hit, 1.0f, NavMesh.AllAreas))
{
return hit.position;
}
}
}
3.摄像机跟随会出现抖动
解法1:
使用LateUpdate更新摄像机的位置,因为NavMeshAgent位置的更新是在LateUpdate中的
解法2:
使用navMeshAgent.nextPosition在FixedUpdate中更新人物位置并且在FixedUpdate中更新摄像机位置
4.将NavMeshAgent的位置赋值时会出现不对的效果,Agent并不在赋值点出现
解法:
先关闭NavMeshAgent,更新完位置后,停止几帧再启用
navMeshAgent.enabled = false;
transform.position = GameObject.Find("BirthPlace").transform.position;
// 使用协程停止2帧执行
Util.DelayExecuteWithFrame(2, () =>
{
navMeshAgent.enabled = true;
// 启用后将isStopped设置为true
navMeshAgent.isStopped = true;
});