Skip to content

NPBehave Clock.lua 中定时器重复逻辑错误导致 UpdateObserver 过早停止 #623

@enci1989

Description

@enci1989

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):
这导致了以下问题:

  1. 当通过 Clock:AddUpdateObserver 添加一个无限重复的观察者时,该方法内部调用 AddTimer 并设置 repeat_count = -1
  2. Clock:Update 方法中,当这个观察者的执行条件首次满足时,代码错误地检查 if timer.Repeat == 0 then。由于 timer.Repeat 很可能是 0,这个条件判断为真。
  3. 因此,这个本应无限重复的 UpdateObserver 在第一次执行后就被错误地调用 self:RemoveTimer(timer.Action) 移除了。
  4. 这直接导致依赖 UpdateObserver 持续更新的多帧 Action 任务(例如使用 multiFrameFuncmultiFrameFunc2 并返回 Progress 的 Action)在执行一次更新后就意外停止,无法完成其预定逻辑。

预期行为 (Expected Behavior):
通过 AddUpdateObserver 添加的定时器(其 repeat_count 为 -1)应该在 Clock:Update 中持续被执行,直到它们被显式地通过 RemoveUpdateObserverRemoveTimer 移除,或者其所属的行为树节点停止。多帧 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 的重复逻辑按预期工作。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions