TaskScheduler在UpdateAI条件上下文内无法正常工作的问题排查
问题分析与解决方案
核心问题
你的代码存在两个关键缺陷:
- 调度器更新逻辑缺失:非战斗状态下
UpdateVictim()返回false,会直接触发return,导致_scheduler.Update(diff, ...)完全没有执行。TaskScheduler必须通过Update方法推进时间线,否则所有调度任务都不会被触发。 - 重复堆积任务:
UpdateAI每帧都会执行,非战斗分支会不断调用_scheduler.Schedule,短时间内会创建大量重复的饮酒任务,即使修复更新逻辑,也会导致动画无规律疯狂触发。
修正后的代码
void UpdateAI(uint32 diff) override { // 优先处理调度器更新,覆盖战斗/非战斗所有状态 _scheduler.Update(diff, [this] { // 仅在战斗状态下执行近战攻击逻辑 if (me->IsInCombat() && UpdateVictim()) DoMeleeAttackIfReady(); }); // 非战斗状态下,仅当无待执行任务时添加一次饮酒调度 if (!me->IsInCombat() && !_scheduler.HasPendingTasks()) { _scheduler.Schedule(5s, [this](TaskContext context) { me->HandleEmoteCommand(EMOTE_DRINK); context.Repeat(5s); }); } }
关键调整说明
- 调整调度器更新顺序:将
_scheduler.Update放在函数最前端,确保无论角色处于战斗还是非战斗状态,调度器的时间都能正常推进。 - 避免重复添加任务:通过
_scheduler.HasPendingTasks()判断,仅当没有待执行的饮酒任务时才创建新调度,防止每帧重复生成任务。 - 重构战斗逻辑:将战斗相关的
UpdateVictim和DoMeleeAttackIfReady移到调度器的回调中,保证战斗状态下的基础AI逻辑正常执行。
为何JustEngagedWith中的代码能正常工作?
JustEngagedWith只会在怪物进入战斗时触发一次,不会重复添加任务;同时战斗状态下UpdateVictim()返回true,不会触发提前return,_scheduler.Update能持续执行推进时间线,因此技能调度可以正常生效。
内容的提问来源于stack exchange,提问作者C.Galbraith
相关产品推荐
相关产品推荐

