从基础搭建开始。
网上比较多的状态机都是结合其实际的应用场景包含一些特定的实现设计在里面我们在搭建自己的状态机的时候可以从一个细小的状态开始搭建先搭建一个节点然后依据同样的设计搭建类似的多个节点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/7/23 8:02:04 阅读更多 →
C++ 无锁并发队列:高性能设计与实现

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

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

2026/7/23 8:02:04 阅读更多 →
C++面向对象项目实战:从零构建控制台ATM模拟器

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

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

2026/7/23 8:02:04 阅读更多 →

最新新闻

三部门联合发文!从政策要求到安全落地,派拉 AIGS 如何支撑 AI Agent 规范应用?

三部门联合发文!从政策要求到安全落地,派拉 AIGS 如何支撑 AI Agent 规范应用?

5 月 8 日,国家网信办、国家发展改革委、工业和信息化部联合印发《智能体规范应用与创新发展实施意见》(以下简称《实施意见》)。意见明确提出,智能体是具备自主感知、记忆、决策、交互与执行能力的智能系统,是人工智能…

2026/7/23 17:55:22 阅读更多 →
一键青龙拉取搭建 盒子openwrt 软路由 docker安装青龙面板 + Ninja(CK提交版)9月2日

一键青龙拉取搭建 盒子openwrt 软路由 docker安装青龙面板 + Ninja(CK提交版)9月2日

首先感谢各位大佬的辛苦付出! 话不多说,开始上代码: 服务器或软路由docker一键搭建青龙面板 wget -q https://raw.githubusercontents.com/shufflewzc/VIP/main/Scripts/sh/ql.sh -O ql.sh && bash ql.sh 无条件部署的小伙伴可以直接上车,名额有限, 务必先下…

2026/7/23 17:55:22 阅读更多 →
【每周更新】OpenWrtLEDE精品软路由x86/64稳定版固件下载

【每周更新】OpenWrtLEDE精品软路由x86/64稳定版固件下载

爱快用腻了,不开源功能又太少(比如文件共享,下载器,去广告,私人网盘,docker,nas服务器,媒体服务器,家庭网关,这些功能几乎都做不到,有个别的即使可…

2026/7/23 17:55:22 阅读更多 →
腾讯轻量云服务器安装FREEBSD

腾讯轻量云服务器安装FREEBSD

前言 最近在使用panabit,panabit程序都是基于freebsd的,也有linux版本但是有bug,在腾讯云上部署panabit云平台,首先要安装freebsd,研究了两天(大部分时间都卡在安装源下载慢的问题上了)&#x…

2026/7/23 17:55:22 阅读更多 →
CTFHUB-WEB前置技能-HTTP协议-请求方式

CTFHUB-WEB前置技能-HTTP协议-请求方式

目录 HTTP协议请求方式 1.GET请求 2.HEAD请求 3.POST请求 4.PUT请求 5.DELETE请求 6.CONNECT请求 7.OPTIONS请求 8.TRACE请求 实战 使用curl命令 1.安装curl 2.获取Flag 使用BURPSUIT HTTP协议请求方式 根据HTTP协议,HTTP请求可以使用多种请求方法。…

2026/7/23 17:55:22 阅读更多 →
异步时钟亚稳态 的解决方案——多bit信号

异步时钟亚稳态 的解决方案——多bit信号

目录 1. 亚稳态问题——电平同步 1.1. 时钟偏斜 导致的采样中间值问题 1.2. "3个沿"+允许skew——电平同步 2.1. “>8个沿”+不允许skew——valid信号DMUX选通 2. 漏采样——展宽 2.1. valid延迟展宽 2.2. valid 异或展宽 3. 高频变化/缓存——异步FIFO 对于多bit…

2026/7/23 17:54:22 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