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烘培即可,接下来出现:
就完成敌人巡逻功能了,运行起来吧。