[Unity3D]AI智能寻路精讲/敌人自动避障寻路_unity自动寻路躲避障碍-程序员宅基地

技术标签: c#  unity  Unity3D  游戏  Fps游戏  

[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,添加代码如下:

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>();
        navMeshAgent.speed = MoveSpeed;  //设置寻路器的行走速度
        if (navMeshAgent == null) 
        {
    
            navMeshAgent = gameObject.AddComponent<NavMeshAgent>();
        }
    }


    void Update()
    {
    
        navMeshAgent.SetDestination(target.transform.position); //设置寻路目标
    }
}

这是敌人的脚本。在Sart函数中获得NaMesAgen组件,然后调用SeDestination函数设置一个目标点,即可自动追击主角。如果希望自行控制移动,可以使用CalculatePath函数计算出路径,然后按路径节点移动。我找了一篇博客作为参考:

CalculatePath函数计算出路径来进行寻路的链接参考

在这里我就不作过多说明了,想详细了解的同学可以自己去查一下。

在运行之前查看主角的标签是否为Player,如果不是就要进行更改:
在这里插入图片描述

7.步骤七
将脚本AI.cs给指定敌人,运行游戏,敌人会找出最短路径向主角位置前进:
在这里插入图片描述
觉得有帮助的话就点个赞吧O(∩_∩)O,日后还会更新很多有关于Unity3D的干货内容,跟多内容可以查看我的顶置博客,在那里我会将我的所有文章总和,便于大家查找,防止迷路,大家可以点点关注,谢谢大家的支持!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Z_hongli/article/details/111941378

智能推荐

JSP指令详解(三大指令)_jsp中memory.giveteststring()是什么意思-程序员宅基地

文章浏览阅读836次。JSP 指令是为 JSP 引擎(比如 Tomcat)而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理 JSP 页面中的其余部分。_jsp中memory.giveteststring()是什么意思

机器学习-KL散度的直观理解+代码_前向kl和反向kl拟合效果的二维多峰分布图解释-程序员宅基地

文章浏览阅读1.1k次,点赞23次,收藏25次。KL散度的含义_前向kl和反向kl拟合效果的二维多峰分布图解释

django 上传文件到数据库-程序员宅基地

文章浏览阅读486次。必备知识:https://docs.djangoproject.com/en/dev/ref/files/storage/#django.core.files.storage.FileSystemStorage https://docs.djangoproject.com/en/dev/ref/request-response/#django.http..._django文件从其他地方上传到数据库

清华教授说自己的女儿要做个普通人,可她没跟你说“学术可以近亲繁殖”_唯一能稳定遗传的就是财富九边-程序员宅基地

文章浏览阅读946次。转载自九边,九边的力作,符合九边一贯地教育人向上的。虽然博主人到中年,仍然在不断学习,通过以身作则教育孩子,不算逼迫,自认为算“引导”;对于博主来说,九边是博主仰望的。就想文中所说的,希望自己努力的同时,也能乘到风。这两天刘瑜的一篇演讲火了,一些小伙伴可能不知道这人,有那么几年这人挺活跃,写了一套《民主的细节》,我还看了,那时候觉得还不错,后来在美国生活了一段时间,实地体验后,发现她那几本书也同样充满文科知识分子的酸腐味。至于那个演讲,其实还是老调重弹:孩子压力太大,家长逼得太死,还是要给孩子喘息空间。_唯一能稳定遗传的就是财富九边

使用 /sys 文件系统访问 Linux 内核_/sys/devices/platform/serial8250/tty/ttys3/flags-程序员宅基地

文章浏览阅读1.9k次。导言:Linux 2.6驱动模型初看起来的复杂,估计让我们很多人生畏了,但,既然是对原来模型的改进,这种统一的模型自然有其独特的一面。去年暑假,对Linux驱动模型进行了一些的分析,似乎摸着其脉络,但又感觉没有找到入口和出口,于是也就搁置了,看到这篇文章,再次引起了兴趣,并知晓了更多的来去缘由,在此转载~~-------------------_/sys/devices/platform/serial8250/tty/ttys3/flags

