子玥酱掘金 / 知乎 / CSDN / 简书 同名大家好我是子玥酱一名长期深耕在一线的前端程序媛 。曾就职于多家知名互联网大厂目前在某国企负责前端软件研发相关工作主要聚焦于业务型系统的工程化建设与长期维护。我持续输出和沉淀前端领域的实战经验日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。技术方向前端 / 跨端 / 小程序 / 移动端工程化内容平台掘金、知乎、CSDN、简书创作特点实战导向、源码拆解、少空谈多落地文章状态长期稳定更新大量原创输出我的内容主要围绕前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读展开。文章不会停留在“API 怎么用”而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍希望能帮你在实际工作中少走弯路。子玥酱 · 前端成长记录官 ✨ 如果你正在做前端或准备长期走前端这条路 关注我第一时间获取前端行业趋势与实践总结 可领取11 类前端进阶学习资源工程化 / 框架 / 跨端 / 面试 / 架构 一起把技术学“明白”也用“到位”持续写作持续进阶。愿我们都能在代码和生活里走得更稳一点 文章目录引言一、什么是行为树二、为什么游戏都在用行为树三、行为树的三大节点Selector选择器Sequence顺序器Action动作节点四、设计一个简单 NPC五、定义行为树节点六、实现 Action 节点七、实现 Selector八、加入条件节点九、实现追击逻辑十、AISystem 驱动行为树十一、与 Store 结合十二、Boss 行为树实战十三、为什么行为树比 if-else 更强十四、行为树与多端同步十五、未来升级行为树 AI Agent十六、一个关键认知升级总结引言很多开发者第一次给鸿蒙游戏加 NPC 时都会这样写if(playerNear){attack()}或者if(hp30){runAway()}刚开始感觉没问题能跑 能打 能追人但随着游戏复杂度增加巡逻 追击 攻击 释放技能 逃跑 求援 Boss机制很快就会出现一个问题if-else 地狱。代码可能变成if(playerNear){if(hp50){if(skillReady){castSkill()}else{attack()}}else{if(friendNear){callHelp()}else{runAway()}}}几个月后连自己都不敢改很多人会觉得是不是 AI 太复杂了其实不是问题在于你在用条件判断实现决策系统。而现代游戏普遍采用Behavior Tree 行为树来驱动 NPC。一、什么是行为树先看一个最简单的 NPC需求发现玩家 ↓ 攻击玩家传统写法if(canSeePlayer()){attack()}没问题但增加需求发现玩家 ↓ 距离近 ↓ 攻击 距离远 ↓ 追击逻辑开始复杂行为树则表示为发现玩家 ↓ 是 ↓ 距离是否足够 ↓ ↓ 是 否 ↓ ↓ 攻击 追击本质上行为树是一种可视化决策流程。二、为什么游戏都在用行为树因为 NPC 本质上就是不断决策例如怪物巡逻 发现敌人 追击 攻击 逃跑Boss一阶段 二阶段 狂暴阶段 释放技能 召唤小怪这些本质都是状态选择问题行为树非常适合处理。三、行为树的三大节点最常见的是Selector Sequence ActionSelector选择器意思从左到右尝试 成功一个就结束例如攻击 ↓失败 追击 ↓失败 巡逻表现优先攻击 其次追击 最后巡逻Sequence顺序器意思全部成功才算成功例如发现玩家 ↓ 接近玩家 ↓ 攻击任何一步失败整个流程失败Action动作节点真正执行行为例如Attack Move Patrol RunAway四、设计一个简单 NPC需求发现玩家 ↓ 攻击 否则 ↓ 巡逻行为树Selector ├── AttackPlayer └── Patrol对应结构rootSelector(AttackPlayer(),Patrol())五、定义行为树节点基础接口enumNodeStatus{Success,Failure,Running}interfaceBTNode{tick():NodeStatus}所有节点统一tick()驱动。六、实现 Action 节点巡逻classPatrolNodeimplementsBTNode{tick():NodeStatus{console.info(Patrol)returnNodeStatus.Success}}攻击classAttackNodeimplementsBTNode{tick():NodeStatus{console.info(Attack)returnNodeStatus.Success}}七、实现 Selector核心逻辑classSelectorNodeimplementsBTNode{constructor(privatechildren:BTNode[]){}tick():NodeStatus{for(constnodeofthis.children){constresultnode.tick()if(resultNodeStatus.Success){returnresult}}returnNodeStatus.Failure}}作用优先执行最重要行为八、加入条件节点例如发现玩家判断实现classSeePlayerNodeimplementsBTNode{constructor(privatenpc:NPC){}tick():NodeStatus{returnthis.npc.canSeePlayer()?NodeStatus.Success:NodeStatus.Failure}}九、实现追击逻辑需求发现玩家 ↓ 追击 ↓ 攻击行为树Sequence ├── SeePlayer ├── MoveToPlayer └── Attack代码constcombatTreenewSequenceNode([newSeePlayerNode(npc),newMoveNode(npc),newAttackNode(npc)])十、AISystem 驱动行为树前面我们讲过Store System HUD架构行为树应该属于AISystem而不是UI例如classAISystem{update(npc:NPC){npc.behaviorTree.tick()}}十一、与 Store 结合NPC状态classNPCStore{hp100targetId0position{x:0,y:0}}行为树读取Store 决策。然后AISystem修改Store状态形成Store ↓ BehaviorTree ↓ AISystem ↓ Store闭环。十二、Boss 行为树实战Boss需求HP 50% 普通攻击 HP 50% 释放大招 HP 20% 狂暴模式行为树Selector ├── RageMode ├── UltimateSkill └── NormalAttack代码Selector(RageNode(),UltimateNode(),AttackNode())结构非常清晰。十三、为什么行为树比 if-else 更强传统if()if()if()if()最终无法维护行为树节点化 可组合 可扩展增加新行为SkillNode插入即可无需重写全部逻辑。十四、行为树与多端同步前面我们讲Store一致 System一致才能实现多端一致性行为树天然符合因为输入一致 ↓ 行为树一致 ↓ 决策一致 ↓ 状态一致例如手机NPC PC NPC执行同一行为树结果相同。十五、未来升级行为树 AI Agent未来 NPC 不再只是固定规则而是行为树 大模型例如行为树 负责框架 LLM 负责决策结构Selector ↓ AskLLM() ↓ Attack Move Trade TalkNPC 会变得更加智能。十六、一个关键认知升级初学者认为AI if-else进阶开发者认为AI 行为树而大型项目最终理解行为树不是 AI而是管理 AI 决策复杂度的架构。因为真正的问题从来不是NPC会不会攻击而是当NPC拥有100种行为时 系统还能不能维护总结鸿蒙游戏中的 AI NPC 推荐架构Store ↓ BehaviorTree ↓ AISystem ↓ Store核心节点Selector Sequence Action核心优势逻辑清晰 可视化 易扩展 易测试 支持多端同步如果用一句话总结行为树的本质不是让 NPC 更聪明而是让复杂 AI 行为变得可管理、可组合、可扩展。
鸿蒙游戏 AI NPC:行为树原理 + 实战代码
发布时间:2026/6/11 6:30:15
子玥酱掘金 / 知乎 / CSDN / 简书 同名大家好我是子玥酱一名长期深耕在一线的前端程序媛 。曾就职于多家知名互联网大厂目前在某国企负责前端软件研发相关工作主要聚焦于业务型系统的工程化建设与长期维护。我持续输出和沉淀前端领域的实战经验日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。技术方向前端 / 跨端 / 小程序 / 移动端工程化内容平台掘金、知乎、CSDN、简书创作特点实战导向、源码拆解、少空谈多落地文章状态长期稳定更新大量原创输出我的内容主要围绕前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读展开。文章不会停留在“API 怎么用”而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍希望能帮你在实际工作中少走弯路。子玥酱 · 前端成长记录官 ✨ 如果你正在做前端或准备长期走前端这条路 关注我第一时间获取前端行业趋势与实践总结 可领取11 类前端进阶学习资源工程化 / 框架 / 跨端 / 面试 / 架构 一起把技术学“明白”也用“到位”持续写作持续进阶。愿我们都能在代码和生活里走得更稳一点 文章目录引言一、什么是行为树二、为什么游戏都在用行为树三、行为树的三大节点Selector选择器Sequence顺序器Action动作节点四、设计一个简单 NPC五、定义行为树节点六、实现 Action 节点七、实现 Selector八、加入条件节点九、实现追击逻辑十、AISystem 驱动行为树十一、与 Store 结合十二、Boss 行为树实战十三、为什么行为树比 if-else 更强十四、行为树与多端同步十五、未来升级行为树 AI Agent十六、一个关键认知升级总结引言很多开发者第一次给鸿蒙游戏加 NPC 时都会这样写if(playerNear){attack()}或者if(hp30){runAway()}刚开始感觉没问题能跑 能打 能追人但随着游戏复杂度增加巡逻 追击 攻击 释放技能 逃跑 求援 Boss机制很快就会出现一个问题if-else 地狱。代码可能变成if(playerNear){if(hp50){if(skillReady){castSkill()}else{attack()}}else{if(friendNear){callHelp()}else{runAway()}}}几个月后连自己都不敢改很多人会觉得是不是 AI 太复杂了其实不是问题在于你在用条件判断实现决策系统。而现代游戏普遍采用Behavior Tree 行为树来驱动 NPC。一、什么是行为树先看一个最简单的 NPC需求发现玩家 ↓ 攻击玩家传统写法if(canSeePlayer()){attack()}没问题但增加需求发现玩家 ↓ 距离近 ↓ 攻击 距离远 ↓ 追击逻辑开始复杂行为树则表示为发现玩家 ↓ 是 ↓ 距离是否足够 ↓ ↓ 是 否 ↓ ↓ 攻击 追击本质上行为树是一种可视化决策流程。二、为什么游戏都在用行为树因为 NPC 本质上就是不断决策例如怪物巡逻 发现敌人 追击 攻击 逃跑Boss一阶段 二阶段 狂暴阶段 释放技能 召唤小怪这些本质都是状态选择问题行为树非常适合处理。三、行为树的三大节点最常见的是Selector Sequence ActionSelector选择器意思从左到右尝试 成功一个就结束例如攻击 ↓失败 追击 ↓失败 巡逻表现优先攻击 其次追击 最后巡逻Sequence顺序器意思全部成功才算成功例如发现玩家 ↓ 接近玩家 ↓ 攻击任何一步失败整个流程失败Action动作节点真正执行行为例如Attack Move Patrol RunAway四、设计一个简单 NPC需求发现玩家 ↓ 攻击 否则 ↓ 巡逻行为树Selector ├── AttackPlayer └── Patrol对应结构rootSelector(AttackPlayer(),Patrol())五、定义行为树节点基础接口enumNodeStatus{Success,Failure,Running}interfaceBTNode{tick():NodeStatus}所有节点统一tick()驱动。六、实现 Action 节点巡逻classPatrolNodeimplementsBTNode{tick():NodeStatus{console.info(Patrol)returnNodeStatus.Success}}攻击classAttackNodeimplementsBTNode{tick():NodeStatus{console.info(Attack)returnNodeStatus.Success}}七、实现 Selector核心逻辑classSelectorNodeimplementsBTNode{constructor(privatechildren:BTNode[]){}tick():NodeStatus{for(constnodeofthis.children){constresultnode.tick()if(resultNodeStatus.Success){returnresult}}returnNodeStatus.Failure}}作用优先执行最重要行为八、加入条件节点例如发现玩家判断实现classSeePlayerNodeimplementsBTNode{constructor(privatenpc:NPC){}tick():NodeStatus{returnthis.npc.canSeePlayer()?NodeStatus.Success:NodeStatus.Failure}}九、实现追击逻辑需求发现玩家 ↓ 追击 ↓ 攻击行为树Sequence ├── SeePlayer ├── MoveToPlayer └── Attack代码constcombatTreenewSequenceNode([newSeePlayerNode(npc),newMoveNode(npc),newAttackNode(npc)])十、AISystem 驱动行为树前面我们讲过Store System HUD架构行为树应该属于AISystem而不是UI例如classAISystem{update(npc:NPC){npc.behaviorTree.tick()}}十一、与 Store 结合NPC状态classNPCStore{hp100targetId0position{x:0,y:0}}行为树读取Store 决策。然后AISystem修改Store状态形成Store ↓ BehaviorTree ↓ AISystem ↓ Store闭环。十二、Boss 行为树实战Boss需求HP 50% 普通攻击 HP 50% 释放大招 HP 20% 狂暴模式行为树Selector ├── RageMode ├── UltimateSkill └── NormalAttack代码Selector(RageNode(),UltimateNode(),AttackNode())结构非常清晰。十三、为什么行为树比 if-else 更强传统if()if()if()if()最终无法维护行为树节点化 可组合 可扩展增加新行为SkillNode插入即可无需重写全部逻辑。十四、行为树与多端同步前面我们讲Store一致 System一致才能实现多端一致性行为树天然符合因为输入一致 ↓ 行为树一致 ↓ 决策一致 ↓ 状态一致例如手机NPC PC NPC执行同一行为树结果相同。十五、未来升级行为树 AI Agent未来 NPC 不再只是固定规则而是行为树 大模型例如行为树 负责框架 LLM 负责决策结构Selector ↓ AskLLM() ↓ Attack Move Trade TalkNPC 会变得更加智能。十六、一个关键认知升级初学者认为AI if-else进阶开发者认为AI 行为树而大型项目最终理解行为树不是 AI而是管理 AI 决策复杂度的架构。因为真正的问题从来不是NPC会不会攻击而是当NPC拥有100种行为时 系统还能不能维护总结鸿蒙游戏中的 AI NPC 推荐架构Store ↓ BehaviorTree ↓ AISystem ↓ Store核心节点Selector Sequence Action核心优势逻辑清晰 可视化 易扩展 易测试 支持多端同步如果用一句话总结行为树的本质不是让 NPC 更聪明而是让复杂 AI 行为变得可管理、可组合、可扩展。