d6c262ba93
The pre-2026-08-04 scan data was wrong in two systematic ways, and acting on
it wasted real time. Re-measured everything with tools/ against all 59 songs.
* Eleven tracks marked "WorkSheet 无 X 字段" do have the field, several with
substantial data: MobControlKeys (2392 keys), CyalumeControlKeys (2372),
nodeScaleList (57/59 songs), monitorCameraPos/LookAtKeys, sweatLocatorList,
facialNoiseKeys, charaMotionNoiseKeys, LipSyncPattern*, and the multi-camera
bloom keys. These are "just needs a C# declaration", not blocked.
* Six tracks marked "全 0 keyframe 空占位" carry thousands of keys. PostFilm
is the worst case at ~20200 keys over 59/59 songs; live-shader-todo.md was
right to rank it first and LIVE_TRACKS.md was wrong to write it off.
Rows that have been re-measured are tagged ✅实测; untagged rows are still old
data and should be re-verified before anyone acts on them. Priorities are now
ordered by measured data volume crossed with the kind of work required.
Also recorded:
* The stage shader colour/brightness channel table, and the warning that a
material's m_SavedProperties lists properties its current shader no longer
has — enumerate the shader, never trust that table.
* A working rule: no ground truth, no implementation. Guessing cost two wrong
PostFilm vignette implementations before it turned out the defining shader
is not shipped in any bundle. Note that "the property exists" is not "this
field maps to that property" — that distinction is why BgColor1's power ->
_ColorPower write was reverted while BlinkLight's was kept.
* A 「已知未解问题」 section splitting open items into: has ground truth so
can be built, lacks it so disabled, and rendering problems unrelated to the
timeline (the stage floor blowing out predates all of this work; the small
bulbs render black because their shaders expose no colour property at all).
* Song 1177 (stage live10149) is the reference song used throughout. Earlier
notes said 1157, which was wrong — that song uses stage live10146.
* The old UmaCrack tool paths are gone; tools/ replaces them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.5 KiB
7.5 KiB
Live Timeline 开发地图
系统架构
Asset Bundles(游戏加密包)
└── LiveTimelineWorkSheet(ScriptableObject,103 条轨道的关键帧数据)
└── LiveTimelineControl(每帧按帧号插值,触发事件)
└── Director(订阅事件,调用 Unity API)
├── GameObject / Transform → SetActive, position/rotation/scale
├── Camera → fieldOfView, transform
├── Light → color, intensity
├── MaterialPropertyBlock → toon shader 属性(已移植到 URP)
├── ParticleSystem → emission rate
├── RenderSettings → fog, ambient
└── URP Volume / Feature → 后处理效果
游戏原版 Built-in 管线;UmaViewer 用 URP 14(Unity 2022.3.62f1)。 Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完成的轨道。
轨道 → Unity API 对照
GameObject / Transform
| 轨道 | 状态 | 操作 |
|---|---|---|
| Object (33) | ✅ | SetActive |
| Transform (31) | ✅ | position / rotation / scale |
| WashLight (43) | ⚠️ | SetActive(颜色/投影未做) |
| Laser (44) | ⚠️ | SetActive + transform(blink 未做) |
| BlinkLight (45) | ⚠️ | SetActive + 子 Light(color1Array/BlendMode 未做) |
| Spotlight3d (68) | ✅ | SetActive + Light.color/intensity |
| Effect (60) | ✅ | Instantiate prefab |
Camera
| 轨道 | 状态 |
|---|---|
| CameraPos (1) / LookAt (2) / Fov (3) / Roll (4) | ✅ |
| CameraSwitcher (11) | ✅ |
| MultiCameraPos (53) / LookAt (54) | ✅ |
MaterialPropertyBlock → Shader
| 轨道 | 状态 | 属性 |
|---|---|---|
| BgColor1 (8) 角色分支 | ⚠️ | _CharaColor/_ToonDarkColor/_ToonBrightColor/_OutlineColor/_Saturation;vertexColorToonPower/outlineWidthPower/LightBlendMode/IsSilhouette 已填入 UpdateInfo 但 handler 还没用 |
| BgColor1 (8) 舞台分支 | ⚠️ | 2026-08-04 新增。遍历舞台层级按 Transform 名解析 Renderer,写 _MulColor0(已确认)。_AmbientColor 归 BgColor2,别抢 |
| GlobalLight (48) | ✅ | 角色 rim light 属性 |
| UVScrollLight (46) | ⚠️ | _MainTex offset 累积(已修 bug,mulColor 等未用) |
ParticleSystem
| 轨道 | 状态 |
|---|---|
| Particle (41) | ✅ emission.rateOverTime |
| ParticleGroup (42) | ✅ FlickerLightRate MinMaxCurve |
RenderSettings
| 轨道 | 状态 |
|---|---|
| GlobalFog (49) | ✅ fogColor / fogMode / fogDensity / fogStart / fogEnd |
| BgColor2 (9) | ✅ 写含 _AmbientColor 属性的舞台材质,Lerp(color1, white, value) |
URP Volume / RendererFeature
| 轨道 | 状态 |
|---|---|
| ChromaticAberration (73) | ⚠️ intensity 完成,通道偏移无 URP 对应 |
| ColorCorrection (61) | ⚠️ saturation 完成,depth/blend curve 无 URP 对应 |
| HdrBloom (38) | ❌ 0/58 首无数据,无需实现 |
| PostFilm (39) / RadialBlur (15) / TiltShift (63) / SunShafts (37) | ❌ 见后处理 TODO |
内部系统
| 轨道 | 状态 |
|---|---|
| CharaMotionSequence (7) / LipSync (12) / FormationOffset (28) | ✅ |
| FacialFace/Eye/Mouth 等 (18–25) | ✅ |
卡点分类
缺零件(知道要做什么,Unity/URP 没有现成组件)
| 轨道 | 缺什么 |
|---|---|
| PostFilm (39) / RadialBlur (15) / TiltShift (63) / SunShafts (37) | URP 无对应,需自写 ScriptableRendererFeature + shader → 见 live-shader-todo.md |
| LightProjection (74) | Projector 组件在 URP 不工作,需 DecalProjector 或自定义(36/58 首) |
| Environment (58) | Planar Reflection 系统完全没有(第二摄像机→RenderTexture→地板 shader)(48/58 首) |
| LensFlare (57) | 舞台用 CustomLensFlare 脚本,UmaBuild 无源码;可先做 SetActive(45/58 首) |
没 dump 找明白(不知道打哪里)
dump 工具链已于 2026-08-04 重建(
tools/),这一类现在可以自己解决:~/.venvs/umatools/bin/python3 tools/dump_cutt_typetree.py --tree <字段名> <songid>出结构,--sample <字段名> <songid>出第一个真实关键帧的值。
| 轨道 | 不明白什么 |
|---|---|
| MonitorControl (10) | dispID 0–15 不对应 monitor 材质索引,内容资源路径未知;颜色/UV 控制可先做(3911 keys / 55 首) |
| AdditionalLight (82) | 字段结构未知,但 AdditionalLightList 确认存在,657 keys / 23 首 → 用 --tree AdditionalLightList 即可 dump |
可以直接做
| 轨道 | 工作 | 难度 |
|---|---|---|
| BgColor1 (8) 缺字段 | 补 vertexColorToonPower/outlineWidthPower/IsSilhouette/LightBlendMode |
★☆☆ |
| BlinkLight (45) 缺字段 | color1Array 多色循环、LightBlendMode |
★★☆ |
| Billboard (75) | 始终朝摄像机面片,Unity 有内置 LookAt 逻辑(12/58 首) | ★☆☆ |
| AdditionalLight (82) | 先 dump 字段再实现(22/58 首) | 待评估 |
未实现轨道优先级
完整分级见 LIVE_TRACKS.md 末尾「优先级排序」。2026-08-04 用 tools/ 全量重测后重排(59 首全语料,数字是总 keyframe 数):
- BgColor1 (8) 舞台分支 — 43617 keys / 59首,全语料最大轨道。分发过滤已拆,通道已确认为
_MulColor0;剩BgBL/FollowSpotColor/Shadow/mob_004 个非物件名的组待定 - BlinkLight (45) 补字段 — 19420 keys / 57首,灯光线最大权重(含全部
*_wash_*效果) - PostFilm (39) — ~20200 keys / 59首(三字段合计),未实现里最大的一块。旧记录说它「全 0 keyframe」是错的
- FacialToon (47) — 6341 keys / 59首,只差 C# 字段 + handler
- PostEffectDOF (13) — 3879 keys / 59首,URP 有内置 DepthOfField,属路径 A
- VolumeLight / SunShafts (37) — 2048 keys / 58首,字段表齐全,做通后 URP Feature 就有模板
- LightProjection (74) — 3793 keys / 37首,URP 下 Projector 不工作
- Environment (58) — 1375 keys / 49首,Planar Reflection 从零搭
Environment 之前排第一,现已后移:它属于「从零搭系统」,而 1、2 属于「数据早就在手但没用上」,性价比高一个量级。
旧的 ❌「WorkSheet 无字段」判断多数是错的 —— MobControl / CyalumeControl / NodeScale / SweatLocator / MonitorCameraPos / MonitorCameraLookAt / FacialNoise / CharaMotionNoise 的字段都存在且有数据,它们属于「只差 C# 声明」的第三档,不是被卡住。
关键文件
| 文件 | 说明 |
|---|---|
Assets/Scripts/umamusume/Gallop/Live/Director.cs |
事件订阅 + 所有 handler |
Assets/Scripts/umamusume/Gallop/Live/Cutt/LiveTimelineControl.cs |
每帧插值 + 事件触发 |
Assets/Scripts/umamusume/Gallop/Live/Cutt/LiveTimelineWorkSheet.cs |
所有轨道字段声明 |
Assets/Scripts/umamusume/Gallop/Live/Cutt/LiveTimelineDataList/ |
各轨道数据类 |
Assets/Scripts/umamusume/Gallop/Live/StageController.cs |
StageObjectMap(按名字查舞台对象);IsTimelineControlledLight() 决定哪些对象默认 inactive(blinklight/spotlight3d/_wash_/laser) |
Assets/Resources/RenderPipeline/UMAUniversalRenderPipelineAsset_Renderer.asset |
RendererFeature 注册位置 |
LIVE_TRACKS.md |
103 条轨道全览(ID/覆盖率/状态/Bug) |
live-shader-todo.md |
后处理轨道实现细节 |