一、网络爬虫入门-程序员宅基地

文章浏览阅读6.9k次,点赞47次,收藏57次。文章目录一、都有哪些爬虫?二、网络爬虫是否合法?1.引入库2.读入数据三 、网络爬虫的约束。四、python网络爬虫的流程。总结一、都有哪些爬虫?网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。搜索引擎(Search Engine),例如传统的通用搜索引擎baidu、Yahoo和Google等,是一种大型复杂的网络爬虫,属于通用性网络爬虫的范畴。但是通用性搜索引擎存在着一定的局限性_网络爬虫入门

随便推点

JAVA SM2 密钥生成 签名验签 【快速入门】_js java sm2 签名 验签-程序员宅基地

文章浏览阅读4.2w次,点赞15次,收藏116次。文章目录Before StartBuild with MavenQuickStart密钥对生成签名验签Before StartSM2算法使用请参考:《GMT 0009-2012 SM2密码算法使用规范 》在bouncycastle - 1.57版本之后,加入了对 我国的SM2、SM3、SM4算法的支持。Bouncycastle releasenotesBuild with Mave..._js java sm2 签名 验签

linux下keytool生成证书_keytool生成JKS证书的详细步骤及截图-程序员宅基地

文章浏览阅读1.2k次。注:防止有不必要的空格,尽量不要复制粘贴1、依据CFCA所提供的CN生成密钥存储文件和密钥对(创建JKS证书库)keytool-genkey-v-aliasslserver-keyalgRSA-keysize1024-keypass111111-dname"cn=duan,ou=某某科技公司,o=某某项目或部门,l=深圳,st=广东,c=cn"-keystoreD:\..._keytool下载linux

网络编程多播——Multicast_ip_multicast_if-程序员宅基地

文章浏览阅读1.7k次。网络编程多播——MulticastIP多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。通俗点讲,多播也称组播,大概可以理解为分组广播的意思,是介于单播和广播之间的一种通信机制,使用多播方式,可以实现对局域网内一组特定的主机进行通信,对局域网节点分组,加入该分组即可接收该分组的消息,而未加入分组则收不到消息。_ip_multicast_if

ch6 Page Replacement Algorithms-程序员宅基地

文章浏览阅读407次。文章目录Overviews功能与目标实验设置与评价方法局部页面置换算法最优页面置换算法先进先出置换算法最近最久未使用页面置换算法时钟页面置换算法二次机会算法最不常用置换算法Belady现象什么是stack算法为什么stack-based算法不会发生belady现象LRU / FIFO 和 Clock 的比较全局页面置换算法工作集模型常驻集工作集页面置换算法缺页率页面置换算法抖动问题Overviews功能与目标实验设置与评价方法局部页面算法最优页面置换算法先进先出算法最近最久未使用算法时钟_page replacement algorithms

[iuud8]cocos2dx编程中获得代码段执行时间,精确到毫秒级_cocoslua 毫秒级别-程序员宅基地

文章浏览阅读666次。在程序书写过程中,我们常常需要得到某一段代码的执行时间,来判断当前代码是否冗余,是否会消耗大量的系统资源,或者在资源加载的过程中,判断是那些资源消耗了大量的时间。在c++中,有一个活的时间的办法,但精度只到秒: struct timeval now; struct tm* time; gettimeofday(&now, NU_cocoslua 毫秒级别

计算机科学与技术可以考岩土工程师吗,岩土工程师考试难度大吗?通过率高不高?...-程序员宅基地

文章浏览阅读1.4k次。岩土工程师考试难度大吗?通过率高不高?2019-09-0317:46:32来源: 作者:zhangyinggui1//岩土工程师考试难度大吗?通过率高不高?注册岩土工程师是指岩土工程相关专业本科以上学历,报名参加注册岩土工程师考试。考试每门科目都及格。拿到证书的那一刻即可成为注册岩土工程师。注册岩土工程师考试分两阶段进行:第一阶段是基础考试,在考生大学本科毕业后按相应规定的年限进行,其目的是测试考..._计算机科学与技术可以考注册岩土吗

推荐文章

热门文章

相关标签