从基础搭建开始。
网上比较多的状态机都是结合其实际的应用场景包含一些特定的实现设计在里面我们在搭建自己的状态机的时候可以从一个细小的状态开始搭建先搭建一个节点然后依据同样的设计搭建类似的多个节点2、保持节点的简洁性和去耦性。通常在最初的节点搭建完后是不可能一劳永逸的后续反复的修改都会对这些节点进行特定的修改和某些特定规则的设计。举个列子射击这样一个状态节点A英雄的设计是单发B英雄是连续10发那么如何保证对这两个英雄的同一个射击状态的兼容一种设计方式是将当前的英雄作为一个参数进行传递那么在执行的时候就读取当前传入参数的英雄的具体配置进行相关的射击动作。把射击相关的逻辑封装在该英雄对应的攻击执行器中那么其具体执行的射击单发还是射击10发就可以作为一个循环执行单发循环一次10发循环10次。以前我的设计实现思路是针对单一的英雄特定重载实现其对应的射击节点这样也算一种解决方法只是这样的设计有一个弊端就是随着英雄类型的增多其对应的特定实现会不断的扩大相应的重载实现的版本会增多。如果设计思路和文本清晰那还可以维护如果设计思路不清晰那么就会带来维护的消耗。3、做好节点的剥离避免节点耦合太多。通常状态机是用在比较简易的游戏类型中角色本身的状态类型不会太多那么对应的状态节点应该避免相互之间的耦合和功能交叉状态的切换可以走相同的属性设置来实现交互。如果随着设计的变化状态实现越来越多可以考虑用行为树来实现避免相互之间的耦合太多。二、行为树在RPG游戏中行为树是用的比较多的一种AI机制。就其本质而言行为树是状态机的一种更高封装的实现。我个人的理解行为树就是将特定的行为节点进行封装做成叶子节点这样可以实现任意节点的拼接。想象一下如果我们把每个特定的状态机进一步的封装做成一片片叶子这样我们在搭建树的时候就可以收集特定的叶子来搭建特定的树最后得到特定功能的行为树这就是我对行为树的一个简易理解:D 如果用更为规范的说法那么这些叶子节点就是行为树中的行为节点行为树的行为节点的执行结果可以用枚举的方式列出复制代码RunningStatus {INVALID 0,SUCCESS 1, --执行成功FAILURE 2, --执行失败RUNNING 3, --执行中}复制代码一棵树的搭建不能只有叶子还需要有枝干这就需要行为树中的一些特定的节点来搭建这棵树这就是行为树中的控制节点Control Node的作用。注意一点行为节点是和游戏实际关联的在行为节点中我们会去具体的定义如何攻击(shoot/attack)寻路(patrol)闲置(idle)等但是在控制节点中其具体运行的逻辑是和实际游戏数据没有关联的其只需要负责基本的控制逻辑即可 。通过控制节点我们可以清晰的知道整个行为树的执行逻辑这就是行为树的一大优势执行逻辑可见。 行为树主要有以下几种控制节点举例说一下4种Composite节点1、Sequence节点 顺序执行控制节点其执行的基本逻辑是对其下面的所有叶子节点均顺序执行直到遇到返回为FAILURE的节点。我对这种节点的理解就是串联电路的思维电流顺序走过每个电阻叶子如果遇到第一个无法流过的电阻则返回否则会一直流过去直到所有电阻都流过2、Selector节点选择执行控制节点其执行的基本逻辑是对其下面的所有叶子节点顺序执行直到遇到第一个返回为SUCCESS/RUNNING执行结果的节点。观察上面的Sequence节点和Selector节点的区别仅仅在于选中的节点的返回结果的不同处理。在其他地方好像对选择节点进行了分类可以分为带优先级的选择节点不带优先级的选择节点带权值的选择节点。带优先级是指在选择那个节点更新的时候会根据优先级进行比较来选择。不带优先级的时候一般会设置为每次更新的时候会沿用上一次的更新节点因为一般更新的时候会有一段时间持续处于某个节点的状态目前我用的就是这样的选择节点而对于带权重的选择节点一般用来做多样的随机性比如游戏中的宠物需要表现一个交互动作那么可以做多个交互动作在每次做选择节点的时候根据权重随机一个节点用来表示交互动作。 3、Parallel节点并行执行控制节点其执行的基本逻辑是对其下面的所有叶子节点各自执行一次如果返回结果不为RUNNING则分别统计SUCCESS和FAILURE的结果一般结果会采用“与”和“或”的操作。比如当前Parallel节点的返回条件可以分为 全SUCCESS或者任意一个SUCCESS全FAILURE或者任意一个FAILURE。在执行完所有叶子节点后可以对比其执行的SUCCESS和FAILURE节点的个数和其设置的返回结果对比如果满足则返回SUCCESSSUCCESS条件或者FAIULUREFAILURE条件或者返回RUNNING。 4、Detector节点检测执行控制节点其执行的基本逻辑是对其下面的所有叶子节点逐个执行如果返回的不为RUNNING则检测如果为SUCCESS则接着执行为FAILURE则执行结束。即遇到第一个返回为FAILURE的节点就结束执行。 6种Decorator节点 1、Invert节点反转装饰节点其执行的基本逻辑是只有一个叶子节点如果返回为SUCCESS则返回FAILURE如果返回为FAILURE则返回SUCCESS否则返回RUNNING 2、Sucees节点Success装饰节点其执行的基本逻辑是只有一个叶子节点执行后直接返回SUCCESS 3、SuccessToRunning节点根据名字就可以知道其叶子节点在执行完后如果返回为SUCCESS则修改其结果为RUNNING其他的状态不改变返回最终执行状态给上一层。 4、FailureTORunning节点类似于上一个节点其叶子节点在执行完后如果返回为FAILURE则修改其结果为RUNNING其他的状态不改变返回最终执行状态给上一层。 5、SuppressSuccess节点suppress的意思是抑制所以这个节点的功能就是不准返回SUCCESS的执行结果如果叶子节点返回为RUNNING则返回RUNNING其他都返回为FAILURE给上一层 6、SuppressFailure节点类似于上一个节点该节点只会返回RUNNING或者SUCCESS这两种执行结果 除了常见的Compositor节点和Decorator节点还有Condition节点依据前面两种类型节点不难推出后面的Condition节点的功能就是在某些条件下才触发某些特定返回结果的一些节点。 简而言之行为树就是在三个大类的控制节点Compositor节点、Decorator节点、Condition节点的搭建下结合各个行为叶子节点拼接出一个基本的AI执行机制举个例子bt_atk这是一个简单的站在原地攻击的行为树设计首先执行Selector节点然后顺序执行其下面的所有叶子节点首先会执行攻击的叶子节点如果返回为Success则继续执行Homing节点。所以其基本的设计思想就是触发一次攻击检测如果有攻击对象则执行攻击返回SUCCESS同时结束本次tick否则返回FAILUER那么就会执行下一个节点Homing。通过构建一颗基本的行为树我们可以组件一颗更大的树比如我们再构建一颗巡逻的行为树bt_patrol通过这两颗基本的行为树我们可以组建一个更大的行为树bt_monster复制代码Sequence Attack Homing /Sequence /Selector复制代码 当然我只是一个引申更加具体的设计可以根据具体的设计来实现有时候不只是叶子节点可以复用某些树也可以整体作为一个叶子复用这样可以实现设计的复用。在行为树中一般的设计思路是会构建一个行为树的模版比如上面的bt_atk在每个使用该模版的角色进行初始化行为树的时候是从该模版缓存中取出一份然后初始化相关的信息得到一份实例在进行行为树更新的时候是更新其对应的实例。而且为了通用各个树干和叶子节点都是采用数据封包传递在数据包中封闭当前角色相关的信息或者黑板信息这样在每个节点更新的时候都是从数据封包中获取当前角色相关的信息从而进行对应的逻辑更新。这样就避免了一些设计上的将数据封存在action行为节点上的问题通过封包的传递可以降低耦合提高复用性。对于行为树的优化我提一个优化点吧。大部分的行为树在具体的项目中应用都是结合具体的设计来实现的所以我采用的优化未必适合于其他游戏的优化但是可以采用一个更新频率的设置来降低行为树的更新频率这个是可以通用的。我在测试服务器的代码性能的时候发现当场景中的角色数量比较少的时候大部分的游戏性能都被场景中的怪占用了而怪物的更新中对于AI的更新又是一个很大的占用。我采用一种距离配置的方法进行优化当怪物周边没有玩家的时候降低怪物的更新频率或者就不执行怪物的AI更新当怪物进入玩家的视野的时候采用较高的更新频率当怪物进入玩家的攻击范围的时候采用正常的更新频率。通过不同距离检测设置不同的更新频率可以较好的优化在玩家个数较少时的怪物AI性能。总结游戏中两种常见的状态机和行为树都做了一个简单的讲解当然现在网上比较多相关的资料如果想深入的学习可以搜集相关的资料研究有较多的开源代码也可以参考研究一下。当然我说的都是较为浅显的设计具体的状态机和行为树节点的设计其中具体逻辑的编写是需要结合实际的游戏设计来实现的这就需要程序和策划具体的商量和实现了。好了今天AI的简介就说到这儿下一篇再说说一些优化的总结吧D

