《Unity 3D人工智能编程》——2.6 使用有限状态机框架

简介:

本节书摘来自华章出版社《Unity 3D人工智能编程》一 书中的第2章,第2.6节,作者:(美)基奥(Kyaw,A.S.),(美)彼得斯(Peters,C.),(美)斯瑞(Swe,T.N.),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.6 使用有限状态机框架

我们要在这里用的有限状态机框架是一个改编过的C#框架,你可以在unifycommunity.com找到它。该框架是确定有限状态机框架的一部分,基于Eric Dybsend 所著的《Game Programming Gems 1》。在这里我们只关注这个有限状态机和我们之前的有限状态机的不同点。这个有限状态机的完整版可以在这本书附带的资源中找到。我们现在将要学习这个框架是如何工作的,并学习如何用它来实现我们的人工智能。
AdvanceFSM 和 FSMState是框架的两个主要的类。接下来我们看看它们吧。

2.6.1 AdvanceFSM类

AdvanceFSM类主要管理所有实现了的FSMState,并不断更新转换和当前状态。因此,在我们使用这个框架前,首先要做的事情就是声明我们的人工智能坦克计划实现的转换和状态。
AdvancedFSM.cs文件中的代码如下所示:

3a1a6acfaa926859ccf74999ece6f48c70b43067

它有一个列表对象来存储FSMState对象,还有两个局部变量来存储FSMState类的当前ID,以及FSMState本身。

33b2d7b59edafea7f47652a6d38bc757cfb88b03

AddFSMState方法和DeleteState方法分别用来添加与删除列表中FSMState类的实体。在调用PerformTransition方法时,它会根据相应的转移来更新CurrentState 变量的状态。

2.6.2 FSMState类

FSMState类负责管理所有到其他状态的转移。它有一个叫做map的字典对象来存储所有转移和状态的键值对。例如 ,SawPlayer转移对应到Chasing状态,LostPlayer转移对应到Patrolling状态,等等。
FSMState.cs文件中的代码如下所示:

2e3030d36f3ffd36d365983963bb4164fb740730 eab5cdd817186f97c8ac2f8e23c5962d8109196f

AddTransition和DeleteTransition方法仅仅从它的状态–转换字典对象map中进行添加和删除。GetOutputState方法则从map对象中查找,并基于输入转换来返回状态。
该FSMState类还声明了两个抽象方法,它的子类需要实现这两个方法。如下所示:

Reason方法要检查当前状态是否需要转换到另一个状态。而Act方法则为currentState变量执行实际的任务,比如向目标点移动,然后追逐并攻击玩家。这两个方法都需要转换玩家和NPC实体的数据,而这些都可以通过FSMState类来获得。

2.6.3 状态类

与我们之前介绍的SimpleFSM例子不同,我们坦克的当前状态分别写入了继承自FSMState类的独立的类,比如AttackState、ChaseState、DeadState和PatrolState ,每个类都实现了Reason和Act方法。我们把PatrolState类拿出来,作为例子研究一下。
PatrolState类
PatrolState类有三个方法:构造函数、Reason方法和Act方法。PatrolState.cs文件中的代码如下所示:

2f047e60101c0b0067525267c5a380f1df8855b8 f0b1cf1ec4769f228268d8d8bbbd7d2fc6184613

构造函数方法将航点数组作为参数,并把它们存储在一个本地数组中,然后初始化它们的属性,如运动和旋转速度等。Reason方法检查它本身(人工智能坦克)和玩家坦克之间的距离。如果玩家坦克在一定范围内,它将使用NPCTankController类的SetTransition 方法,把转换ID设置为SawPlayer转移,如下所示:
NPCTankController.cs文件中的代码如下:

a1ba3c047a50b18020b48bc8071814cd91666a3d

它只是一个调用了AdvanceFSM类的PerformTransition方法的包装方法。此方法将CurrentState 变量更新为能响应Transition对象所对应的状态,并更新FSMState类中的状态–转移字典对象map。Act方法仅仅更新人工智能坦克的目标点,将坦克向目标点的方向旋转,然后向前移动。其他的状态类同样遵循这个模板,但是使用不同的reason和act程序。我们已经在前面简单的有限状态机例子中了解过它们,此处不再赘述了。看看你自己是否能够成功地设置这些类。如果在这个过程中遇到了困难,你可以在本书附带的资源中查看需要的代码。

2.6.4 NPCTankController 类

在我们的人工智能坦克中,NPCTankController类将继承自AdvanceFSM。以下是我们设置NPC坦克状态的类的方法:

41668619d876cb55b5956d508034583ce4c4e466 7b6d66bf6e2ba8ea2acacd8423cb7018654cb2b5

