Skip to content

fix(animation): preserve dirty state and legacy targets - #822

Merged
star-e merged 13 commits into
cocos:mainfrom
knoxHuang:codex/animation-dirty-state-separation
Aug 11, 2026
Merged

fix(animation): preserve dirty state and legacy targets#822
star-e merged 13 commits into
cocos:mainfrom
knoxHuang:codex/animation-dirty-state-separation

Conversation

@knoxHuang

@knoxHuang knoxHuang commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

变更说明

  • 将 Animation Clip 的脏状态与宿主 Scene 的脏状态分离:状态查询单独提供 sceneDirty,动画操作同时明确是否产生了 Animation-scoped Undo 记录。
  • 保存 Animation Clip 副本时仅写入目标资源;不恢复或重绑定源 Clip,不抑制源 Clip 刷新,也不会清除源会话的 Undo 脏状态或推进其基线。
  • Scene/Prefab 的“另存为”保持源编辑器、源资源绑定和未保存状态;普通“保存”对已存在的源资源不再隐式切换为写入其他目标。
  • 删除源资源后的恢复保存仍会在成功后打开新目标资源,与普通“另存为”的源资源保留语义保持区分。
  • 恢复既有 nodeUuid 输入兼容性:属性轨道和帧采样优先使用 nodePath;仅传 nodeUuid 的旧调用仍可解析当前动画根节点内的目标,但轨道只持久化 canonical nodePath,避免 Runtime reload 后陈旧 UUID 劫持轨道。
  • Clip Save As 将调用方传入的目标路径原样转交 Asset Manager;补充 Windows fsPath 回归覆盖。
  • EditorProxyIPublicEditorService 及 MCP 公共声明保持不变;本次内部 Scene 进程能力无需扩展 MCP API。

设计说明

Scene Editor Service 负责区分普通保存、源资源存在时的另存为,以及删除源资源后的恢复保存。Animation Service 在副本保存分支完成写入后立即返回,使源 Clip 的保存后恢复、Undo 基线更新和 Scene 保存逻辑仅作用于普通源资源保存。

nodeUuid 保留为旧调用的兼容输入而不是新的轨道持久化标识:有路径时路径优先;无路径时才以 UUID 在当前动画根节点内求出相对路径。该边界同时修复 DTS breaking-change 检查与旧调用的运行时行为。

验证

  • 已 rebase 到 origin/main6f810d60
  • Node.js v22.20.0:7 个相关回归套件、90 个测试通过。
  • Node.js v22.20.0:DTS 生成、9 个 DTS snapshot 测试、58 个声明测试及声明 typecheck 通过。
  • git diff --check 通过;生成 DTS 后没有产生未提交的声明或 snapshot 改动。

验证边界

  • 请求的 Node.js v22.17.9 未安装,因此未擅自下载;相关回归使用已安装的 v22.20.0 执行。
  • 完整 scene.test.ts 已在 Node.js v24.15.0 尝试运行,但在执行用例前被本地过期的 node_modules/@cocos/asset-db 阻塞:最新 main 已切换到新的 workspace Asset DB API,而当前安装包缺少 IAssetFileSystemProviderAssetActionEnum 等导出。该命令实际执行 0 个用例;未在未授权下重装依赖或重建原生模块。CI 的 clean npm ci 仍是完整 Scene 集成验证门槛。

QA 验证步骤

  1. 在 Assets 面板双击打开 A.prefab
  2. 选择 File > Save As...,将其保存为 B.prefab
  3. 刷新 Hierarchy,确认当前仍打开 A.prefab,且根节点仍关联 A.prefab,不会指向 B.prefab
  4. 修改 A.prefab 后再次选择 File > Save As... 创建副本;确认当前标签仍为 A.prefab,其未保存状态不会因创建副本而消失。
  5. 单独打开 B.prefab,确认它是包含复制内容的独立资源。

@knoxHuang knoxHuang changed the title fix(animation): separate scene dirty state from clip dirty state [break] fix(animation): separate scene dirty state from clip dirty state Aug 4, 2026
@knoxHuang
knoxHuang force-pushed the codex/animation-dirty-state-separation branch from 2addb85 to 7b4308f Compare August 4, 2026 10:00
@knoxHuang
knoxHuang force-pushed the codex/animation-dirty-state-separation branch 2 times, most recently from 84107ae to 45062b1 Compare August 6, 2026 11:11
@knoxHuang knoxHuang closed this Aug 7, 2026
@knoxHuang knoxHuang reopened this Aug 7, 2026
@knoxHuang
knoxHuang force-pushed the codex/animation-dirty-state-separation branch 5 times, most recently from 75f5598 to e472992 Compare August 10, 2026 10:24
@knoxHuang knoxHuang changed the title [break] fix(animation): separate scene dirty state from clip dirty state fix(animation): separate scene and clip dirty state Aug 10, 2026
@knoxHuang
knoxHuang force-pushed the codex/animation-dirty-state-separation branch from 6a510dc to af3c66a Compare August 11, 2026 04:36
@knoxHuang knoxHuang changed the title fix(animation): separate scene and clip dirty state fix(animation): preserve dirty state and legacy targets Aug 11, 2026
@star-e
star-e merged commit 90366ca into cocos:main Aug 11, 2026
4 checks passed
@knoxHuang
knoxHuang deleted the codex/animation-dirty-state-separation branch August 11, 2026 06:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants