请选择 进入手机版 | 继续访问电脑版

[Unity3D]自动寻路/智能寻路

[复制链接]
冰宇 发表于 2020-12-31 18:58:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
[Unity3D]AI智能寻路精讲/对头自动避障寻路

在许多游戏中,对头经常要在复杂的地形中追着主角跑,因为场景中存在许多障碍物,所以对头的AI要足够智慧,才能找出到达目的点的最近蹊径,且绕开障碍物。写一个完善的寻路算法是比力有挑战性的,特别是在复杂的3D场景中,幸亏Unity提供了一个非常实用的寻路功能,只需要较少的代码即可实现复杂的寻路功能。
下面我将给各人先容如何去详细实现这个功能:
Unity的寻路系统分为两部门:
(1)一部门是对场景举行设置, 使其满意寻路算法的需求;
(2)设置寻路者。
1. 步调一
选择除对头和Player以外的所有场景模型,然后单击Inspcetor窗口Static 旁边的小三角形按钮显示出下拉列表,确认[Navigton Satic]被选中,Unity 将指导这样的模型用于寻路盘算,如图1-1所示。

[图1-1] 注:Cube(3)在这内里是对头模型,所以没有选上
2.步调二
在菜单栏中选择[ Window] -> [Navigation],打开Navigation窗口,如图2-1所示。

[图2-1] 注:在这里我们可以望见整个地形,除了障碍都被覆盖上了颜色,这里就是Unity帮我们盘算地形上的障碍,来指导对头模型用来自动寻路,如果场景里存在有没有勾选[Navigton Satic]的模型,纵然它在场景内里,Unity也会默认他不在场景中来对人物举行自动寻路,下面画两张图给各人表明:
1.场景内里所有场景模型都勾选了[Navigton Satic],对头将按照Unity对勾选[Navigton Satic]的场景模型举行盘算,寻找最短蹊径:

2.场景内里有部门模型没有勾选[Navigton Satic],Unity就会默认这个位置不会存在场景模型,然后按照不存在这个模型来盘算最短隔断,(蓝色部门的场景模型就是没有勾选[[Navigton Satic],Unity在盘算最短蹊径时就会默认他们不存在)

这也就表明白为什么有的同学在更新一下场景模型后,AI自动寻路就不灵了,出现了卡墙等情况,原因大多是更新场景后没有对场景举行重新烘焙,所以在每次更新场景后都要重新做一下步调一和步调二,否则就会出现上述情况
打开Navigation窗口后,在Navigation面板下找到Bake,其面板如下:

Bake窗口主要是界说地形对寻路的影响:
●Agent Radius和Height可以明白为寻路者的半径和高度。
●Max Slope是最大坡度,凌驾这个坡度寻路者则无法通过。
●Step Height是楼梯的最大高度,凌驾这个高度寻路者则无法通过。
●DropHeight表现寻路者可以跳落的高度极限。
●Jump Distance表现寻路者的跳跃隔断极限。
各人可以根据自己的需求举行适当修改
3.步调三
在Navigation窗口中设置好选项后,单击[Bake]按钮对地形举行盘算(如果场景比力多,那盘算的时间会稍微长一点,进度可以看右下角的进度条,待烘焙完成后再举行下一步操纵),单击[Clear]按钮会清除盘算效果。Bake出来的寻路数据,会被保存为一个文件,名为NavMesh.asset,当前关卡相关联,这一点与Lightmap很像。
接下来设置寻路者,也就是游戏中的对头
4.步调四
将自己准备好的对头模型拖入场景中

为了方便我直接用的一个长方形作为了对头,并给他添加了血条
5.步调五
在菜单栏中选择[Component]一[Nav Mesh Agent],将寻路组件指定给对头。然后在Inspector窗口中举行进一步的设置, Speed 是最大运动速度,Angular Speed 是最大旋转速度,如图[5-1]所示。在Agent Type中选择[Open Agent Settings], 可以打Navigation的Agents窗口,设置Radius和Height,表现寻路者的半径和高度,如图[5-2]所示。

[图5-1]

[图5-2]
6.步调六
创建脚本AI.cs,添加代码如下:
  1. using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.AI;public class AI : MonoBehaviour{private Transform target;   //设置追踪目的的位置    public float MoveSpeed=2.5f; //对头移动速度    private NavMeshAgent navMeshAgent;  //设置寻路组件    void Start()    {        target = GameObject.FindWithTag("Player").transform;  //获取游戏中主角的位置,在我的工程内里主角的标签是Player        navMeshAgent = GetComponent();        navMeshAgent.speed = MoveSpeed;  //设置寻路器的行走速度        if (navMeshAgent == null)         {            navMeshAgent = gameObject.AddComponent();        }    }    void Update()    {        navMeshAgent.SetDestination(target.transform.position); //设置寻路目的    }}
复制代码
这是对头的脚本。在Sart函数中获得NaMesAgen组件,然后调用SeDestination函数设置一个目的点,即可自动追击主角。如果希望自行控制移动,可以使用CalculatePath函数盘算出路径,然后按路径节点移动。我找了一篇博客作为参考:
CalculatePath函数盘算出路径来举行寻路的链接参考
在这里我就不作过多说明白,想详细相识的同学可以自己去查一下。
在运行之前检察主角的标签是否为Player,如果不是就要举行更改:

7.步调七
将脚本AI.cs给指定对头,运行游戏,对头会找出最短路径向主角位置前进:

觉得有帮助的话就点个赞吧O(∩_∩)O,日后还会更新许多有关于Unity3D的干货内容,跟多内容可以检察我的顶置博客,在那边我会将我的所有文章总和,便于各人查找,防止迷路,各人可以点点关注,谢谢各人的支持!

来源:https://blog.csdn.net/Z_hongli/article/details/111941378
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )