Unity3D 构建无人机AI状态机!

Find AI Tools
No difficulty
No complicated process
Find ai tools

Unity3D 构建无人机AI状态机!

目录

  • 引言 🌟
  • AI系统与建造 🤖
  • 旧的构建方式 💪
  • 更高效的构建方式 🚀
  • 基本控制系统 💡
  • 基本控制系统代码解析 📝
  • 构建更先进的状态机 ⚙️
  • 状态机设计模式 🌀
  • 状态机实现代码详解 🔍
  • 数据驱动的AI设计 ✨

引言 🌟

大家好,我是Jason。今天我们要讨论的是人工智能(AI)和构建AI系统。我们将介绍构建状态机和使无人机互相战斗的过程。首先,我将展示一些我过去构建这些系统的简单且不太高效的方式,然后我将展示如何以更可扩展的方式构建它们,以便您可以轻松地将其集成到自己的项目中,并在未来使用。这就是我们要达到的目标,我们将让无人机四处徘徊、互相战斗并互相摧毁,但首先,我想从一些简单的事情开始,即以初学者的方式或我用来构建所有AI的方式。那么现在,这就是我们最终的目标。我们将有一些无人机四处游荡,寻找彼此,最终会有一架无人机杀死另一架。现在让我们看看这一切是如何工作的。在这里,我们有两架无人机,每架无人机只有一个无人机脚本和一个球体碰撞器。对于无人机来说,非常重要的是它们具有这些碰撞器,层仅设置为默认、没有特殊设置,然后我们在其下方放置一个无人机模型,我将转到该模型,只需在场景视图中按F以聚焦它。模型之所以存在,只是为了保持模型面向前方,偏移有点不正确,90度不正确,所以我只是旋转并使父物体成为实际的无人机,使模型成为子物体,这样它的旋转就正确了。你可以在这里看到旋转,90和90,基本上就是这样,这只是另一个用于可视化的层,我在很多项目中都有它,几乎所有的项目都喜欢将可视部分放在底部,以使其与我们实际的机器人、AI和控制它的东西彻底分离。这次只有在无人机上有一个球体碰撞器和无人机脚本,无人机脚本有一个团队选项和一个层掩码,该层掩码实际上是为这些墙使用的,只是为了它们不会撞进墙里,在代码的另一个版本中,我们不会真的给无人机分配这个,但是如果我们使用一个简单的解决方案,我想显示一下它是如何工作的,那么现在让我们打开无人机脚本,并看看它是如何工作的。

AI系统与建造 🤖

在无人机脚本中,我想首先指出的是我们看到的两个序列化字段,即层掩码和团队。这些仅用于方便地进行分配,其中一个无人机为蓝色,另一个为红色,并且可以以一种方便且快速的方式设置层掩码,我们在最终项目中不会这样做。现在让我们看看一些私有字段,我们有一个攻击范围,我们希望能够调整阵列距离和停止距离,现在我不是很喜欢这些硬编码,但是根据我们的简单解决方案,我想展示一下如何清理它并使其变得更好,稍后我们将会进行详细的讨论,然后我们有几个私有字段用于目标和旋转方面,所以我们可以想象这是我们的无人机希望移动到的位置。这是如果我们想要转向,但是不想进行瞬时旋转,这就是我正在朝前看,我知道我想朝右边看,这将是我想朝右边旋转的方向,最终我会慢慢朝那个方向看,方向。这只是我们想走的方向,以矢量格式而不是四元数,你会看到为什么我们需要它在一会儿,我们的无人机目标,这是如果一个无人机找到了一架敌机并且想追踪另一架无人机,我们标记了它作为目标,它会一直跟随它们,然后,我们有一个状态,我们有无人机状态编号和我们在这里标记我们的当前状态,这只是为了跟踪无人机所处的状态以及它正在做什么,现在让我们看看无人机状态,我想先查看所有三个选项,所以我将按住Ctrl并单击到底部的文件,这是一个相当长的文件,我这里有170行,但是我们有三个状态,我们有漫游状态,我们有追逐状态和攻击状态,现在让我们看看它们是如何工作的,如果我们进入我们的更新方法,一个不错的大类,我们可以看到这个转换语句,这是控制AI和游戏状态的一种常见方式,我几乎总是使用它,直到最近,我们将要讨论下一个方式,但是首先我想展示一下设置它的简单方式以及以前我是如何组装它们的,所以我们的第一个转换语句或者我们开关状态中的第一个案例修改了漫游状态并且会默认成为初始值,因为它是我们枚举中的第一个值,如果我们实际上回到了游动,我们将检查是否需要新的目标,如果需要,我们只需调用这个获取目标,它会发现我们前方的一个随机点,所以我们看一下我们的当前位置增加一些方向,前进一些方向在四中,或者在前进的四中,为了得到在我们前方的某个随机点,我们设置其作为目标,获取方向然后我们也得到期望的旋转,这将会使我们慢慢转向那个方向,你马上就能看到我们在什么时候使用它,但是我们返回到更新,我们把旋转直接设置为所需的旋转所以这里我们实际上没有进行慢慢旋转,我们将不得不在此处添加它,然后我们使用矢量三点的前面乘以时间点当前秒绕着某个因子进行缩放以减慢它并使它与帧速率无关是非常重要的所以我们使用这个矢量绕着这个矢量进行平移,然后我们绘制一个射线,就像上面说的,你总是看到红色,因为我们转得太快了,在32行,所以它永远不会停留在红色上,然后我们检查路径是否仍然被阻挡,我只是弹出一个日志消息,以便我可以看到发生了什么,然后尝试获取一个新的目标,现在重要的是要注意,这种方式并不高效,这不是一个非常干净,高效的方式,我们检查’路径是否被阻挡’两次,我们做了这个目标的事情,我们可能只需在这个需要目标的检查中去检查路径是否被阻挡,稍微简化一下事情,所以我只想指出并注意到,这里的代码是糟糕的版本,这不是优化得很好的版本,所以我们在这里写下这些没有效率的代码现在,我们在这个新款的无人机版本,你看到它们四条徘徊,奔跑,最终其中一架飞机会看到另一架飞机,开始追击,实际上,让我们只是复制这两架无人机几次很不错,我们可以在运行的时候随意复制几架飞机,最终我们的旧版本无人机会开始追赶 当然,最后一个制造出来的机器会死掉,所以希望你看到了这一点,非常快发生在这里,我让他们跑了一会,然后我们就开始看见后者这里就会显示了我们将会继续下去,然后它死了所以希望你看到了这一点很快发生的好吧,现在我们先停下来,我最后想看的就是播放之前,最后的一件事是要检查攻击状态,再次返回,最后是攻击状态,如果我们进入了攻击范围的某个点,我们可以返回去看最早的无人机,发射武器所做的事情很简单,它打开了激光器,将其放在正确的位置并摧毁了敌人,实际上只是完全摧毁了那个对象,如果它正在造成伤害,我们可以让它在这里造成伤害,也许敌人正在逃跑,需要有一个方法来远离我们,我们可以检查距离然后切换回追击状态,然后我们就可以在这里轻松地做到这一点了,我只是想非常简要地谈谈如何以数据驱动的方式实现这一点,因为这一切最终都将汇集在一起,并在您的设计师需要从数据源读取这些数据时工作让我们再次回到无人机,不是这一个,来到这个场景上让我们看看我们是如何设置这一切的,因为在构建一个简单的游戏和大多数游戏中,这种工作方式都是非常适用的,如果您的游戏不需要经常更改数据或者不是一个非常大的游戏,那么将所有这些东西都放到代码中并在编辑器中完成它完全没有问题,但是如果您的游戏需要从数据源读取这些东西并且需要大量的AI和不同的状态机,或者只是在不同的东西上都需要它们在这个地方,您可能希望将其放入数据存储区域,比如我之前说的JSON存储区域或者SQL服务器之类的地方,你要做的就是在这里设置所有这些东西,正如我刚才所说的,我们正在设置这些漫游状态、追击状态和攻击状态,然后我们添加这些状态,但是如果我们替换这些状态,如果我们说,嘿,这种类型的东西并不攻击,它只是追逐,徘徊,也许它会随机跳舞,它会有一个随机跳舞的漫游状态和一个跳舞状态,它们之间会循环,我们可能不想在代码中定义它们,而只是在枚举中这样做,所以它看起来更整洁,容易理解,并且对于绝大多数程序员来说,他们看到这个会说,好,我差不多明白它是如何工作的,如果他们了解状态机是如何工作的,以及转换是如何工作的,一旦你掌握了这一点,理解你特定实现的细节就会变得更容易,你可以告诉这里发生了什么,我可以很容易地看出来,比起刚才那个无人机脚本,它要容易得多,我认为大多数程序员看到这个,他们会说,嗯,我有些明白这是在做什么,如果他们知道状态机是如何工作的,并且了解转换是如何工作的,一旦你掌握了这一点,理解你特定实现的细节就会更容易,你可以告诉这里发生了什么,我可以很容易地看出来,比起刚才那个无人机脚本,它要容易得多,我认为大多数程序员看到这个,他们会说,嗯,我有些明白这是在做什么,我所犯的错误,我认为最终会这样,你开始添加了一些额外的功能,它们将要出现,比如说它漫游的情况下所做的一切会更多,那么它可能会变得更加复杂,另一件值得注意的事情是,这里不再需要其他序列化字段,所以我们不再需要在这里设置它们,我们可以在构造函数中直接完成,如果我们在游戏物体中将其放置在这里,我们会得到一个错误,说我们无法在monobehaviour中初始化它,因为它只是一个普通的类,没有问题,我们也没有其他的序列化字段,所以我们无法访问这些东西,但我们可以访问的是游戏设置,我只是想指出这一点,因为在许多情况下,人们构建这些东西,他们说,嘿,我真的一直需要访问这些不同的变量,或者我一直发现自己遍布代码中的常量或其他东西,然后我不得不去更改常量并重新编译,我喜欢这样做的原因是我可以快速简单地访问这些变量或者使它们做一些事情,你可以看到,我可以轻松地调整这些值,甚至可以在运行时进行调整,这样既方便又容易,现在让我们停止播放并继续进行,我想简要谈谈如何以数据驱动的方式实现这一切,就像我之前说的,这一切最终都会汇集在一起,并在你的设计师需要从数据源读取这些数据时发挥作用,让我们再次回到无人机,而不是这一个,在这里,如果我们看一下不是这一个,来到这首先,让我们看看我们如何设置这一切,因为在构建一个简单的游戏和大多数游戏中,这种工作方式都是非常适用的,如果您的游戏不需要经常更改数据或者不是一个非常大的游戏,那么将所有这些东西都放到代码中并在编辑器中完成它完全没有问题,但是如果您的游戏需要从数据源读取这些东西并且需要大量的AI和不同的状态机,或者只是在不同的东西上都需要它们在这个地方,您可能希望将其放入数据存储区域,比如我之前说的JSON存储区域或者SQL服务器之类的地方,你要做的就是在这里设置所有这些东西,正如我刚才所说的,我们正在设置这些漫游状态、追击状态和攻击状态,然后我们添加这些状态,但是如果我们替换这些状态,这种类型的一个东西并不会攻击,它只是追随它,潜伏,也许我们希望它有一种随机跳舞的能力,这就是,潜伏,也许它会随机跳舞,它会有一个随机跳舞的漫游状态和一个跳舞状态,他们之间会发生变化,我们可能不想在代码中定义它们,而只是在枚举中这样做,这样看起来更整洁,更容易理解,在大多数程序员看来,当他们看到这个时,他们会说,嗯,我差不多懂得这是在干什么,如果他们知道状态机是如何工作的,以及转换是如何工作的,一旦你掌握了这一点,理解你特定实现的细节就会变得更容易,你可以告诉这里发生了什么,我可以很容易地看出来,比起刚才那个无人机脚本,它要容易得多,我说的最后一件事是,在这个简单的例子中,我们可以将这些东西放入代码,使用它们来设置我们的无人机,即使我们只使用固定的三个状态,我们只会设置一两个初始值,我们会看到,即使是这样的情况下,在反射视频中,您将看到如何以更通用、更可定制的方式设置这些状态,进行动画处理,即时加载更改,并根据枚举或其他内容获取不同的状态。我希望这个视频对你有所帮助。如果你喜欢这种深入的学习方式,如果你想更多了解,请确保点赞、分享视频,甚至只是留下一个评论,让我知道。我非常喜欢做这些,但我只是想确保其他人也对这些感兴趣。再次特别感谢支持我的每一个Patreon、Discord和其他地方的人们,大家好,再见。

Most people like

Are you spending too much time looking for ai tools?
App rating
4.9
AI Tools
100k+
Trusted Users
5000+
WHY YOU SHOULD CHOOSE TOOLIFY

TOOLIFY is the best ai tool source.