《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例子一样的方式运行。但是现在的代码和类将变得更有条理且更易于管理。

目录
打赏
0
0
0
0
1412
分享
相关文章
AI 时代,为什么编程能力≠ 开发门槛
在 2.0 阶段,我们目标是实现面向任务的协同编码模式,人的主要职责转变为任务的下发、干预以及最后结果的审查。在这个过程中,人的实际工作量开始减轻,AI 工作的占比显著提升。目前的 2.0 版本是我们最近上线的。
444 93
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
AI攻破最后防线!连架构设计都能自动生成,中级程序员集体破防
325 10
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
Trae插件Builder模式深度测评:从编程助手到AI工程师的进化
Trae插件最新推出的Builder模式标志着AI辅助编程工具从简单的代码补全向“AI工程师”角色的转变。该模式允许开发者通过自然语言描述项目需求,自动生成完整的项目结构、代码文件和开发流程,支持VSCode、JetBrains IDE及在线Web版本。Builder模式的核心功能包括自然语言项目初始化、智能项目架构设计和多文件协调代码生成,显著提升了开发效率,降低了技术门槛。然而,它在处理复杂业务逻辑和高度定制化需求方面仍有局限。未来,Builder模式将集成云部署、测试套件生成和DevOps流水线等功能
772 2
学不会编程也能写测试?AI让测试更平权
在传统的软件开发体系中,测试常被划分为“技术型测试”(如自动化、性能、安全)和“业务型测试”(如功能验证、用户体验)。前者掌握技术话语权,后者则更多依赖经验和流程规范。然而,随着大语言模型(LLM)等AI技术的迅猛发展,这一固有格局正被悄然打破:
119 10
通义灵码2.5评测:从编程智能体到记忆感知的AI编码革命
通义灵码2.5版本更新带来了多项新功能,包括Lingma IDE的开箱即用体验、编程智能体模式实现端到端编码任务、MCP工具集成扩展AI助手能力以及Qwen3模型升级大幅提升代码生成准确性和效率。此外,新增长期记忆与上下文感知功能,使开发更个性化和高效。尽管存在一些局限性,如复杂业务逻辑仍需人工干预,但整体显著提升了开发效率。官方还提供了高质量视频课程助力用户学习。
477 10
🧠 用 AI 提升你的编程效率 —— 在 PyCharm 中体验通义灵码
通义灵码是一款基于大模型的智能编程辅助工具,现已上线PyCharm插件V2.5+版本。它能根据自然语言描述、注释或上下文生成高质量代码,支持多语言(Python、Java等),提供代码补全、优化建议、单元测试生成及异常排查等功能。集成魔搭MCP市场3000+服务,具备编程智能体模式与长期记忆能力,助开发者提升效率。适用初学者、资深开发者及团队协作场景。小红书、B站、抖音、微博均有相关资源分享。 小红书: http://xhslink.com/a/SvabuxSObf3db bilibili:https://b23.tv/1HJAdIx 抖音: https://v.douyin.com/1DAG
482 3
阿里云人工智能平台 PAI 开源 EasyDistill 框架助力大语言模型轻松瘦身
本文介绍了阿里云人工智能平台 PAI 推出的开源工具包 EasyDistill。随着大语言模型的复杂性和规模增长,它们面临计算需求和训练成本的障碍。知识蒸馏旨在不显著降低性能的前提下,将大模型转化为更小、更高效的版本以降低训练和推理成本。EasyDistill 框架简化了知识蒸馏过程,其具备多种功能模块,包括数据合成、基础和进阶蒸馏训练。通过数据合成,丰富训练集的多样性;基础和进阶蒸馏训练则涵盖黑盒和白盒知识转移策略、强化学习及偏好优化,从而提升小模型的性能。
通义灵码:当AI成为你的编程搭档,效率革命已经到来
本文介绍了通义灵码作为AI编程伙伴的革命性意义及其技术特点。基于阿里云通义代码大模型CodeQwen1.5,它具备多模态代码理解、意图推理和跨语言知识融合能力,可重构开发者工作流,从智能编码到Debug预警再到文档自动化全面提升效率。数据显示,其能将常规开发时间缩短60%,错误率下降43%,新技术上手速度提升2倍。未来,通义灵码将推动需求-代码双向翻译、架构自演进等全新编程形态,助力开发者聚焦更高价值领域,开启人机共生的编程新时代。
166 10
通义灵码:以AI重塑开发者生产力,解锁智能编程新范式
通义灵码是阿里云推出的一款AI智能编程助手,基于通义大模型打造,深度集成于主流IDE。它不仅提供全场景智能代码生成、对话式开发体验和工程化智能重构等功能,还通过百亿级参数大模型底座、企业级环境适配、私有化部署等优势,重新定义人机协作边界。在真实开发场景中,通义灵码显著提升API开发与算法优化效率,助力开发者从机械劳动转向创造性对话,开启人机协同的新时代。
211 9
通义灵码:AI赋能编程,开启智能开发新时代
通义灵码是阿里云推出的一款专为开发者设计的智能编程助手,基于自主研发的大模型打造。它不仅具备代码生成、智能补全、代码优化和实时调试等功能,还通过垂直领域深度训练、多语言全栈支持以及与主流IDE无缝集成,大幅提升开发效率。真实案例显示,通义灵码可显著减少编码时间和错误率,助力开发者专注于业务逻辑。未来,它还将进一步理解业务需求、参与代码评审和跨团队协作,重新定义软件开发范式。立即体验,让AI赋能每一行代码!
289 8

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问