No behavioural change intended; this is the tidy-up pass after five rounds of track fixes.
Director.cs
* Six MaterialPropertyBlock fields (chara / bgColor1 / bgColor2 / spotlight / uvScroll /
blinkLight) become one shared `PropBlock`. Every use is the same self-contained
Get -> modify -> Set, and the block carries no state across frames or handlers, so the
separate fields were pure duplication. The reason the Get is mandatory (SetPropertyBlock
replaces rather than merges — this is what made GlobalLight dead for 59/59 songs) now
lives on the one shared field instead of being restated per handler.
* ResolveStageTargets wrote four instance fields as de facto out-parameters that
LogBgColor1Resolution read back. Replaced with a returned StageResolveReport, which also
lets the logger become static. `props` is now a required parameter — the `= null` default
silently meant "BgColor1's channel", which is the wrong default for a BgColor2 caller.
* Three duplicated blocks removed: shader-description building (BgColor1 and BlinkLight
logs -> DescribeRendererShaders), vocal entry resolution (InitializeMusic and
GetLiveAllVoiceEntry -> ResolveVocalEntry), and the FOV frame marking copied verbatim
into SaveCameraVMD and SaveMultiCameraVMD (-> MarkFovFrames, which additionally no longer
throws on an empty frame list).
* OnEffectUpdate's three identical "record the frame, bail out" branches collapse into
LoadEffectPrefab returning null.
* HdrBloom's handler and the Bloom volume override are gone. hdrBloomKeys is empty in all
59 songs, and the field-to-URP mapping was never confirmed — so this was code that could
only ever be wrong, plus an effect nobody wrote to. The data layer and the dispatch stay,
so re-adding it is one subscription.
* The BlinkLight TODO no longer lists palette slot mapping: that was reverse-engineered
(slot = the lightNNN_/alphaNNN_ prefix of the renderer or its nearest ancestor).
StageEnvMapDiag.cs deleted (with StageEnvRateToggle and its F9 hotkey). It existed to test one
hypothesis — that the floor blow-out came from DefaultEnvMapNoAmbient's env reflection — and
the verdict experiment ran: _EnvRate = 0 changed nothing. The real cause turned out to be
mirror_a and is fixed. Keeping it meant a full-hierarchy sweep on every stage load and a
hotkey, for a question already answered.
StageController no longer calls it; StageMissingScriptCensus's doc comment stops restating the
signature list that CLAUDE.md already carries.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UzXXkLzVC8pNA3JjyUGMbq
Rebuilt Gallop.MirrorReflection from its original signature, so Unity deserializes the real
fields out of the bundle rather than anything being inferred. All 13 field names are copied
verbatim from the TypeTree, including the original's typo `_mirrorCliipPlaneOffset` — spelling
it correctly would silently receive no data.
The receiving end was looked up, not guessed. mtl_env_liveNNNNN_mirror000 uses
Cygames/MirrorAndShadow/ReceiveMirror, which declares exactly four properties — _MainTex,
_ReflectionTex, _Color, _ReflectionRate — and the component's _mirrorReflectionColor and
_mirrorReflectionRate line up with the last two name for name. Texture size, cull mask, clear
colour and clip-plane offset all come straight from the serialized values, which differ per
stage (256/12544 on live10149, 512/12288 on live10132), confirming real data is arriving.
Deliberately not implemented, because there is no ground truth for them:
* _direction is an enum whose meaning is unrecoverable — IL2CPP metadata is encrypted.
The mirror plane is derived from the mesh's own normals instead, which is geometry rather
than a guess, and yields (0,1,0) on both stages. The field's value is logged as unused.
* _mirrorDistortionTileOffset / _mirrorDistortionPower belong to the ReceiveDistortionMirror
variant; these materials use the plain one.
* _useMirrorTextureScale / _mirrorTextureScaleForBaseCamera — semantics unknown.
Rendering goes through RenderPipelineManager.beginCameraRendering and RenderSingleCamera.
Camera.Render() is not supported under SRP and would have failed silently.
This also settles the long-standing floor blow-out, and the diagnosis I had been running was
aimed at the wrong objects the entire time. ReceiveMirror's _ReflectionRate defaults to 1.0
while _ReflectionTex had never been assigned, and Unity substitutes a white texture for an
unbound sampler — a full-strength white reflection, i.e. a solid white floor. Binding the
reflection RT fixes it.
CLAUDE.md recorded the blown-out objects as plane_000 / stage_object_001 / specular_002 and I
took that as given, spending four rounds eliminating mechanisms on those three. The actual
culprit is mirror_a, which sits at the same position and scale under the same parent — visually
indistinguishable, entirely different name. The earlier "_EnvRate = 0 changes nothing" result
was consistent all along: it was toggling a different set of objects.
Both files gain the lesson: field values and shader property tables are hard data, but a
document's description of which object looks wrong is not, and a visual bug should start by
confirming which object the symptom belongs to.
Water surfaces are absent, not broken — none of the three downloaded stages has a ReceiveWater
material; each has exactly one ReceiveMirror.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The big finding is structural, and it corrects something I asserted two commits ago.
Stage prefabs reference 11 script classes and UmaViewer implemented one of them, leaving
892 MonoBehaviour instances with a null script. I claimed those serialized fields were
unreachable at runtime and that reimplementing the scripts would need name heuristics or a
baked parameter table. That was wrong, and the diagnostic I wrote to confirm it disproved it
instead: among the 7 surviving components were AssetHolder (bundle namespace Gallop) and
StageController (Gallop.Live). Unity resolves MonoScript by class name + namespace +
assembly, and Assets/Scripts/umamusume.asmdef is named "umamusume", exactly matching every
MonoScript in the bundles. The project was organised for this from the start — it is the same
mechanism LiveTimelineWorkSheet relies on to read cutt data.
So the 892 are simply unwritten. Declaring a class with the matching signature makes Unity
deserialize the real fields.
BillboardController (Gallop.Live, 164 instances) is the first one rebuilt, and it confirms
the mechanism: missing-script count drops 892 -> 728, exactly -164. _rotationType is now read
per object rather than guessed. Type 0 (106 objects) faces the camera; type 2 (58, all
glow_ramp) is logged and left alone — the enum's meaning is not recoverable, see below.
BlinkLight palette slots — the mirror ball was solid pink
* color0Array/powerArray are a 10-slot palette and every renderer was taking slot 0.
The slot is the object's own or nearest ancestor's `lightNNN_` / `alphaNNN_` name prefix.
Confirmed across all groups on live10149: the number of distinct prefixes equals the
number of distinct colours in slots 0..N-1, with slots N..9 uniform white filler, in
every group without exception. mirrorball 3 (pink/blue/yellow), wash_truss 4, glow_object
2, audience_light 9.
* Renderers with no prefix are not palette lights and are now skipped when the group has
any. The mirror ball body uses Gallop/3D/Bg/BgMirrorBall, whose _MulColor0 belongs to
BgColor1 — which drives it to white, the silver ball seen in the reference footage.
BlinkLight runs after BgColor1 and was overwriting it with palette pink.
Stage animation is now driven by the timeline, not Unity's clock. Using Animation.Play() plus
a default clip with playAutomatically meant the stage kept moving while the live was paused
and ignored scrubbing. AnimationState.time is now set from currentLiveTime and sampled.
CLAUDE.md gains a ground-truth map: what the bundles yield, the rebinding trick above with
its signature table, and what is permanently blocked. global-metadata.dat is neither on disk
nor inside GameAssembly.dll (magic 0xFAB11BAF absent, identifier strings absent) — the game's
anti-tamper keeps it encrypted until runtime. Every enum's meaning, the original method
bodies, and any tuning constants are therefore unrecoverable; rebuilding a signature yields
data, never behaviour. The mirror ball's 2.0s-per-revolution is authored in the clip and
reproduced faithfully; if the reference looks slower, the factor lives in code we cannot read.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The stage prefab references 11 script classes and UmaViewer implements exactly
one of them (StageController). The other ten deserialize with a null script
reference and never run: AnimationObjectController, BillboardController,
CustomLensFlare, UnityLensFlareController, CustomProjector, LightProjection,
MirrorBallProjector, MirrorReflection, ShaderParamController, WashLightController.
AnimationObjectController's absence has the most visible effect. live10149 has
283 Animation components, all 283 with playAutomatically = true and all 283 with
a null default clip. playAutomatically plays the default clip, so a null one
plays nothing — the original drives them with an explicit Play(name). The result
is that no stage animation runs at all: the mirror ball does not spin, the wash
lights do not sweep, the neon signs do not move.
Only the unambiguous case is handled. Clip counts per component are 1 (4
objects), 3 (6), 5 (272) and 0 (1). The single-clip objects are all named
*_loop_000 — mirrorball_flarelight and wash_ground_b/c/d — and are played. The
3-clip sets are loop_000 / up_000 / loop_001, a transition plus two loop states,
and AnimationObjectController carries no serialized fields at all, so nothing in
the data says which to pick or when to switch. Those and the 5-clip sets are
logged with their clip names and left alone rather than guessed at.
Playback happens in OnEnable, not once at init: timeline-controlled lights start
inactive and Play() does not stick on an inactive object. The mirror ball's
container is pfb_env_live10149_blinklight_mirrorball_flarelight, which is exactly
that case.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
LIVE_AUDIT_2026-08-05.md records the audit behind the previous commit: the
evidence for each fix, the tool invocations that produced it, and — deliberately
— the three conclusions I got wrong before the data corrected them, since each
was a plausible-sounding guess:
* "66 same-named wash lights stay lit" — that 66 is the mob_a000 crowd, not
lights. live10149 has 4 duplicated light names, 10 objects.
* "the light handlers need name -> List support first" — every one of song
1177's 28 BlinkLight group names maps to exactly one GameObject; the groups
address containers and GetComponentsInChildren already covered the children.
* "plane_000 should look lighter than the other two" — _EnvRate 0.75 vs 1.00
cannot be distinguished once the term saturates to white, so that comparison
could never have decided anything either way.
Also records which song exercises which fix, since only 1177 is downloaded
locally and it carries no bgColor2 / spotlight3d / transform data.
Stage floor blow-out (plane_000 / stage_object_001 / specular_002): four
mechanisms now ruled out rather than one cause found. Not lighting — live10149
has 10102 GameObjects and zero Light components, and the Live code never touches
Light at all. Not a missing reflection texture — StageEnvMapDiag reports 0 of 3
null. Not the unwritten _ColorPower — BgColor1's power field has a median of
1.000 on all three groups, which retroactively supports reverting that write.
Not the env reflection term — F9 zeroes _EnvRate on all three renderers, and the
log confirms it fired nine times with no visible change. Also corrects a sampling
error of mine: frame 0 is near-black, but across all 257 keys the floor's median
luminance is 0.548 and 81% of keys exceed 0.3, so it is meant to be bright for
most of the song. Next binary test is forcing _MulColor0 to black.
StageEnvMapDiag logs the env-map bindings once at stage init and attaches an
opt-in F9 toggle that flips _EnvRate between its authored value and 0 through a
property block. Diagnostic only; inert unless the key is pressed.
LIVE_DEV_MAP.md now separates "implemented" from "checked". Ten rows drop to
"OK?" because nobody has verified them — this session found four tracks that
were marked done and had never once produced output, so an unchecked mark is
not evidence of health. GlobalFog drops to partial: its data is height fog
(isDistance=0, isHeight=1) but the handler enables Unity distance fog, and
RenderSettings has no height fog. The claim that BlinkLight and Spotlight3d
drive child Light components was wrong and is corrected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
All found by auditing the tracks LIVE_DEV_MAP marked as done. Every one of
them parses its keyframes correctly and then drops the result downstream with
no error, so the picture looks plausible and nothing ever surfaces the failure.
Verified against the bundles with tools/ before changing anything.
GlobalLight (48) — 9636 keys / 59 songs, never worked
* Renderer.SetPropertyBlock() replaces the whole block rather than merging.
AlterLateUpdate runs GlobalLight then BgColor1, and both allocated a fresh
block for the same container.Renderers, so BgColor1 wiped all 13 rim
properties every frame. Song 1177 carries GlobalLight x2 and CharaColor x2,
and bgColor1/globalLight both cover 59/59 songs — this was never once live.
* Both handlers now GetPropertyBlock -> modify -> SetPropertyBlock, sharing
one persistent block. The stage-side BgColor1 branch and BlinkLight already
did this; the two character-side handlers were the only exceptions.
* _UseOriginalDirectionalLight / _OriginalDirectionalLightDir moved into the
block too. They were written through renderer.materials, which instantiates
a material copy and allocates an array on every frame, per renderer.
BgColor2 (9) — 14346 keys / 15 songs, at most one group survived
* The dispatcher never filled the group name and the handler never read one,
so up to 15 groups (son1010 carries BgWashA..BgWashO) each repainted the
entire stage every frame and only the last one in list order survived.
* Name is now threaded through and resolved via ResolveStageTargets, writing
_AmbientColor through a MaterialPropertyBlock, resolved once and cached.
* The name -> renderer mapping is still unknown and is NOT guessed here.
BgWashA..O / LaserA..C are neither GameObject names nor _stageObjectUnits
unit names (the three downloaded stages use concrete names like neonsign),
and BlinkLight carries no index back into BgColor2. Unresolved names fall
back to the previous whole-stage write and log a warning, so behaviour is
never worse than before; delete the fallback once the mapping is known.
Spotlight3d (68) — 1089 keys / 31 songs
UVScrollLight (46)
* Both wrote _Color. Enumerating all 499 shaders shows no Gallop/3D/Live/Stage
shader declares it — the only two stage/Bg shaders that do are BgShadowOnly
and RedAlphaGreenColorShadowFogUVScroll, neither related. Spotlight beams are
StageBeamLight*, and UVScroll targets LightAdd1_UV and
StageLightAdd1_UVAlphaMask_TransmittedLightMask; all use _MulColor0 /
_MulColor1 / _ColorPower. The colour write was a no-op while _ColorPower kept
working, so the lights tracked the music in brightness but never in colour.
* This is the same defect as the BlinkLight _Color bug fixed in a3a7b83, twice
over. "The property exists" is not "the target shader has it" — all three
slipped through on that distinction.
* UVScrollLight also gains the previously unused mulColor1, and both now use
MaterialPropertyBlock with cached lookups instead of walking every renderer
on the stage and touching r.materials each frame.
Transform (31) — 681 keys / 12 songs, never worked
* UpdateTransform only consulted StageObjectUnitMap and had no else branch, so
a group named after a GameObject silently did nothing. son1028's first group
is light001_glow_001. This is the mirror image of the Object-track fix in
a3a7b83, which was missing the unit-name path instead.
* Also strips "(Clone)" on the child lookup, which UpdateObject already did.
* TypeTree confirms LiveTimelineKeyTransformData has only position/rotate/
scale and no OffsetType, so absolute writes are correct here.
StageController init — 4 permanently dark lights on live10149
* SetActive(false) sat inside the dedupe check, so among same-named objects
only the first was disabled. Track groups address containers, and the lights
are their children: light001_wash_ground_a (x4), swing_wash_ground_a (x2),
base_rotate_wash_ground_a (x2) and light000_wash_ground_a (x2) all sit under
pfb_env_live10149_blinklight_wash_ground_a. The handler re-enables only the
container, so that one disabled child was never turned back on.
* Now only the topmost timeline-controlled light in each branch is disabled;
descendants keep their prefab state and follow the parent. Dedupe and insert
also agree on the stripped name now.
Only GlobalLight could be verified in the editor — song 1177 carries no
bgColor2, spotlight3d or transform data. The rest is code review plus bundle
ground truth.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every fix here is the same shape: the keyframe data was already parsed
correctly and then dropped somewhere downstream, with no error logged.
Found by dumping the authoritative schema with tools/ and comparing against
what the handlers actually consume.
BgColor1 (8) — the largest track in the corpus, 43617 keys / 59 songs
* AlterUpdate_BgColor1 filtered on a `validBgColorNames` whitelist of four
character group names, discarding the other 16 stage groups outright.
On song 1177 that is ~92% of the track's keys. Filter removed; Director
now routes by group name (characters vs stage).
* Stage branch resolves renderers by walking the whole stage hierarchy.
StageObjectMap alone is not enough: it dedupes by name, and crowd groups
have 66-570 same-named objects, so only the first was ever coloured.
* Writes _MulColor0, confirmed by enumerating the shaders' property tables.
_AmbientColor belongs to BgColor2 — they are separate channels on the
same shader and must not be written by both.
* Populates fields the dispatcher had always left at default: colorPower,
scale, vertexColorToonPower, outlineWidthPower, LightBlendMode,
IsSilhouette, IsProjector, TimelineName.
Object (33) — the neon sign never descended from the ceiling
* The group name `neonsign` is a StageController._stageObjectUnits *unit*
name; no GameObject of that name exists, so the whole track never fired.
UpdateObject now falls back to StageObjectUnitMap and applies to each
child of the unit.
* ObjectUpdateInfo.OffsetType was populated by the dispatcher but never
read, so Add-relative positions were written as absolute and objects
snapped to their parent's origin. Now honoured against a lazily captured
base local TRS.
BlinkLight (45) — 19420 keys / 57 songs, the biggest lighting payload
* Wrote _Color, which does not exist on Gallop/3D/Live/Stage/LightBlinkBlend
(its colour channel is _BlinkLightColor), so the write was a no-op and the
lights rendered black. Now probes the shader for the real property.
* Brightness goes to _ColorPower instead of being folded into the colour,
falling back to colour*power only where that property is absent.
* Uses MaterialPropertyBlock; the old path hit Renderer.materials every
frame, allocating and breaking batching.
PostFilm (39) — ~20200 keys / 59 songs, previously recorded as empty
* Data class fields reordered to the bundle's TypeTree order and the five
missing BlinkLight* fields added; LiveTimelineKeyPostFilmDataList created;
postFilmKeys / postFilm2Keys / postFilm3Keys declared on the worksheet.
Runtime now deserializes 100 / 161 / 87 keys on song 1177.
* AlterUpdate_PostFilm dispatch with interpolation, PostFilmUpdateInfo,
a URP ScriptableRendererFeature and a full-screen blit shader.
* Rendering is disabled by default: filmOptionParam's geometry is undefined
anywhere we can read. All 100 keys on song 1177 are Vignette variants, so
that parameter decides the whole look, and the shader that defines it is
not in the `shader` bundle (all 499 searched by name and by property
signature) — it ships inside the app binary.
Diagnostics
* LiveTimelineWorksheetDiag dumps every track field with group names and key
counts, and Probe() tests whether a candidate field name matches the
bundle TypeTree. Confirmed worksheetList.Count == 1 (SheetType MainLive),
and that WashLightList really is spelled with a capital W — upstream
katboi01 uses washLightList, which never populates.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Replace broad Contains("light") with IsTimelineControlledLight() that matches
only objects actually controlled by timeline handlers (blinklight, spotlight3d,
_wash_, laser). Neonsigns, glow meshes, UV scroll objects and other static stage
props now keep their prefab default state instead of being silently disabled.
Also fix UVScrollLight handler to use GetComponentsInChildren<Renderer>(true)
so inactive renderers are included in material search.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces incorrect RenderSettings.ambient* with per-material
_AmbientColor writes on stage renderers, confirmed via live10106
material dump.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
scrollSpeedX/Y was incorrectly passed to SetTextureScale (tiling),
now accumulated as per-frame offset delta on top of keyframe scrollOffsetX/Y.
Added _uvScrollAccum dict cleared on InitializeTimeline.
Also updated LIVE_TRACKS.md with full-scan coverage numbers and
live-shader-todo.md with blocked-track categorization.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix LiveTimelineBgColor2Data.keys type (BgColor1DataList → BgColor2DataList)
- Add AlterUpdate_BgColor2 call and implementation in LiveTimelineControl
- Subscribe OnUpdateBgColor2 in Director with ambient color handler
- Extract all anonymous delegates in Director to named OnXxxUpdate methods
- Add LIVE_TRACKS.md: full track reference table (IDs 0–102)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stage light objects have no Unity Light components — they are
self-illuminated meshes. All three handlers now write to MeshRenderer
material properties instead.
BlinkLight: GetComponentsInChildren<Renderer> → _Color + _ColorPower.
pattern==0 uses per-renderer color0Array/powerArray; blink cycle
multiplies col * intensity into _Color.
Spotlight3d: adds _Color + _ColorPower writes after transform update.
color/colorPower fields were previously unused.
WashLight: sets _ProjectorColorPower from CameraProjectionColorPower
on projector materials. _ProjectorMulColor0 left at material default
(no color field in keyData).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Volume, VolumeProfile, TextureCurve are in Unity.RenderPipelines.Core.Runtime,
not in the URP Runtime assembly. asmdef references are non-transitive so
both assemblies must be listed explicitly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Required for UnityEngine.Rendering.Universal namespace used
in Director.cs post-processing handlers.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three new URP Volume Override tracks (Path A):
ChromaticAberration (73): power → intensity, isEnable toggles effect.
Per-channel redOffset/greenOffset/blueOffset not expressible in URP built-in CA.
HdrBloom (38): bloomIntensity → Bloom.intensity, threshold → Bloom.threshold.
Fields unconfirmed (no bundle data in 30-song scan).
ColorCorrection (61): saturation (game 1.0=neutral) → ColorAdjustments.saturation
(URP range -100..100). redCurve/greenCurve/blueCurve → ColorCurves via TextureCurve.
Depth curves and selective color have no URP equivalent.
Director.InitializeTimeline() acquires or creates a Volume on Camera.main and
adds the required overrides programmatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BlinkLight (pattern != 0): was always on; now computes intensity each
frame from turnOnTime/keepTime/turnOffTime/intervalTime/waitTime/
loopCount/powerMin/powerMax — supports fade-in, hold, fade-out, interval
cycle. pattern == 0 retains the original static per-light path.
ParticleGroup: was driving emission from FlickerLightRate only;
now uses MinMaxCurve(FlickerDarkRate, FlickerLightRate) so Unity
randomly samples between the two rates each emission event.
Also adds TODO comments on WashLight, Laser, UVScrollLight incomplete
fields, updates CLAUDE.md track table and live-shader-todo.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LiveTimelineEffectData.cs: new data class with full field set
(color, offset, owner, occurrenceSpot, IsLinkOwner*, etc.)
derived from actual cutt asset bundle TypeTree dump
- LiveTimelineWorkSheet: add effectList field
- LiveTimelineControl: add OnUpdateEffect event and AlterUpdate_EffectControl
- Director: add OnEffectUpdate handler and ApplyEffectTransform helper
loads prefab from 3d/effect/live/pfb_{name}, instantiates per key frame
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* update BillboardBuilder
* add a new enum value
* Add the EnableRootMotion option to support scenarios where the character is not within the camera view
* Add support for exporting prop
* update
* compatible with the new version 2
* update
---------
Co-authored-by: 左右看 <1918891542@qq.com>
* Bug fix, improved UI layout and live vocals
* Bug Fixes, New Live Compatibility
* Android build support
* Update build.yml
* Fix issues with the new version of the game
* bug fix
* add config button
* Improve performance
* Sync fork
* bug fix, new uma compatibility
* Add /UserSettings to gitignore
* bug fix, add live characher shader control
* fix compilation errors
* fix compilation errors 2
* fix the live lighting calculation logic
* bug fix, add editor layout settings to gitignore
* bug fix, add editor layout settings to gitignore
* Add time scale keys for live
* live camera bug fix
* add live stage control, optimize live performance
* fix build error
* add uma head custom
* Add tiptoes rotation for VMD export
* Add a save path prompt when exporting VMD files.
* Remove the debug code for body dragging.
* Remove unused physics components to improve performance.
* Fix incorrect VMD exports for loop animations
Fix VMD motion errors during repeated recordings
Fix ghost bone persistence after multiple recordings
* Revert "Remove unused physics components to improve performance."
This reverts commit 7a1ae7f7d13d05380f9215b653d1c6719303a458.
* Reapply "Remove unused physics components to improve performance."
This reverts commit fe4c05f6942198864ca06e25f17a11440961040d.
* fix https://github.com/katboi01/UmaViewer/issues/95
* live timescale bug fix
* bug fix for skin and tail textures in live
* bug fix for skin and tail textures in live (2)
* fix https://github.com/katboi01/UmaViewer/issues/108
* message ui bug fix
* Bug fix, improved UI layout and live vocals
* Bug Fixes, New Live Compatibility
* Android build support
* Update build.yml
* Update build.yml
* Update build.yml
* Update build.yml
* Update build.yml
* Update build.yml
* Fix issues with the new version of the game
* bug fix
* add config button
* Improve performance
* Sync fork
* bug fix, new uma compatibility
* Add /UserSettings to gitignore
* bug fix, add live characher shader control
* fix compilation errors
* fix compilation errors 2
* fix the live lighting calculation logic
* bug fix, add editor layout settings to gitignore
* bug fix, add editor layout settings to gitignore
* Add time scale keys for live
* live camera bug fix
* add live stage control, optimize live performance
* fix build error
* add uma head custom