相关新闻

国产大模型技术选型与工程实践指南:从SOTA评估到生产部署

国产大模型技术选型与工程实践指南:从SOTA评估到生产部署

国产大模型技术迭代速度惊人,几乎每周都有新的模型发布或性能突破,SOTA(State Of The Art)榜单的领先位置频繁更替。这种快速演进的态势既体现了国内AI技术的活力,也给开发者、研究者和企业技术选型带来了实实在在的挑…

2026/10/20 10:09:21 阅读更多 →
C++ 无锁并发队列:高性能设计与实现

C++ 无锁并发队列:高性能设计与实现

1. 为什么需要无锁并发队列在多线程编程中,队列是最常用的共享数据结构之一。传统的基于互斥锁(std::mutex)的队列在高并发场景下容易成为瓶颈,因为锁的争用会导致频繁的上下文切换和缓存行失效。无锁(lock-free&#…

2026/10/20 10:46:09 阅读更多 →
C++面向对象项目实战:从零构建控制台ATM模拟器

C++面向对象项目实战:从零构建控制台ATM模拟器

1. 项目概述:从零构建一个控制台ATM模拟器最近在带新人,发现很多刚学完C基础语法的朋友,对于如何将零散的知识点(类、文件操作、流程控制)串联成一个完整的、有逻辑的项目感到无从下手。正好,之前用C写过一…

2026/10/20 10:45:41 阅读更多 →

最新新闻

小功率开关电源设计全解析:从LinkSwitch方案选型到反激变压器手算与调试

小功率开关电源设计全解析:从LinkSwitch方案选型到反激变压器手算与调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 14:03:10 阅读更多 →
RAG多轮对话查询重写实战:从原理到代码,提升知识库问答准确率

RAG多轮对话查询重写实战:从原理到代码,提升知识库问答准确率

别的不说,先抛一个场景:你在企业知识库里查资料,第一句问“什么是项目管理里的里程碑”,系统回答得挺准,接下来你补一句“那我怎么更新它”,结果直接偏到九霄云外去了。这不是模型傻,而是系统没…

2026/10/20 14:03:10 阅读更多 →
SecureCRT中文版64位密钥认证与UTF-8乱码解决方案

SecureCRT中文版64位密钥认证与UTF-8乱码解决方案

简介:SecureCRT中文版是一款面向网络工程师、系统管理员及Linux/Unix运维人员的免安装终端仿真工具,专为安全、高效地管理SSH远程服务器与网络设备而设计。资源包共198个文件,含15个核心exe可执行程序、52个dll动态库、16个ini配置文件、12个…

2026/10/20 14:03:10 阅读更多 →
AI辅助学术专著写作:从选题到送审的七步流水线实践指南

AI辅助学术专著写作:从选题到送审的七步流水线实践指南

这几年凡是聊到 AI 写作,总有一种两极分化的感觉。一边是很多人把"AI 写专著"想象成扔一个题目进去,机器就哗哗吐出二十万字;另一边是真正动过笔的人,大多在第一个月就放弃了,因为发现 AI 给的初稿虽然通顺&…

2026/10/20 14:03:10 阅读更多 →
Java Web人事信息管理系统设计与实现(Servlet+JSP)

Java Web人事信息管理系统设计与实现(Servlet+JSP)

做这套系统的时候,我刚从“能跑就行”的阶段过渡到“别给后人挖坑”的阶段。小型企业的人事信息管理系统,听起来不像电商平台或者数据中台那么有排面,但它覆盖的场景非常典型:人员花名册、部门组织、考勤记录、请假审批、工资台账…

2026/10/20 14:03:10 阅读更多 →
技能梳理实战:从个人简历到团队矩阵的完整指南

技能梳理实战:从个人简历到团队矩阵的完整指南

1. 从“skills”这个词说起:为什么它突然成了高频搜索词最近后台收到不少私信,问的都是同一类问题:“skills到底该怎么整理”“简历里的技能栏怎么写才不虚”“团队里每个人的技能怎么盘清楚”。说实话,这个词看着简单&#xff0c…

2026/10/20 14:02:05 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →