-
Notifications
You must be signed in to change notification settings - Fork 52
Description
Description:
受影响文件 (Affected File):
y3/third_party/NPBehave/Clock.lua
问题描述 (Bug Description):
在 Clock:Update 方法中,用于检查和处理定时器重复次数的逻辑(大约在原始文件的 180-184 行)错误地使用了 timer.Repeat 字段来判断定时器是否完成重复以及减少剩余重复次数。
然而,在 Clock:AddTimer 方法中,用于设置重复次数的参数 repeat_count (包括 -1 代表无限重复) 被正确地存储在了 timer.repeat_count 字段中。
timer.Repeat 字段似乎并未在代码中被有效初始化或用于存储重复次数,很可能保持其默认值(可能是 0 或 nil)。
观察到的行为 (Observed Behavior):
这导致了以下问题:
- 当通过
Clock:AddUpdateObserver添加一个无限重复的观察者时,该方法内部调用AddTimer并设置repeat_count = -1。 - 在
Clock:Update方法中,当这个观察者的执行条件首次满足时,代码错误地检查if timer.Repeat == 0 then。由于timer.Repeat很可能是 0,这个条件判断为真。 - 因此,这个本应无限重复的 UpdateObserver 在第一次执行后就被错误地调用
self:RemoveTimer(timer.Action)移除了。 - 这直接导致依赖
UpdateObserver持续更新的多帧 Action 任务(例如使用multiFrameFunc或multiFrameFunc2并返回Progress的 Action)在执行一次更新后就意外停止,无法完成其预定逻辑。
预期行为 (Expected Behavior):
通过 AddUpdateObserver 添加的定时器(其 repeat_count 为 -1)应该在 Clock:Update 中持续被执行,直到它们被显式地通过 RemoveUpdateObserver 或 RemoveTimer 移除,或者其所属的行为树节点停止。多帧 Action 应该能够依赖此机制持续执行其更新逻辑。
建议修复方案 (Proposed Solution):
将 Clock:Update 方法内部处理重复次数的逻辑,从使用 timer.Repeat 字段改为使用正确的 timer.repeat_count 字段。
修改建议 (Code Change Suggestion):
修改 y3/third_party/NPBehave/Clock.lua 文件中 Clock:Update 方法内的相关代码块:
原始代码 (Original Code):
if timer.Repeat == 0 then
self:RemoveTimer(timer.Action)
elseif timer.Repeat >= 0 then
timer.Repeat = timer.Repeat - 1
end修正后代码 (Corrected Code):
-- 使用正确的 repeat_count 字段
if timer.repeat_count == 0 then
self:RemoveTimer(timer.Action)
elseif timer.repeat_count > 0 then
timer.repeat_count = timer.repeat_count - 1
end请求 (Request):
请官方审核此问题并应用修复,以确保 NPBehave 库中定时器和 UpdateObserver 的重复逻辑按预期工作。