docs: correct the track data, record what is blocked and why
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>
This commit is contained in:
@@ -22,16 +22,34 @@ Game assets are encrypted. Key files:
|
||||
|
||||
**Bundle decryption** (`UmaAssetBundleStream.cs`): header (first 256 bytes) is plain; bytes ≥256 are XOR'd with `FKey = ABKey[i] XOR bundleKey_bytes[j]`.
|
||||
|
||||
**meta DB decryption**: `UmaDatabaseController.ReadMetaFromEncryptedDb()` uses `sqlite3mc_x64.dll` with cipher=3 (ChaCha20). Final key = `DBKey[i] XOR DBBaseKey[i % 13]`. A decrypted copy lives at `C:\Users\riten\Desktop\UmaCrack\meta_plain.db`.
|
||||
**meta DB decryption**: `UmaDatabaseController.ReadMetaFromEncryptedDb()` uses `sqlite3mc_x64.dll` with cipher=3 (ChaCha20). Final key = `DBKey[i] XOR DBBaseKey[i % 13]`.
|
||||
|
||||
**Asset bundle paths** (key formats):
|
||||
- Live cutt timelines: `cutt/cutt_son{music_id}/cutt_son{music_id}`
|
||||
- Live effect prefabs: `3d/effect/live/pfb_{effectName}`
|
||||
- Stage prefabs: `3d/env/live/live{bgId}/pfb_env_live{bgId}_controller000`
|
||||
|
||||
**Python tools** (`C:\Users\riten\Desktop\UmaCrack\`):
|
||||
- `dump_meta_cutt.py` — decrypts meta DB → `meta_plain.db`, run with Windows Python
|
||||
- `read_cutt_effect.py` — loads cutt bundles via UnityPy, dumps WorkSheet field TypeTrees
|
||||
**Python tools** (`tools/`) — rebuilt 2026-08-04 after the old `UmaCrack\` toolchain was deleted. Run with `~/.venvs/umatools/bin/python3` (needs `UnityPy` + `apsw-sqlite3mc`, **not** plain `apsw`; see `tools/requirements.txt`).
|
||||
|
||||
| Script | Use |
|
||||
|---|---|
|
||||
| `uma_common.py` | Library: key constants, `decrypt_bundle_bytes()`, `MetaDb` (path→hash, UnityPy load) |
|
||||
| `dump_meta.py` | `plain` → `out/meta_plain.db` · `find <LIKE>` · `info <path>` (hash, dat path, deps, `[NOT DOWNLOADED]`) · `songs` |
|
||||
| `dump_bundle.py` | `list` / `tree` / `json` / `save` / `gameobjects`, `--deps` |
|
||||
| `dump_cutt_typetree.py` | **Authoritative track schema.** `--fields <song>` · `--tree <field> <song>` · `--sample <field> <song>` · `--groups` |
|
||||
| `scan_live_tracks.py` | All 59 songs → `out/scan_keys.csv`, `scan_groups.csv`, `scan_summary.txt`, `scan.json` (~21 s) |
|
||||
|
||||
Notes: `meta` decrypts via sqlite3mc `PRAGMA cipher='chacha20'` + `PRAGMA hexkey='<64 hex>'` (the `key=x'...'` and `raw:` forms both fail); `VACUUM INTO` re-encrypts the target, so `dump_meta.py plain` copies schema+rows explicitly.
|
||||
|
||||
**Cutt bundles ship full TypeTrees, so field names and keyframe counts from these tools are ground truth.** All 70 worksheets across all 59 songs share one 128-field schema — no version drift. Only `son<id>_camera` and `type_01..type_10` carry the trees; the `cutt_son<id>` prefab and `data` bundles are stripped.
|
||||
|
||||
**Getting a track's real field name without the dump tools** — Unity matches bundle TypeTree fields by name, case-sensitively. A field whose name doesn't match is never populated (it does *not* become null — Unity initialises every serialised `List<T>` to an empty list, so null-vs-empty tells you nothing). To test a candidate name, declare it on `LiveTimelineWorkSheet` and check whether it receives keys:
|
||||
|
||||
```csharp
|
||||
LiveTimelineWorksheetDiag.Probe(sheet, "candidateFieldName");
|
||||
```
|
||||
|
||||
Unsure about casing? Declare both spellings side by side — only the correct one fills. This is how `WashLightList` (capital W) was confirmed; note upstream katboi01 uses `washLightList`, which never populates.
|
||||
|
||||
## Live Timeline Architecture
|
||||
|
||||
@@ -56,8 +74,62 @@ StageController.cs ← manages stage GameObjects, StageObjectMap
|
||||
|
||||
**Important:** `LiveTimelineKeyWithInterpolate` already declares `frame`, `attribute`, `interpolateType`, `curve`, `easingType` — do NOT redeclare these in subclasses.
|
||||
|
||||
**Stage shader colour channels** (enumerated at runtime via `Shader.GetPropertyType`, confirmed on stage live10149 / song 1177):
|
||||
|
||||
| shader | colour | brightness | other |
|
||||
|---|---|---|---|
|
||||
| `Gallop/3D/Live/Stage/DefaultNoAmbient` | `_MulColor0` | `_ColorPower` | |
|
||||
| `Gallop/3D/Live/Stage/DefaultEnvMapNoAmbient` | `_MulColor0` | `_ColorPower` | `_AddColor`, `_EnvMap` |
|
||||
| `Gallop/3D/Live/Stage/DefaultTransparentNoAmbient` | `_MulColor0` | `_ColorPower` | `_AmbientColor` |
|
||||
| `Gallop/3D/Live/Stage/LightBlinkBlend` | `_BlinkLightColor` | `_ColorPower` | `_SrcBlend`/`_DstBlend` |
|
||||
| `Gallop/3D/Live/Stage/LightBlend` / `LightAdd1` | `_MulColor0`, `_MulColor1` | `_ColorPower`, `_ColorPowerMultiply` | |
|
||||
| `Gallop/3D/Live/Stage/Laser` | `_MulColor0`, `_MulColor1` | `_ColorPower` | `_RandomValue` |
|
||||
| `Gallop/3D/Bg/BgMirrorBall` | `_MulColor0` | **(none)** | |
|
||||
| `Gallop/3D/Live/Stage/StageMirrorBallShine` | (none) | | |
|
||||
| `Gallop/3D/Live/Stage/StageTransmittedLightMask` | (none) | | `_TransmittedLightMaskScale` |
|
||||
|
||||
**Brightness is a separate channel — do not fold it into the colour.** Write the key's colour to the colour property and its `power` to `_ColorPower`; let the shader combine them. Only fall back to `colour * power` where `_ColorPower` is absent (`BgMirrorBall`).
|
||||
|
||||
Dump any shader's real property table with:
|
||||
|
||||
```python
|
||||
# tools/, via ~/.venvs/umatools/bin/python3
|
||||
env = MetaDb().load("shader") # 499 shaders
|
||||
pf = obj.read_typetree()["m_ParsedForm"] # m_Name, m_PropInfo.m_Props
|
||||
```
|
||||
|
||||
**`_MulColor0` is on every stage shader and is BgColor1's channel; `_AmbientColor` belongs to BgColor2.** They are separate properties on the same shader, so the two tracks must not write the same one. Same naming family as WashLight's `MulColor0` and UVScrollLight's `mulColor1`.
|
||||
|
||||
⚠️ A material's `m_SavedProperties` in the bundle lists properties it no longer has — it retains entries from whatever shader it was authored against. `Material.HasProperty()` asks the *current shader*. Always enumerate the shader, never trust the bundle's saved-property table.
|
||||
|
||||
**Track group names are not always GameObject names.** Four separate silent failures were traced to this in one session, so check the mapping before assuming a track is unimplemented:
|
||||
- a whitelist filter in the dispatcher dropped 92% of BgColor1's keys (`validBgColorNames`)
|
||||
- `StageObjectMap` dedupes by name, so a crowd of 66 same-named objects only ever got its first member
|
||||
- the Object track's `neonsign` is a `_stageObjectUnits` **unit name**, not a GameObject — no object of that name exists
|
||||
- `ObjectUpdateInfo.OffsetType` was populated by the dispatcher but never read by `StageController`, so `Add`-relative positions were written as absolute
|
||||
|
||||
All four failed silently, with no error. Treat a track that "works" but looks wrong as a routing problem first.
|
||||
|
||||
**StageObjectMap:** Stage child GameObjects are indexed by name. Objects whose names match `IsTimelineControlledLight()` (`blinklight`, `spotlight3d`, `_wash_`, `laser`) start `SetActive(false)` — their handlers call `SetActive(true)` when the track fires. All other objects (neonsigns, glow meshes, UV scroll objects, etc.) keep their prefab default state.
|
||||
|
||||
## Working rule: no ground truth, no implementation
|
||||
|
||||
Field names, keyframe values and shader property tables are all recoverable from the bundles
|
||||
(`tools/`), so **verify before you write code** — and when something genuinely cannot be
|
||||
recovered, leave it unimplemented with a TODO rather than guessing a value.
|
||||
|
||||
Guessing has cost real time in this project: the PostFilm vignette geometry was guessed twice
|
||||
(full-screen wash, then a huge border) before it turned out the defining shader isn't shipped in
|
||||
any bundle. `PostFilmRendererFeature._enableRendering` is now `false` for exactly this reason.
|
||||
|
||||
Note the distinction that has caught me out: *"the property exists"* is not *"this field maps to
|
||||
that property"*. `_ColorPower` is present on the stage shaders, but there is no evidence that
|
||||
BgColor1's `power` field drives it — so that write was reverted while BlinkLight's was kept
|
||||
(there the shader `LightBlinkBlend` is named for the track and pairs `_BlinkLightColor` with
|
||||
`_ColorPower`, which is a much tighter fit).
|
||||
|
||||
Open items and why each is blocked are tracked in `LIVE_TRACKS.md` → 「已知未解问题」.
|
||||
|
||||
## Currently Implemented Tracks
|
||||
|
||||
| Track | Data class | Notes |
|
||||
@@ -66,7 +138,7 @@ StageController.cs ← manages stage GameObjects, StageObjectMap
|
||||
| CharaMotionSequence | existing | |
|
||||
| Facial / LipSync / FormationOffset | existing | |
|
||||
| GlobalLight (48) | existing | sets rim light shader props on characters |
|
||||
| BgColor1 | existing | sets toon shader color props on characters (`_CharaColor`, `_ToonDarkColor`, etc.) |
|
||||
| BgColor1 | existing | **two branches.** Groups named `CharaCenter/CharaLeft/CharaRight/CharaColor` (`LiveTimelineControl.CharaBgColorNames`) → character toon props (`_CharaColor`, `_ToonDarkColor`, …). Every other group name → stage renderers, resolved by walking the whole stage hierarchy for same-named Transforms (`Director.ResolveStageTargets`), writing **`_MulColor0`** via `MaterialPropertyBlock`. |
|
||||
| BgColor2 | existing | sets `_AmbientColor` on stage renderers via `Lerp(color1, color2, value)` |
|
||||
| Transform / Object | existing | handled by `StageController.cs` |
|
||||
| Effect (60) | `LiveTimelineEffectData` | loads prefab from `3d/effect/live/pfb_{name}` |
|
||||
@@ -78,12 +150,16 @@ StageController.cs ← manages stage GameObjects, StageObjectMap
|
||||
| Particle (41) | `LiveTimelineParticleData` | sets ParticleSystem.emission.rateOverTime |
|
||||
| ParticleGroup (42) | `LiveTimelineParticleGroupData` | sets FlickerLightRate |
|
||||
| ChromaticAberration (73) | `LiveTimelineChromaticAberrationData` | URP `ChromaticAberration.intensity` ← `power`;per-channel offset 无法映射 |
|
||||
| HdrBloom (38) | `LiveTimelineHdrBloomData` | URP `Bloom.intensity/threshold`;字段未经 bundle 确认 |
|
||||
| HdrBloom (38) | `LiveTimelineHdrBloomData` | **dead code** — 0/58 songs carry data (`hdrBloomKeys` empty in every scan and in the song-1177 dump). Safe to delete. |
|
||||
| ColorCorrection (61) | `LiveTimelineColorCorrectionData` | URP `ColorAdjustments.saturation` + `ColorCurves` RGB;depth/blend curve 无 URP 对应 |
|
||||
| BlinkLight | `LiveTimelineBlinkLightData` | SetActive + child Light color/intensity from timeline data (56/58 songs) |
|
||||
| WashLight | `LiveTimelineWashLightData` | SetActive only — RaycastDistance/CameraProjection fields unused (5/58 songs) |
|
||||
| BlinkLight | `LiveTimelineBlinkLightData` | SetActive + child Light color/intensity (56/58 songs). **Biggest lighting payload by far** — 全语料 19420 keys / 57 songs, and over half are named `*_wash_*` (`wash_truss_a` 147, `wash_truss_b` 147, `wash_ground_a` 51, …). `color1Array` / `LightBlendMode` / `isReverseHueArray` still unused. |
|
||||
| WashLight | `LiveTimelineWashLightData` | SetActive only (5/58 songs). Low value: real "wash light" output comes from the BlinkLight `*_wash_*` groups above, not this track — song 1177 has just 1 group / 11 keys here. |
|
||||
| Laser | `LiveTimelineLaserData` | SetActive + position/rotation/scale — blink/raycast not implemented (6/58 songs) |
|
||||
|
||||
## Track Coverage (from 58-song scan)
|
||||
|
||||
All high-priority tracks from the 58-song scan are now implemented. Field definitions are obtained by running `read_cutt_effect.py` to dump the WorkSheet TypeTree from a cutt bundle.
|
||||
**The pre-2026-08-04 scan data in `LIVE_TRACKS.md` was wrong** and has been re-measured with `tools/`. Two systematic errors: a batch of tracks marked "WorkSheet 无 X 字段" do have the field (`MobControlKeys`, `CyalumeControlKeys`, `nodeScaleList`, `sweatLocatorList`, `monitorCameraPos/LookAtKeys`, `facialNoiseKeys`, `charaMotionNoiseKeys`, …), and a batch marked "全 0 keyframe 空占位" carry thousands of keys (`postFilmKeys`/`postFilm2Keys`/`postFilm3Keys` ≈20 200 keys over 59/59 songs, `radialBlurKeys`, `tiltShiftKeys`, `charaFootLightKeys`, …). Rows tagged ✅实测 are trustworthy; untagged rows are still old data. **Re-verify with `tools/` before acting on any untagged row.**
|
||||
|
||||
Coverage numbers measure **what exists in the bundles**, not what the C# consumes — the two diverge. When a track looks under-powered, check the dispatcher in `AlterUpdate_*` for filters before assuming it's unimplemented (BgColor1 was dropping ~92% of its keys that way).
|
||||
|
||||
**Measuring what a song actually carries**: `LiveTimelineWorksheetDiag.Dump()` is called from `Director.InitializeTimeline()` and logs, per worksheet, every track field with its group names and key counts. Confirmed on song 1177: `worksheetList.Count == 1`, `SheetType == MainLive`, so reading `worksheetList[0]` loses nothing.
|
||||
|
||||
+23
-12
@@ -44,7 +44,8 @@ Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完
|
||||
### MaterialPropertyBlock → Shader
|
||||
| 轨道 | 状态 | 属性 |
|
||||
|------|------|------|
|
||||
| BgColor1 (8) | ⚠️ | `_CharaColor/_ToonDarkColor/_ToonBrightColor/_OutlineColor/_Saturation`(vertexColorToonPower 等未传) |
|
||||
| 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 等未用) |
|
||||
|
||||
@@ -89,10 +90,14 @@ Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完
|
||||
|
||||
### 没 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 控制可先做(★★/58 首)|
|
||||
| AdditionalLight (82) | 字段未 dump,结构未知(22/58 首)|
|
||||
| MonitorControl (10) | `dispID` 0–15 不对应 monitor 材质索引,内容资源路径未知;颜色/UV 控制可先做(3911 keys / 55 首)|
|
||||
| AdditionalLight (82) | 字段结构未知,但 `AdditionalLightList` 确认存在,657 keys / 23 首 → 用 `--tree AdditionalLightList` 即可 dump |
|
||||
|
||||
### 可以直接做
|
||||
|
||||
@@ -105,16 +110,22 @@ Toon shader 已移植,卡住的主要是全屏后处理和几个逆向未完
|
||||
|
||||
---
|
||||
|
||||
## 未实现轨道优先级(综合覆盖率 + 难度)
|
||||
## 未实现轨道优先级
|
||||
|
||||
1. **AdditionalLight (82)** — 22/58 首,先 dump 评估
|
||||
2. **Billboard (75)** — 12/58 首,简单
|
||||
3. **BgColor1 缺字段** — 58/58 首都有,补全影响所有歌
|
||||
4. **LensFlare SetActive (57)** — 45/58 首,先做 enableFlare 这一层
|
||||
5. **后处理系列** — 见 `live-shader-todo.md`
|
||||
6. **MonitorControl 框架 (10)** — 颜色/UV 先做,dispID 留 TODO
|
||||
7. **LightProjection (74)** — 工程量大
|
||||
8. **Environment (58)** — 最复杂,Planar Reflection 从零搭
|
||||
完整分级见 `LIVE_TRACKS.md` 末尾「优先级排序」。**2026-08-04 用 `tools/` 全量重测后重排**(59 首全语料,数字是总 keyframe 数):
|
||||
|
||||
1. **BgColor1 (8) 舞台分支** — **43617 keys / 59首**,全语料最大轨道。分发过滤已拆,通道已确认为 `_MulColor0`;剩 `BgBL`/`FollowSpotColor`/`Shadow`/`mob_00` 4 个非物件名的组待定
|
||||
2. **BlinkLight (45) 补字段** — **19420 keys / 57首**,灯光线最大权重(含全部 `*_wash_*` 效果)
|
||||
3. **PostFilm (39)** — **~20200 keys / 59首**(三字段合计),未实现里最大的一块。旧记录说它「全 0 keyframe」是错的
|
||||
4. **FacialToon (47)** — 6341 keys / 59首,只差 C# 字段 + handler
|
||||
5. **PostEffectDOF (13)** — 3879 keys / 59首,URP 有内置 DepthOfField,属路径 A
|
||||
6. **VolumeLight / SunShafts (37)** — 2048 keys / 58首,字段表齐全,做通后 URP Feature 就有模板
|
||||
7. **LightProjection (74)** — 3793 keys / 37首,URP 下 Projector 不工作
|
||||
8. **Environment (58)** — 1375 keys / 49首,Planar Reflection 从零搭
|
||||
|
||||
> Environment 之前排第一,现已后移:它属于「从零搭系统」,而 1、2 属于「数据早就在手但没用上」,性价比高一个量级。
|
||||
>
|
||||
> **旧的 ❌「WorkSheet 无字段」判断多数是错的** —— MobControl / CyalumeControl / NodeScale / SweatLocator / MonitorCameraPos / MonitorCameraLookAt / FacialNoise / CharaMotionNoise 的字段都存在且有数据,它们属于「只差 C# 声明」的第三档,不是被卡住。
|
||||
|
||||
---
|
||||
|
||||
|
||||
+126
-43
@@ -8,6 +8,23 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
|
||||
数据来源:LiveTimelineDefine.cs 枚举 + WorkSheet CS字段核查 + scan_full.py全量扫描(58首歌,2026-05-07)+ Director/Control代码审查
|
||||
|
||||
> **术语**:下文「WorkSheet 有/无 XXX 字段」指的是**游戏 bundle 的 TypeTree**,不是本仓库的 C# `LiveTimelineWorkSheet` 类。两者是分开的:`postFilmKeys`、`radialBlurKeys`、`tiltShiftKeys`、`flashPlayerKeys`、`charaFootLightKeys`、`MultiLightShadowKeys`、`lightProjectionList`、`postFilm1MultiCameraKeys`、`postEffectDOFKeys` 在 bundle 里有,在 C# 里**都还没声明**。
|
||||
>
|
||||
> **覆盖率数字同理**——「N/58 首」量的是 bundle 里有没有数据,不代表 C# 收得到。分发层的过滤可能让有数据的轨道照样落空(BgColor1 就是如此,见 ID 8)。
|
||||
>
|
||||
> ## ⚠️ 2026-08-04:旧扫描数据不可信,已用新工具全量重测
|
||||
>
|
||||
> `tools/` 下的 dump 工具链已重建(见 `CLAUDE.md`)。cutt bundle 自带完整 TypeTree,**字段名和 keyframe 数是权威的**。全 59 首、70 张 worksheet 共享同一套 schema(128 字段),无版本漂移。
|
||||
>
|
||||
> 重测结果与本文件原有记录冲突严重,**下表中带「✅实测」标记的才是可信数据**,其余未标记的行仍是旧扫描结论,谨慎对待。两类系统性错误:
|
||||
>
|
||||
> 1. **「WorkSheet无XXX字段」全部是错的** —— 那些字段都存在,而且多数有大量数据(见 ID 26/27/51/52/59/70/77/84/85/98/99)
|
||||
> 2. **「全0 keyframe空占位」多数是错的** —— RadialBlur/PostFilm/TiltShift/FlashPlayer/CharaFootLight/MultiLightShadow 实测都有真实数据(见 ID 15/39/63/66/72/83)
|
||||
>
|
||||
> 真正确认为空的只有:`hdrBloomKeys`、`other4EyeTrackKeys`、`ScreenCaptureDataList`、`tailMotionDataList`(0/59 首)。
|
||||
>
|
||||
> 复查命令:`~/.venvs/umatools/bin/python3 tools/dump_cutt_typetree.py --fields <songid>`;全量表在 `tools/out/scan_summary.txt`。
|
||||
|
||||
**实现状态图例**
|
||||
- ✅ 完整
|
||||
- ⚠️ 部分实现(有TODO)
|
||||
@@ -28,18 +45,18 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
| 2 | CameraLookAt | 主摄像机朝向 | ✅ | — |
|
||||
| 3 | CameraFov | 视野角 | ✅ | — |
|
||||
| 4 | CameraRoll | 摄像机滚转 | ✅ | — |
|
||||
| 5 | HandShakeCamera | 手持抖动效果 | ❌ | — |
|
||||
| 5 | HandShakeCamera | 手持抖动效果 | ❌ | ✅实测 `handShakeCameraKeys` 56/59首 / 594 keys |
|
||||
| 6 | Event | 时间轴触发事件 | ❌ | — |
|
||||
| 7 | CharaMotionSequence ★(5) | 角色动作序列切换 | ✅ | — |
|
||||
| 8 | BgColor1 ★(13) | 角色色调/轮廓/阴影颜色 | ✅ | — |
|
||||
| 8 | BgColor1 ★(13) | 角色**和舞台物件**的色调/轮廓/阴影颜色 | ⚠️ | 曾误标 ✅。`AlterUpdate_BgColor1` 原本用 `validBgColorNames` 只放行 4 个角色组,其余全丢——实测约 92% 的 key 被丢弃(全语料 43617 keys / 59首,是最大的轨道)。2026-08-04 已拆掉过滤并加舞台分支,**舞台侧写 `_MulColor0`**(运行时枚举 shader 确认,每个舞台 shader 都有;`_AmbientColor` 归 BgColor2,两者是同一 shader 上的独立通道)。song 1177 的 20 组里 16 组已正常写入,仍未解析:`BgBL`(256 keys)、`FollowSpotColor`(16)、`Shadow`(2)、`mob_00`(2) —— 这 4 个不是物件名,疑为全局通道 |
|
||||
| 9 | BgColor2 ★(1) | 背景渐变/环境色(两色混合)【15/58首】 | ✅ | 写含 `_AmbientColor` 属性的舞台材质,颜色 = `Lerp(color1, color2, value)`;color2 恒为白色 |
|
||||
| 10 | MonitorControl ★(2) | LED舞台屏幕内容控制 | ❌ | — |
|
||||
| 10 | MonitorControl ★(2) | LED舞台屏幕内容控制 | ❌ | ✅实测 `monitorControlList` **55/59首 / 3911 keys**。**舞台上的黑色大屏就是它没实现导致的**:monitor 材质的 `_MainTex`/`_FadeTex`/`_FilterTex` 三个贴图槽在 bundle 里全未绑定,内容靠运行时喂。字段:`dispID` / `speed` / `outputTextureLabel` / `blendFactor` / `Src·DstBlendMode` / `RenderQueueNo` / `LightImageNo` / `CrossFadeRate` / `FilterTexScale`。**内容资源已定位**:`live/uvmovie/gal_uvmovie_<songid>_<001..017>`(图片序列,带 `_tex_NN`),另有 `gal_uvmovie_<songid>_light` 对应 `LightImageNo`。全库 219 个 uvmovie 目录。**但 dispID→资源的映射未解**:song 1177 的 key 是 `dispID=1`,却既没有 `gal_uvmovie_1177_001`,也没有 monitorCamera 数据(`monitorCameraPosKeys` 0 keys),两条路都不通 |
|
||||
| 11 | CameraSwitcher | 切换活动摄像机 | ✅ | — |
|
||||
| 12 | LipSync | 口型同步 | ✅ | — |
|
||||
| 13 | PostEffectDOF | 景深模糊(单机) | ❌ | — |
|
||||
| 14 | PostEffectBloomDiffusion | 泛光扩散(单机) | ❌ | — |
|
||||
| 15 | RadialBlur | 径向运动模糊(单机) | ❌ | WorkSheet有radialBlurKeys字段,58/58首存在但全部0 keyframe(空占位) |
|
||||
| 16 | CameraLayer | 摄像机渲染层遮罩 | ❌ | — |
|
||||
| 13 | PostEffectDOF | 景深模糊(单机) | ❌ | ✅实测 `postEffectDOFKeys` **59/59首 / 3879 keys**。URP 有内置 DepthOfField,属路径 A |
|
||||
| 14 | PostEffectBloomDiffusion | 泛光扩散(单机) | ❌ | ✅实测 `postEffectBloomDiffusionKeys` **59/59首 / 1969 keys** |
|
||||
| 15 | RadialBlur | 径向运动模糊(单机) | ❌ | ✅实测 `radialBlurKeys` **59/59首 / 1667 keys**(单曲最多95)。旧记录「全部0 keyframe」是错的 |
|
||||
| 16 | CameraLayer | 摄像机渲染层遮罩 | ❌ | ✅实测 `cameraLayerKeys` **58/59首 / 3306 keys** |
|
||||
| 17 | Projector ★(4) | 舞台投影仪(gobo图案) | ❌ | — |
|
||||
|
||||
---
|
||||
@@ -56,10 +73,10 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
| 23 | FacialEyeTrack | 眼球追踪目标 | ✅ | — |
|
||||
| 24 | FacialEar | 耳部动画 | ✅ | — |
|
||||
| 25 | FacialEffect | 表情叠加特效 | ✅ | — |
|
||||
| 26 | FacialNoise | 表情随机扰动 | ❌ | WorkSheet无facialNoiseKeys字段 |
|
||||
| 27 | CharaMotionNoise | 动作随机扰动 | ❌ | WorkSheet无charaMotionNoiseKeys字段 |
|
||||
| 26 | FacialNoise | 表情随机扰动 | ❌ | ✅实测 `facialNoiseKeys` **存在**,50/59首 / 127 keys。旧记录「无字段」是错的 |
|
||||
| 27 | CharaMotionNoise | 动作随机扰动 | ❌ | ✅实测 `charaMotionNoiseKeys` **存在**,**59/59首** / 135 keys。旧记录「无字段」是错的 |
|
||||
| 28 | FormationOffset | 角色队形位置偏移 | ✅ | — |
|
||||
| 29 | Animation ★(1) | GameObject Animation组件序列 | ❌ | — |
|
||||
| 29 | Animation ★(1) | GameObject Animation组件序列 | ❌ | ✅实测 `animationList` 39/59首 / 1575 keys(单曲最多218),比 ★(1) 高得多 |
|
||||
| 30 | TextureAnimation | 材质纹理帧动画 | ❌ | — |
|
||||
|
||||
---
|
||||
@@ -70,10 +87,10 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
|----|------|------|------|-----|
|
||||
| 31 | Transform | 舞台物件位移/旋转/缩放 | ✅ StageController | — |
|
||||
| 32 | Renderer | 舞台Renderer启用/禁用 | ❌ | — |
|
||||
| 33 | Object ★(10) | 舞台GameObject激活/隐藏 | ✅ StageController | — |
|
||||
| 33 | Object ★(10) | 舞台GameObject激活/隐藏**+ 位移** | ✅ StageController | 2026-08-04 修了两个静默失效:① 组名可能是 `_stageObjectUnits` 的**单元名**而非 GameObject 名(live10149 的 `neonsign` 就是 unit,底下挂 3 个子对象;没有任何 GameObject 叫 neonsign,整条轨道此前从不触发,灯牌不会从吊顶降下);② `OffsetType` 字段分发层一直在填但 `UpdateObject` 从不读,`Add` 语义被当绝对坐标写,物件被挪到父物体原点。现按 `Direct`/`Add` 分别处理,`Add` 在物件原始 local TRS 上叠加 |
|
||||
| 34 | Audience ★(12) | 观众人群动画参数 | ❌ | — |
|
||||
| 35 | Props | 舞台道具激活控制 | ❌ | — |
|
||||
| 36 | PropsAttach | 角色附着道具 | ❌ | — |
|
||||
| 35 | Props | 舞台道具激活控制 | ❌ | ✅实测 `propsList` 28/59首 / 1940 keys(单曲最多567) |
|
||||
| 36 | PropsAttach | 角色附着道具 | ❌ | ✅实测 `propsAttachList` 28/59首 / 298 keys |
|
||||
|
||||
---
|
||||
|
||||
@@ -81,44 +98,44 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
|
||||
| ID | 名称 | 作用 | 状态 | Bug |
|
||||
|----|------|------|------|-----|
|
||||
| 37 | VolumeLight ★(1) | 体积光/SunShafts | ⚠️🔇 | 无SunShafts组件,仅数据 |
|
||||
| 38 | HdrBloom | HDR泛光强度/阈值 | ❌ | 全量扫描确认0/58首有数据,不需要实现 |
|
||||
| 39 | PostFilm | 全屏后期叠加(晕影/颜色/UV电影) | ❌ | WorkSheet有postFilmKeys字段,58/58首存在但全部0 keyframe(空占位) |
|
||||
| 40 | Fade | 场景淡入淡出 | ❌ | — |
|
||||
| 37 | VolumeLight ★(1) | 体积光/SunShafts | ⚠️🔇 | 无SunShafts组件,仅数据。✅实测 `volumeLightKeys` **58/59首 / 2048 keys** |
|
||||
| 38 | HdrBloom | HDR泛光强度/阈值 | ⚠️🔇 | 0/58首有数据,**但已经实现了**(Director 有 handler,走 URP Bloom)→ 是本仓库里的死代码,建议删。song 1177 实测 `hdrBloomKeys` 为空 |
|
||||
| 39 | PostFilm | 全屏后期叠加(晕影/颜色/UV电影) | ⚠️🔇 | ✅实测三字段全有大量数据:`postFilmKeys` 59/59首6689 keys、`postFilm2Keys` 59/59首**7290 keys**、`postFilm3Keys` 59/59首6240 keys(song 1177 为 100/161/87)。旧记录「全部0 keyframe」是错的。**2026-08-05 已完成数据层**:数据类字段按 TypeTree 顺序重排并补齐 5 个 `BlinkLight*`、新增 `LiveTimelineKeyPostFilmDataList`、WorkSheet 三字段、`AlterUpdate_PostFilm` 分发与插值、`PostFilmUpdateInfo`、`PostFilmRendererFeature` + `Resources/Shaders/PostFilm.shader`。**渲染层默认关闭**(`PostFilmRendererFeature._enableRendering = false`):song 1177 的 100 个 key 全是 Vignette 变体,而 `filmOptionParam`(取值如 (0.2,0.05)/(0,0.05)/(0.2,0.25))的几何语义**无法从资源中还原** —— 游戏自己的 PostFilm shader 不在 `shader` bundle 里(499 个 shader 按名字和属性签名都搜过),应在 app 本体的 resources.assets。要继续做只能对着参考视频标定 Width/Strength 两个系数 |
|
||||
| 40 | Fade | 场景淡入淡出 | ❌ | ✅实测 `fadeKeys` **59/59首** / 243 keys。量小但覆盖全 |
|
||||
| 41 | Particle ★(3) | 粒子系统发射速率 | ✅ | — |
|
||||
| 42 | ParticleGroup ★(3) | 粒子组闪烁速率(双速率曲线) | ✅ | — |
|
||||
| 43 | WashLight | 洗光灯 SetActive+颜色亮度 | ⚠️ | RaycastDistance/CameraProjectionSide/MulColor0未使用 |
|
||||
| 44 | Laser | 激光灯变换+SetActive | ⚠️ | blinkRate/blinkOffset/rotateFollowCamera/RaycastDistance未实现 |
|
||||
| 45 | BlinkLight ★(9) | 频闪灯亮灭周期/颜色/亮度 | ⚠️ | color1Array/LightBlendMode/isReverseHueArray未使用 |
|
||||
| 43 | WashLight | 洗光灯 SetActive+颜色亮度 | ⚠️ | RaycastDistance/CameraProjectionSide/MulColor0未使用。**低优先级**:song 1177 仅 1 组 11 keys,真正的"洗光"效果由 ID 45 的 `*_wash_*` 组承担。字段名 `WashLightList`(大写 W)已用 A/B 探针确认;上游 katboi01 写作 `washLightList`,永远填不上,其 WashLightController 是死代码 |
|
||||
| 44 | Laser | 激光灯变换+SetActive | ⚠️ | blinkRate/blinkOffset/rotateFollowCamera/RaycastDistance未实现。song 1177 该轨道为空 |
|
||||
| 45 | BlinkLight ★(9) | 频闪灯亮灭周期/颜色/亮度 | ⚠️ | **灯光线最大权重**:全语料 19420 keys / 57首;song 1177 实测 27 组,一半以上组名是 `*_wash_*`。★(9) 是 song 1001 的数字,严重低估。2026-08-04 修:写入属性从 `_Color`(这些 shader 上不存在,写入是空操作,灯全渲染成黑)改为按存在性探测 `_BlinkLightColor`/`_MulColor0`/`_Color`。**仍未解**:`color0Array`/`powerArray` 恒为 10 项(调色板),与 renderer 数(可达 570)无关,灯→槽位的映射规则未逆出,暂统一取第 0 槽;`pattern` 语义未逆出,逐灯相位(U闪→M闪→A闪)未实现;`color1Array`/`LightBlendMode`/`isReverseHueArray` 未用。另注意部分 renderer 用 `StageTransmittedLightMask`/`StageMirrorBallShine`,**shader 里一个 Color 属性都没有**,BlinkLight 点不亮(对应未实现的 95/96 TransmittedLight 轨道) |
|
||||
| 46 | UVScrollLight ★(1) | 材质UV滚动灯光效果 | ⚠️ | mulColor1/ColorType/CharacterIndex等未使用 |
|
||||
| 47 | FacialToon | 角色卡通着色参数 | ❌ | — |
|
||||
| 47 | FacialToon | 角色卡通着色参数 | ❌ | ✅实测 `facialToonSet` **59/59首 / 6341 keys**(单曲最多600)。未实现轨道里数据量第二大 |
|
||||
| 48 | GlobalLight ★(2) | 全局光方向/RimLight参数 | ✅ | — |
|
||||
| 49 | GlobalFog ★(1) | 全局雾效(颜色/密度/范围) | ✅ | — |
|
||||
| 50 | LightShafts ★(1) | 光轴/丁达尔效果 | ⚠️🔇 | 无LightShaftsController组件,仅数据 |
|
||||
| 51 | MonitorCameraPos ★(1) | 舞台监控摄像机位置 | ❌ | WorkSheet无monitorCameraPosKeys字段 |
|
||||
| 52 | MonitorCameraLookAt ★(1) | 舞台监控摄像机朝向 | ❌ | WorkSheet无monitorCameraLookAtKeys字段 |
|
||||
| 51 | MonitorCameraPos ★(1) | 舞台监控摄像机位置 | ❌ | ✅实测 `monitorCameraPosKeys` **存在**,34/59首 / 964 keys。旧记录「无字段」是错的。用途推测是 LED 大屏的副摄像机实时画面(IMAG),与 ID 10 配套 |
|
||||
| 52 | MonitorCameraLookAt ★(1) | 舞台监控摄像机朝向 | ❌ | ✅实测 `monitorCameraLookAtKeys` **存在**,34/59首 / 971 keys。旧记录「无字段」是错的 |
|
||||
| 53 | MultiCameraPos ★(2) | 多机位摄像机位置 | ✅ | — |
|
||||
| 54 | MultiCameraLookAt ★(2) | 多机位摄像机朝向 | ✅ | — |
|
||||
| 55 | EyeCameraPos | 眼部特写摄像机位置 | ❌ | — |
|
||||
| 56 | EyeCameraLookAt | 眼部特写摄像机朝向 | ❌ | — |
|
||||
| 57 | LensFlare | 镜头光晕【45/58首】 | ❌ | — |
|
||||
| 58 | Environment ★(1) | 地板镜面反射/水面波纹/阴影/FovShift【48/58首】 | ❌ | 核心是Planar Reflection(第二摄像机→RenderTexture→地板shader),无现成系统则工程量大;水面UV参数和阴影开关可部分实现 |
|
||||
| 59 | SweatLocator ★(3) | 角色汗珠特效挂点 | ❌ | WorkSheet无sweatLocatorList字段 |
|
||||
| 57 | LensFlare | 镜头光晕 | ❌ | ✅实测 `lensFlareList` 45/59首 / 993 keys(单曲最多181)。舞台用 `CustomLensFlare` 脚本无源码;可先做 SetActive 层 |
|
||||
| 58 | Environment ★(1) | 地板镜面反射/水面波纹/阴影/FovShift | ❌ | ✅实测 `environmentDataLists` 49/59首 / 1375 keys。**注意 schema 里另有独立字段 `MirrorReflectionDataList`**,两者不是一回事(上游 katboi01 把它俩混为一谈,按 name 分流)。核心是 Planar Reflection,工程量大 |
|
||||
| 59 | SweatLocator ★(3) | 角色汗珠特效挂点 | ❌ | ✅实测 `sweatLocatorList` **存在**,32/59首 / 608 keys。旧记录「无字段」是错的 |
|
||||
| 60 | Effect ★(8) | 特效Prefab加载/播放(3d/effect/live/) | ✅ | — |
|
||||
| 61 | ColorCorrection | 色彩校正(饱和度/RGB曲线) | ⚠️ | depthRedCurve/Green/Blue/blendCurve/mode/selective/keyColor/targetColor无URP对应 |
|
||||
| 62 | PreColorCorrection | 前置色彩校正 | ❌ | — |
|
||||
| 63 | TiltShift | 移轴模糊 | ❌ | WorkSheet有tiltShiftKeys字段,58/58首存在但全部0 keyframe(空占位) |
|
||||
| 63 | TiltShift | 移轴模糊 | ❌ | ✅实测 `tiltShiftKeys` **58/59首 / 1202 keys**(单曲最多127)。旧记录「全部0 keyframe」是错的 |
|
||||
| 64 | A2U | 内部动作系统参数 | ❌ | 非视觉轨道 |
|
||||
| 65 | A2UConfig | A2U配置 | ❌ | 非视觉轨道 |
|
||||
| 66 | FlashPlayer | 全屏闪光播放 | ❌ | WorkSheet有flashPlayerKeys字段,58/58首存在但全部0 keyframe(空占位) |
|
||||
| 67 | Title | 歌曲名字幕显示 | ❌ | — |
|
||||
| 66 | FlashPlayer | 全屏闪光播放 | ❌ | ✅实测 `flashPlayerKeys` 20/59首 / 50 keys。旧记录「全部0 keyframe」是错的,但确实量小 |
|
||||
| 67 | Title | 歌曲名字幕显示 | ❌ | ✅实测 `titleKeys` 55/59首 / 137 keys |
|
||||
| 68 | Spotlight3d ★(3) | 3D聚光灯 SetActive+颜色/强度 | ✅ | — |
|
||||
| 69 | CharaNode | 角色骨骼节点位置控制 | ❌ | — |
|
||||
| 70 | NodeScale ★(2) | 舞台节点缩放 | ❌ | WorkSheet无nodeScaleList字段 |
|
||||
| 71 | Fluctuation | 画面波动/震颤效果 | ❌ | — |
|
||||
| 72 | CharaFootLight | 角色脚部补光灯 | ❌ | WorkSheet有charaFootLightKeys字段,58/58首存在但全部0 keyframe(空占位) |
|
||||
| 70 | NodeScale ★(2) | 舞台节点缩放 | ❌ | ✅实测 `nodeScaleList` **存在**,**57/59首** / 541 keys。旧记录「无字段」是错的,且覆盖率远高于原估计 |
|
||||
| 71 | Fluctuation | 画面波动/震颤效果 | ❌ | ✅实测 `FluctuationKeys` 51/59首 / 330 keys |
|
||||
| 72 | CharaFootLight | 角色脚部补光灯 | ❌ | ✅实测 `charaFootLightKeys` **49/59首 / 340 keys**。旧记录「全部0 keyframe」是错的 |
|
||||
| 73 | ChromaticAberration ★(1) | 色差后处理 | ⚠️ | redOffset/greenOffset/blueOffset(通道偏移)无URP内置对应;effectType未使用 |
|
||||
| 74 | LightProjection ★(18!) | 投影灯(Gobo图案灯)【36/58首】 | ❌ | WorkSheet有lightProjectionList字段;song 1001有18条,高优先级 |
|
||||
| 74 | LightProjection ★(18!) | 投影灯(Gobo图案灯) | ❌ | ✅实测 `lightProjectionList` **37/59首 / 3793 keys**(单曲最多566)。URP 下 `Projector` 组件不工作,需 DecalProjector 或自写 |
|
||||
| 75 | Billboard | 广告牌(始终面向摄像机的面片)【12/58首】 | ❌ | — |
|
||||
|
||||
---
|
||||
@@ -127,8 +144,8 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
|
||||
| ID | 名称 | 作用 | 状态 | Bug |
|
||||
|----|------|------|------|-----|
|
||||
| 76 | MultiCameraPostFilm ★(2) | 多机位全屏后期叠加【50/58首】 | ❌ | WorkSheet有postFilm1MultiCameraKeys字段 |
|
||||
| 77 | MultiCameraPostEffectBloomDiffusion ★(2) | 多机位泛光 | ❌ | WorkSheet无对应字段 |
|
||||
| 76 | MultiCameraPostFilm ★(2) | 多机位全屏后期叠加 | ❌ | ✅实测 `postFilm1MultiCameraKeys` 51/59首 / 708 keys |
|
||||
| 77 | MultiCameraPostEffectBloomDiffusion ★(2) | 多机位泛光 | ❌ | ✅实测 `postEffectBloomDiffusionMultiCameraKeys` **存在**,49/59首 / 381 keys。旧记录「无字段」是错的 |
|
||||
| 78 | MultiCameraColorCorrection | 多机位色彩校正 | ❌ | — |
|
||||
| 79 | MultiCameraTiltShift | 多机位移轴模糊 | ❌ | — |
|
||||
| 80 | MultiCameraRadialBlur | 多机位径向模糊 | ❌ | — |
|
||||
@@ -141,12 +158,12 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
| ID | 名称 | 作用 | 状态 | Bug |
|
||||
|----|------|------|------|-----|
|
||||
| 82 | AdditionalLight | 附加动态光源【22/58首】 | ❌ | — |
|
||||
| 83 | MultiLightShadow | 多光源阴影 | ❌ | WorkSheet有MultiLightShadowKeys字段,58/58首存在但全部0 keyframe(空占位) |
|
||||
| 84 | MobControl ★(4) | 观众人群行为/动画控制 | ❌ | WorkSheet无MobControlKeys字段 |
|
||||
| 85 | CyalumeControl ★(4) | 荧光棒颜色/同步控制 | ❌ | WorkSheet无CyalumeControlKeys;CyalumeController3D.cs存在但未接入时间轴 |
|
||||
| 83 | MultiLightShadow | 多光源阴影 | ❌ | ✅实测 `MultiLightShadowKeys` 37/59首 / 183 keys。旧记录「全部0 keyframe」是错的 |
|
||||
| 84 | MobControl ★(4) | 观众人群行为/动画控制 | ❌ | ✅实测 `MobControlKeys` **存在**,32/59首 / **2392 keys**(单曲最多495)。旧记录「无字段」是错的 |
|
||||
| 85 | CyalumeControl ★(4) | 荧光棒颜色/同步控制 | ❌ | ✅实测 `CyalumeControlKeys` **存在**,33/59首 / **2372 keys**(单曲最多496)。旧记录「无字段」是错的。`CyalumeController3D.cs` 已存在,只差接时间轴 |
|
||||
| 86 | CameraMotion | 摄像机动作曲线轨道 | ❌ | — |
|
||||
| 87 | WaveObject | 波浪变形物体 | ❌ | — |
|
||||
| 88 | CharaWind | 角色风效(头发/裙摆) | ❌ | — |
|
||||
| 88 | CharaWind | 角色风效(头发/裙摆) | ❌ | ✅实测 `charaWind` 24/59首 / 744 keys |
|
||||
| 89 | CharaParts | 角色部件显隐控制 | ❌ | — |
|
||||
| 90 | CameraCutNo | 镜头编号标记(元数据) | ❌ | — |
|
||||
| 91 | ToneCurve | 色调曲线(ACES/自定义) | ❌ | — |
|
||||
@@ -156,8 +173,8 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
| 95 | TransmittedLight | 透射光(次表面散射) | ❌ | — |
|
||||
| 96 | TransmittedLightMask | 透射光遮罩 | ❌ | — |
|
||||
| 97 | Voice | 语音切换控制 | ❌ | — |
|
||||
| 98 | LipSyncPatternRange | 口型模式范围定义 | ❌ | WorkSheet无字段 |
|
||||
| 99 | LipSyncPattern | 口型模式数据 | ❌ | WorkSheet无字段 |
|
||||
| 98 | LipSyncPatternRange | 口型模式范围定义 | ❌ | ✅实测 `LipSyncPatternRangeKeys` **存在** |
|
||||
| 99 | LipSyncPattern | 口型模式数据 | ❌ | ✅实测 `LipSyncPatternDataList` **存在** |
|
||||
| 100 | LensDistortion | 镜头桶形/枕形畸变 | ❌ | — |
|
||||
| 101 | CharaNodeOffset | 角色骨骼节点偏移 | ❌ | — |
|
||||
| 102 | TransparentCamera | 透明度摄像机控制 | ❌ | — |
|
||||
@@ -174,6 +191,72 @@ originSessionId: 319ae839-0292-4b1e-80de-2f3c91b1f40e
|
||||
| 🔴 Bug(已修)| 1 |
|
||||
| ❌ 未实现 | 72 |
|
||||
|
||||
## 未实现轨道优先级排序
|
||||
## 已知未解问题(2026-08-05)
|
||||
|
||||
LensFlare(57, 45/58首) > LightProjection(74, 36/58首) > AdditionalLight(82, 22/58首) > Billboard(75, 12/58首) > Audience(34, ★12条) > MobControl(84, 4条) > CyalumeControl(85, 4条) > Projector(17, 4条) > MultiCameraPostFilm(76, 50/58首) > NodeScale(70, ★2条) > MonitorControl(10, ★2条) > Animation(29, ★1条) > Environment(58, 48/58首, 需Planar Reflection系统)
|
||||
按「是否有 ground truth」分类。**缺依据的一律不实现**,代码里保留 TODO 注释而不是猜一个值上去。
|
||||
|
||||
### 有依据、可以直接做
|
||||
|
||||
| 问题 | 依据 |
|
||||
|---|---|
|
||||
| BlinkLight 调色板槽位映射 | `color0Array`/`powerArray` 恒为 10 项而 renderer 可达 570,映射规则未逆出,暂统一取第 0 槽 |
|
||||
| BlinkLight `pattern` 语义 | 实测有 0 和 2 两种;相位公式是推测,`pattern != 0` 时按 `cycle * i / N` 错开 |
|
||||
| BgColor1 剩余 4 组 | `BgBL`(256 keys) / `FollowSpotColor`(16) / `Shadow`(2) / `mob_00`(2) 不是物件名也不是材质名 |
|
||||
| BgColor1 的 `power` → `_ColorPower`? | `_ColorPower` 属性确实存在,但映射关系无证据,已撤回 |
|
||||
|
||||
### 缺 ground truth,已禁用
|
||||
|
||||
| 问题 | 为什么查不到 |
|
||||
|---|---|
|
||||
| PostFilm 的 `filmOptionParam` 几何语义 | 游戏自己的 PostFilm shader 不在 `shader` bundle(499 个按名字和属性签名都搜过),应在 app 本体 `resources.assets` |
|
||||
| MonitorControl 的 `dispID` → 资源 | 内容资源族已定位为 `live/uvmovie/gal_uvmovie_<songid>_<NNN>`(全库 219 个目录),但 song 1177 只有 `_light` 没有 `_001`,且 `monitorCameraPosKeys` 为 0,两条路都不通 |
|
||||
|
||||
### 与时间轴无关的渲染问题
|
||||
|
||||
| 现象 | 状态 |
|
||||
|---|---|
|
||||
| 舞台地板 `plane_000` / `stage_object_001` / `specular_002` 长期偏亮发白 | **早于本次所有改动就存在**,与 BgColor1/`_ColorPower` 无关,未排查 |
|
||||
| 小灯泡渲染成黑块 | 用 `StageTransmittedLightMask` / `StageMirrorBallShine`,这两个 shader **没有任何颜色属性**,BlinkLight 点不亮。疑为 URP 移植问题,对应未实现的 95/96 TransmittedLight 轨道 |
|
||||
| LED 大屏黑屏 | MonitorControl (10) 未实现,见上 |
|
||||
|
||||
---
|
||||
|
||||
## 优先级排序
|
||||
|
||||
**2026-08-04 用 `tools/` 全量重测后重排。** 依据 = 实测数据量 × 覆盖率 × 工作性质。
|
||||
全量表:`tools/out/scan_summary.txt`。
|
||||
|
||||
### 第一优先:数据早就在手,只是没用上(性价比最高)
|
||||
|
||||
| 轨道 | 实测数据量 | 难度 | 说明 |
|
||||
|---|---|---|---|
|
||||
| **BgColor1 (8) 舞台分支** | **43617 keys / 59首** | ★☆☆~★★☆ | 全语料最大的轨道。分发过滤已拆,剩下确认舞台侧 shader 属性 |
|
||||
| **BlinkLight (45) 补字段** | **19420 keys / 57首** | ★★☆ | 灯光线最大权重,含全部 `*_wash_*` 效果 |
|
||||
| Laser (44) / UVScrollLight (46) 补字段 | 2661 keys / 33首 | ★☆☆ | 纯管道 |
|
||||
|
||||
### 第二优先:URP 后处理 Feature(路径见 `live-shader-todo.md`)
|
||||
|
||||
| 轨道 | 实测数据量 | 路径 |
|
||||
|---|---|---|
|
||||
| **PostFilm (39)** | **~20200 keys / 59首**(三个字段合计) | B,最大的一块 |
|
||||
| PostEffectDOF (13) | 3879 keys / 59首 | A(URP 内置 DepthOfField) |
|
||||
| VolumeLight/SunShafts (37) | 2048 keys / 58首 | B,数据类已有,字段表齐全 |
|
||||
| PostEffectBloomDiffusion (14) | 1969 keys / 59首 | B |
|
||||
| RadialBlur (15) | 1667 keys / 59首 | B |
|
||||
| TiltShift (63) | 1202 keys / 58首 | B |
|
||||
|
||||
### 第三优先:只差 C# 字段声明 + handler(bundle 里数据齐备)
|
||||
|
||||
FacialToon(47, **6341 keys/59首**) > MonitorControl(10, 3911/55首,dispID 语义仍未知) > CameraLayer(16, 3306/58首) > MobControl(84, 2392/32首) > CyalumeControl(85, 2372/33首,`CyalumeController3D.cs` 已存在) > Props(35, 1940/28首) > Animation(29, 1575/39首) > MonitorCameraPos/LookAt(51/52, ~1900/34首) > CharaWind(88, 744/24首) > AdditionalLight(82, 657/23首) > SweatLocator(59, 608/32首) > NodeScale(70, 541/57首) > Fluctuation(71, 330/51首) > CharaFootLight(72, 340/49首) > Fade(40, 243/59首) > Title(67, 137/55首) > FacialNoise(26)/CharaMotionNoise(27)
|
||||
|
||||
### 第四优先:要从零搭渲染系统 ★★★
|
||||
|
||||
LightProjection(74, 3793/37首,URP 下 Projector 不工作) > Environment(58, 1375/49首,Planar Reflection 整套;注意还有独立的 `MirrorReflectionDataList`) > LensFlare(57, 993/45首,可先做 SetActive 层)
|
||||
|
||||
### 不该做
|
||||
|
||||
**HdrBloom (38)** —— 0/59 首,却已经实现了,是死代码,建议删。
|
||||
其余确认为空:`other4EyeTrackKeys`、`ScreenCaptureDataList`、`tailMotionDataList`。
|
||||
A2U / A2UConfig / CameraCutNo —— 非视觉轨道。
|
||||
|
||||
> 之前「PostFilm 到底有没有数据」的矛盾已解决:**`live-shader-todo.md` 是对的**,本文件旧版记的「全部 0 keyframe」是错的。
|
||||
|
||||
+49
-16
@@ -2,6 +2,8 @@
|
||||
|
||||
全局开发地图见 `LIVE_DEV_MAP.md`。本文件只覆盖需要 URP 移植的后处理效果。
|
||||
|
||||
> **覆盖率数字已于 2026-08-04 用 `tools/` 全量重测更新**(59 首全语料)。带 ✅实测 的是权威数据。dump 字段结构:`~/.venvs/umatools/bin/python3 tools/dump_cutt_typetree.py --tree <字段名> <songid>`。
|
||||
|
||||
---
|
||||
|
||||
## 为什么不能直接用旧方法
|
||||
@@ -57,19 +59,19 @@ Feature 必须在 `UMAUniversalRenderPipelineAsset_Renderer.asset` 的 Renderer
|
||||
|
||||
| 优先级 | Track ID | 字段名 | URP 类型 | 覆盖率 |
|
||||
|--------|----------|--------|---------|--------|
|
||||
| 1 | 73 | `chromaticAberrationList` | `ChromaticAberration` | 22/58 |
|
||||
| 2 | 61 | `colorCorrectionDataLists` | `ColorAdjustments` + `ColorCurves` | 47/58 |
|
||||
| 3 | 13 | `postEffectDOFKeys` | `DepthOfField` | — |
|
||||
| — | 38 | `hdrBloomKeys` | — | 0/58,无需实现 |
|
||||
| 1 | 73 | `chromaticAberrationList` | `ChromaticAberration` | ✅实测 22/59首 / 487 keys |
|
||||
| 2 | 61 | `colorCorrectionDataLists` | `ColorAdjustments` + `ColorCurves` | ✅实测 47/59首 / 297 keys |
|
||||
| 3 | 13 | `postEffectDOFKeys` | `DepthOfField` | ✅实测 **59/59首 / 3879 keys** |
|
||||
| — | 38 | `hdrBloomKeys` | — | ✅实测 **0/59 确认为空**。但 Director 里已经实现了 → 死代码,建议删 |
|
||||
|
||||
### 第二组:自定义 shader,工作量大(路径 B)
|
||||
|
||||
| 优先级 | Track ID | 字段名 | 覆盖率 | 备注 |
|
||||
|--------|----------|--------|--------|------|
|
||||
| 4 | 39 | `postFilmKeys` / `postFilm2Keys` / `postFilm3Keys` | 58/58 | 最复杂,优先做 |
|
||||
| 5 | 37 | `volumeLightKeys` | 57/58 | 数据类已有,shader 需移植 |
|
||||
| 6 | 15 | `radialBlurKeys` | 58/58(骨架居多)| 大多数曲目值为 0 |
|
||||
| 7 | 63 | `tiltShiftKeys` | 58/58(骨架居多)| 大多数曲目值为 0 |
|
||||
| 4 | 39 | `postFilmKeys` / `postFilm2Keys` / `postFilm3Keys` | **59/59** | ✅ 三字段合计 **~20200 keys**,最大的一块。**数据层+分发层已完成,渲染层默认关闭**,原因见下方专节 |
|
||||
| 5 | 37 | `volumeLightKeys` | **58/59** | 数据类已有,shader 需移植。✅实测 2048 keys |
|
||||
| 6 | 15 | `radialBlurKeys` | **59/59** | ✅实测 1667 keys(单曲最多95)——**不是骨架**,旧记录错误 |
|
||||
| 7 | 63 | `tiltShiftKeys` | **58/59** | ✅实测 1202 keys(单曲最多127)——**不是骨架**,旧记录错误 |
|
||||
|
||||
---
|
||||
|
||||
@@ -100,11 +102,42 @@ Feature 必须在 `UMAUniversalRenderPipelineAsset_Renderer.asset` 的 Renderer
|
||||
**Track ID**: 13
|
||||
**URP 类型**: `UnityEngine.Rendering.Universal.DepthOfField`
|
||||
|
||||
字段待 dump。URP DOF 分 Gaussian 和 Bokeh 两种模式,选哪种取决于原版字段。
|
||||
✅实测 59/59 首 / 3879 keys。字段用 `tools/dump_cutt_typetree.py --tree postEffectDOFKeys <songid>` dump。URP DOF 分 Gaussian 和 Bokeh 两种模式,选哪种取决于原版字段。
|
||||
|
||||
---
|
||||
|
||||
### 4. PostFilm(路径 B,优先)
|
||||
### 4. PostFilm(路径 B)—— 数据层已通,渲染层卡在缺 ground truth
|
||||
|
||||
**2026-08-05 现状**
|
||||
|
||||
已完成并验证:数据类字段(按 bundle TypeTree 顺序重排 + 补齐 5 个 `BlinkLight*`)、
|
||||
`LiveTimelineKeyPostFilmDataList`、WorkSheet 三字段、`AlterUpdate_PostFilm` 分发与插值、
|
||||
`PostFilmUpdateInfo`、`PostFilmRendererFeature`、`Assets/Resources/Shaders/PostFilm.shader`。
|
||||
song 1177 运行时实测 100 / 161 / 87 keys,与离线 dump 一致。
|
||||
|
||||
**渲染默认关闭**:`PostFilmRendererFeature._enableRendering = false`。
|
||||
|
||||
卡点:song 1177 的 100 个 key **全是 Vignette 变体**(VigLerp 60 / VigAdd 39 / VigMul 1),
|
||||
所以晕影衰减是决定观感的关键,而 `filmOptionParam` 的几何语义还原不出来。实际取值:
|
||||
|
||||
(0, 0.05) (0.05, 0.05) (0.08, 0.05) (0.2, 0.05)
|
||||
(0.04, 0.17) (0.1, 0.17) (0.2, 0.25)
|
||||
|
||||
`y < x` 的组合排除了「内径/外径」;按「离边缘距离」解释试过两版,一版全屏泛色、一版大边框。
|
||||
**游戏自己的 PostFilm shader 不在 `shader` bundle 里** —— 该 bundle 的 499 个 shader
|
||||
按名字(ImageEffect 家族 34 个,无 PostFilm/Vignette)和按属性签名都搜过,
|
||||
它应该编在 app 本体的 `resources.assets`,我们拿不到。
|
||||
|
||||
继续做的唯一路径:对着参考视频找一帧晕影明显的画面,在 Inspector 勾上 `Enable Rendering`,
|
||||
调 `Vignette Width` / `Vignette Strength` 直到吻合,再把数值写死并注明标定依据。
|
||||
|
||||
未实现:`depthPower` / `DepthClip`(深度混合)、`layerMode = UVMovie`(图层贴图,
|
||||
和 MonitorControl 共用 `live/uvmovie/gal_uvmovie_<songid>_<NNN>` 资源,寻址规则同样未解)。
|
||||
|
||||
---
|
||||
|
||||
### 4b. PostFilm 字段参考(原记录,供实现时查)
|
||||
|
||||
|
||||
**Track ID**: 39(还有 `postFilm2Keys`、`postFilm3Keys`,song 1177 有数据)
|
||||
**数据类**: `LiveTimelineKeyPostFilmData`(`LiveTimelineKeyPostFilmDataList.cs` 已存在)
|
||||
@@ -170,21 +203,21 @@ enable: bool → 启用开关
|
||||
|
||||
### 6. RadialBlur(路径 B)
|
||||
|
||||
**Track ID**: 15 | **覆盖**: 58/58 首(骨架居多)
|
||||
**Track ID**: 15 | **覆盖**: ✅实测 59/59 首 / 1667 keys(**有真实数据,不是骨架**)
|
||||
|
||||
字段待 dump。算法:屏幕空间径向模糊,从中心向外方向采样 N 次,`offset = direction × step × i`。
|
||||
字段可用 `tools/dump_cutt_typetree.py --tree radialBlurKeys <songid>` dump。算法:屏幕空间径向模糊,从中心向外方向采样 N 次,`offset = direction × step × i`。
|
||||
|
||||
骨架数据居多,先搭 Feature 架子,等有真实数据再调参。
|
||||
(原记「骨架数据居多」已被实测推翻,可以直接按真实数据实现。)
|
||||
|
||||
---
|
||||
|
||||
### 7. TiltShift(路径 B)
|
||||
|
||||
**Track ID**: 63 | **覆盖**: 58/58 首(骨架居多)
|
||||
**Track ID**: 63 | **覆盖**: ✅实测 58/59 首 / 1202 keys(**有真实数据,不是骨架**)
|
||||
|
||||
字段待 dump。算法:屏幕中间清晰,上下做高斯模糊,用渐变 mask 混合。
|
||||
字段可用 `tools/dump_cutt_typetree.py --tree tiltShiftKeys <songid>` dump。算法:屏幕中间清晰,上下做高斯模糊,用渐变 mask 混合。
|
||||
|
||||
骨架数据居多,优先级最低。
|
||||
(原记「骨架数据居多」已被实测推翻。)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user