下面是我们的有限状态机框架美妙的地方。因为状态都是在相应的类中自我管理的,所以我们的NPCTankController 类只需要对当前工作的状态调用Reason方法和Act方法,这消除了我们写一长串if/else和switch语句的需要,即消除了臃肿的代码。现在取而代之的是,我们的状态恰好在各自的类中包装好。在更大型的项目中,随着状态数量的增长,以及状态之间的转换变得越来越复杂,我们的代码也将更加易于管理。

1c57243617ba622a2ea1f07dc44c3532ee1fc382

我们的框架就是这样工作的。简要地说,使用这个框架的主要步骤如下:
1)在AdvanceFSM类中声明转移和状态。
2)编写继承自FSMState类的状态类,并且实现Reason方法和Act方法。
3)编写继承自AdvanceFSM类的自定义的NPC人工智能类。
4)从State类创建状态,然后用FSMState类的AddTransition 方法将它们添加至转移和状态关联关系中。
5)使用AddFSMState方法将这些状态添加到AdvanceFSM类的状态列表中。
6)在游戏更新周期中,调用CurrentState变量的Reason方法和Act方法。
你可以在Unity中运行一下AdvancedFSM.scene。它将会以与前面的SimpleFSM例子一样的方式运行。但是现在的代码和类将变得更有条理且更易于管理。

相关文章
|
10天前
|
人工智能 自然语言处理 程序员
产品测评 | AI编程界的集大成者——通义灵码AI程序员
通义灵码AI程序员是阿里云推出的一款基于先进自然语言处理和深度学习技术的编程助手,集成于VS Code和JetBrains IDEs中。它覆盖从前端到后端的开发流程,支持多文件级别的代码修改、单元测试生成、多版本快照管理等高级功能,显著提升开发效率和项目管理能力。开发者可通过对话式交互完成需求理解到产品发布的全过程,实现高效敏捷开发。最新2.0版本在代码生成、跨语言编程、单元测试自动生成及图生代码等方面有显著提升,进一步优化了用户体验。
|
1月前
|
人工智能 自然语言处理 程序员
无编程经验小白如何玩转通义灵码 AI 程序员,让写代码像聊天一样简单
没有编程经验的小白如何玩转通义灵码 AI 程序员,让写代码像聊天一样简单
264 22
|
19天前
|
人工智能 自然语言处理 JavaScript
Aider:27.6K Star!这个终端AI编程神器能用语音改代码,自动生成Git记录并提交,接入DeepSeek斩获编程基准最高分
Aider 是一款基于命令行的开源 AI 编程助手,支持多种编程语言和主流 LLM,可自动完成代码修改、Git 提交及语音交互。
104 1
|
1月前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
1月前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
3月前
|
人工智能 自然语言处理 测试技术
DeepSeek V3:DeepSeek 开源的最新多模态 AI 模型,编程能力超越Claude,生成速度提升至 60 TPS
DeepSeek V3 是深度求索公司开源的最新 AI 模型,采用混合专家架构,具备强大的编程和多语言处理能力,性能超越多个竞争对手。
959 5
DeepSeek V3:DeepSeek 开源的最新多模态 AI 模型,编程能力超越Claude,生成速度提升至 60 TPS
|
2月前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
104 0
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
2月前
|
人工智能 自然语言处理 API
大模型编程(3)让 AI 帮我调接口
这是大模型编程系列第三篇,分享学习某云大模型工程师ACA认证免费课程的笔记。本文通过订机票和查天气的例子,介绍了如何利用大模型API实现函数调用,解决实际业务需求。课程内容详实,推荐感兴趣的朋友点击底部链接查看原文,完全免费。通过这种方式,AI可以主动调用接口并返回结果,极大简化了开发流程。欢迎在评论区交流实现思路。
357 1
|
3月前
|
人工智能 测试技术 开发者
AI 编码助手:编程路上的得力伙伴
在数字化浪潮中,AI编码助手成为开发者不可或缺的工具。它通过代码生成与补全、优化与规范、错误检测与调试等功能,大幅提升编程效率和代码质量。从需求分析到部署,AI助手全程助力,确保项目顺利进行。尽管不能替代开发者创造力,但它无疑是编程道路上的得力伙伴,推动软件开发不断创新。
148 12
|
3月前
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程实践:构建你的第一个机器学习模型
在人工智能的巨浪中,每个人都有机会成为弄潮儿。本文将带你一探究竟,从零基础开始,用最易懂的语言和步骤,教你如何构建属于自己的第一个机器学习模型。不需要复杂的数学公式,也不必担心编程难题,只需跟随我们的步伐,一起探索这个充满魔力的AI世界。
90 12