一、什么是寻路?
寻路顾名思义就是:角色在到达指定地点的过程中遇到障碍物会自动避开并自行选取最短的路程进行移动。
大多数的游戏中都会有自动越过障碍物与自动寻路的功能,点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。
二、使用寻路的方法:
第一种比较传统的是使用A星寻路插件,它是一种比较传统的人工智能算法,在Unity还没有Navigation寻路系统的时候最常被使用的一种方法
第二种就是通过Unity自带的Navigation寻路系统,添加脚本控制角色的自动避让障碍物和寻路
自动避让障碍物
一、添加一块Plane地板和一个胶囊体 Capsule(作为角色Player),给胶囊体添加Character Controller角色控制器 , 在Mesh F的Mesh改为None后会发现,胶囊体变成了一个如鸟笼般的网格状物体,这便是角色控制器。
image.png二、添加一块Cube拉升后变成一面墙体,我们要实现的功能就是点击对面的地面,胶囊体可以绕过墙到达指定地点
image.png三、在Window中添加Navigation
image.png四、给角色添加Nav Mesh Agent
image.png五、将Plane和Cube的static勾选为两个Static
image.png六、给角色(胶囊体)添加脚本控制移动
public class Movenine_Test : MonoBehaviour {
private NavMeshAgent agent;
void Start () {
agent = transform.GetComponent<NavMeshAgent>();
}
void Update () {
if (Input.GetMouseButtonDown(0))
{
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(r, out hit))
{
if (!hit.collider.name.Equals("Player"))
{
Vector3 p = hit.point;
agent.SetDestination(p);
}
}
}
}
}
七、给Cube和面板进行烘焙
image.png八、给面板的tag更改为Player(因为在角色的脚本中判断了对象的.name.Equals是否为“Player”)
image.png现在点击播放,这时就能实现物体在进行移动到达指定地点的途中遇到障碍物会自动避让了
3912807-019724bf2ff1694b.gif自动寻路
在原有的基础上再复制一块Plane面板,将Bake下的Jump Distance和Drop height更改数值(根据制作的面板的距离自行更改)进行烘焙
(注意如果不是复制的Plane面板而是重新创建的话,需要注意新面板的Static、Tag是否为Player和是否勾选Object)
image.png
image.png
3912807-3a57f731dab7a2ae.gif
网友评论