[动画] 施法/攻击后 castState 永不过期:单位一直停在施法动画,走路时朝着旧目标 #546
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
任何单位(本地玩家、其他玩家、怪物)收到一次
SkillCast(施法或普通攻击)以后:这和「人物移动时动画朝向与运动方向不一致」是同一类症状:
dd775c8修好了移动路径本身的朝向,但施法后残留的 castState 会把它盖掉。复现(运行时探针,main @ 8fcd223)
用
tests/e2e-d2gs-online/helpers.ts的createOnlineHudSession驱动真实的OnlineSession.buildRenderableUnits+buildSceneDrawables:untilMs只有 +400 ms)castState仍在57 ≈ 施法方向 56,31 ≈ 攻击方向 32;差的那 1 正是因为单位已经移动,每帧从新位置重新指向旧目标。
探针输出:
探针代码(临时放到 tests/ 下用 vitest 跑一次即可,不要提交)
原因
ClientWorld.applySkillCastToUnit写入unit.castState(L237),其中untilMs: now + 400(L235);本地玩家还会同时写self.castState(L238-L240)。UnitCastState.untilMs在src/里没有任何读取方,也没有任何代码清除ClientUnit.castState。唯一的清除点是MutableSelfPlayerState.reset()里的this.castState = undefined(L211),而它只在ClientWorld.reset()整体重置时被调用。OnlineSession.buildRenderableUnits对本地玩家优先使用 castState:selfMode = selfCastState.mode(L1327-L1328),盖过预测器给出的 WL / RN;selfDirection = selfUnit.direction(L1336-L1337),绕过预测器的predSnap.dir64;targetX/targetY传给绘制层(L1345-L1346)。mode = castState.mode || u.mode,targetX = castState?.targetX ?? u.targetX。unitFacingDir64每帧用dir64FromPoints(unit.x, unit.y, targetX, targetY)重算朝向(调用点 L485-L511),所以单位一边走,朝向一边被拧回旧目标。期望行为(1.13c)
predSnap.dir64。修复方向
UnitMove/UnitMode、或本地开始新路径时清除;最低限度也要在untilMs到期时清除。注意固定的 400 ms 不是 1.13c 数据,最终应改成由动画帧数驱动。u.targetX/u.targetY。每帧朝u.targetX重算朝向,和 1.13c「每段路径定一次朝向」不一致;目前唯一可能的可见影响是接近终点时的 FP16 抖动。引入:
8dac79e(R1-R5 online gameplay loops 中的 SkillCast 部分)。相关:#543、#544。