解密源码里的 bt 目录是怪物的行为树实现:BehaviorSelector 是其中的选择节点,按优先级依次尝试子行为,哪个子行为的前提满足就执行哪个。怪物“先攻击、打不过就跑、跑不动就游荡”的决策链,就是一棵由 Selector 组织的行为树。
---行为树选择节点:依次尝试子节点
function BehaviorSelector.tick(mon, dt)
for _, child in ipairs(mon.behaviors) do
if child:check(mon) then
mon.current = child
return child:tick(mon, dt)
end
end
return false
end
每个子行为实现 check(前提判定)与 tick(执行)两个方法:攻击行为的 check 是仇恨列表非空,逃跑行为的 check 是血量低于两成,游荡行为的 check 恒为真(兜底)。Selector 按数组顺序逐个尝试,命中的行为接管怪物本帧的控制权。
---怪物的行为注册(祖玛卫士的配置示例)
function MonsterAI.initBehaviors(mon)
mon.behaviors = {
BehaviorAttack.new(mon, { range = 5 }),
BehaviorMove.new(mon, { home = mon.homePoint, leash = 10 }),
BehaviorTurn.new(mon, {}),
}
end
祖玛卫士的行为链:攻击、游走、转身待机, leash 参数限定 10 格的活动半径,超出即触发回家。行为树的调试技巧:给每个节点加命中计数,运行半小时后各节点的命中分布能暴露决策配置的问题——游荡占比九成的怪物说明攻击范围配小了。
行为节点的命中计数按怪物类型日报,分布的异常偏移即 AI 配置的问题信号。
check 的实现曾经在遍历中修改 behaviors 表,迭代器跳过了后半的节点,行为“时灵时不灵”,表的快照遍历修复。行为树的嵌套控制在两层以内,更复杂的组合用配置参数表达而不是继续嵌套,调试的成本随层数指数上升。
调试的成本随层数指数上升。行为树的配置示例在案例库有完整的参考实现,新怪物的 AI 配置从复制模板开始,改参数比从零写更不容易出错,模板的积累让 AI 的质量下限稳定。
行为树的节点注册表集中管理,新怪物的 AI 配置只写数据不写代码。行为切换的顿挫感用淡入淡出的动画过渡掩盖,AI 的表演性在传奇的观感里占三成权重。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
学员常见误区 Lua函数可返回多个值,学员用固定变量数接收时如果变量少于返回值,多余返回值被静默丢弃;如果变量多于返回值,多…
设计初衷 行会建筑的死穴是一次全解锁:会员没有逐步建设的过程感。梯度设计让每栋建筑都有前置条件和资源门槛。 数值模型 建筑分…
设计初衷 婚姻系统的属性加成是社交玩法的经济锚点:加成太弱没人结婚,太强则"为了属性被迫结婚"扭曲了社交本质。婚姻边界的设计…
设计初衷 宝箱类玩法的信任危机都源于同一句话:"概率是不是骗人的。"期望公示把概率从事后争议变成事前契约:奖池概率表全量公示…
设计初衷 流拍物(拍卖未成交的退回物品)堆积在卖家背包里成为死资产:低价值物流拍后无人问津,高价值物流拍后卖家不愿降价重拍。…
业务场景 沙巴克战功榜每周结算,玩家提交战功前不知道"再打多少能进前 10、前 10 的奖励是什么"。名次预览:输入自己的战…