烘焙值与代码不一致导致切换时道具跳变

05/171 浏览开发经验
问题很清楚——场景 1 和场景 2 有各自独立的云端 patch,我们把场景 2 的 fengshi 代码改成了场景 1 的 patch 值 (0.328, 0.594),但场景 2 的 patch 可能存的是不同的值,导致 patch 覆盖后 puppetMoveTo 产生动画跳变。
让我先确认引擎是否有瞬时设置位置的 API。
关键发现!puppetMoveTo 只设置 targetX/targetY,然后通过 lerp 动画插值(第 1284-1285 行),而 patch 会同时设置 p.x 和 p.targetX(第 880-881 行)。所以要瞬时锁定位置,需要同时设置 x/y 和 targetX/targetY。
让我看看 puppetMoveTo 和 puppetEnter 的完整实现:
找到了!puppetEnter 在角色已经在台上时(p.visible and p.alpha > 0.5 and p.y > -0.1),只设置 targetX/targetY——等同于 puppetMoveTo,也是动画移动!
这就是问题:即使在 action 里调用 puppetMoveTo 或再次 puppetEnter,都是动画式移动,只要 patch 把位置改成了不同值,就会出现可见的滑动。
根本解决方案:需要瞬时设置位置(同时设置 p.x/p.y 和 p.targetX/p.targetY)。让我看看有没有现成的 API,或者需要加一个。
根因:之前用 puppetMoveTo 做位置锁定,但它只设置 targetX/targetY,通过 lerp 动画插值移动——如果云端 patch 把 p.x/p.y 设成了不同值,就会产生可见的滑动动画(从 patch 位置滑到 target 位置)。
而且每个场景有独立的 patch(scene_1、scene_2),场景 2 的 patch 中 fengshi 的位置很可能和场景 1 不同,导致切场景时看到封氏和桌椅"跳了一下"。
修复方案:新增 puppetSnapTo API,直接同时设置 p.x/p.y 和 p.targetX/p.targetY:
lua
复制
local function puppetSnapTo(id, x, y)
    local p = puppets_[id]
    if not p then return end
    p.x = x;  p.y = y          -- 当前位置(瞬时)
    p.targetX = x; p.targetY = y  -- 目标位置(无差值=无动画)
end
这样无论云端 patch 把位置改成什么值,action 里的 puppetSnapTo 都会瞬时覆盖到正确位置,不会有任何动画过渡。