unity3d 通过Nav Mesh Agent组件实现敌人巡逻以及有关“SetDestination”报错问题解决

首先展示效果:

在实现敌人自动巡逻这一块我们可以通过使用unity自带组件Nav Mesh Agent(导航网格代理),在省去冗杂的代码量的同时可便利的实现这一功能。

首先为敌人添加Nav Mesh Agent组件:

https://docs.unity.cn/cn/2018.4/Manual/class-NavMeshAgent.html

以上是unity官方手册上关于该组件的详细介绍,这里比较重要的就是Speed(移动速度),Angular Speed(旋转速度)以及Stopping Distance(接近目标距离多少即停止),这三个值需要按照自己需要设置,其余保持默认即可。

接下来上代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AIFindWay : MonoBehaviour
{
    public NavMeshAgent agent;
    public Transform[] Points;//通过数组形式可设置多个监测点
    int currentPoint;
    
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.SetDestination(Points[0].position);//通过Nav Mesh Agent组件的SetDestination 方法括号内为一个Vector3目标点
    }

    void Update()
    {
        if(agent.remainingDistance<agent.stoppingDistance)//到目标的剩余距离是否小于之前在 Inspector窗口中设置的停止距离
        {         
            currentPoint=(currentPoint+1)%Points.Length;//采用取余的方法实现敌人巡逻轨迹的循环
            agent.SetDestination(Points[currentPoint].position);
        }
    }
}

给角色添加脚本同时将Nev Mesh Agent拖拽进Agent

并且添加两个Point点,在Hierarchy面板上添加两个空物体,并且命名pos1,pos2,贴上标签方便摆放。

 

 这里也有一个需要注意,pos1,pos2的Y轴的值尽量与地面的Y轴贴近,不然导航的时候会出现角色乱走的情况。这里可能会有疑问,敌人的移动脚本??通过这个组件无需编写移动脚本,运动的速度转向等都在组件中设置即可,这里只需要添加一个带移动动画的敌人就可以了。当你运行,

 "GetRemainingDistance" can only be called on an active agent that has been placed on a NavMesh!

这个让人懵的错误要引入NavMesh的动态烘培的概念,首先将创建的所有地形及环境物体(带碰撞)全部存放到名为Environment的空物体同时进行以下操作:

在Inspector中下拉Static并选择Navigation Static:

 接下来点击Window->AI->Navigation出现以下面板:

Agent Radius(网格与地形边缘的距离)

Agent Height(可以通过的最大高度)

Max Slope(可以通过的最大坡度)

step Height(可以通过的最大梯度)

 Drop Height(允许下落距离)  Jump Height(允许跳跃距离)

一般使用默认的值点击Bake烘培即可,接下来出现:

 就完成敌人巡逻功能了,运行起来吧。