Asset Dump
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
---
|
||||
date: 2026-06-03
|
||||
type: session
|
||||
tags: [session, input, controls, aiming, gamepad, netcode, presentation]
|
||||
---
|
||||
|
||||
# Session 2026-06-03 — Aim controls: mouse cursor + gamepad twin-stick
|
||||
|
||||
## Goal
|
||||
|
||||
Fix janky aiming: on mouse+keyboard show a cursor and make the character **face/fire toward the cursor** (instead of only along movement), **preserve gamepad** support, and research how V Rising / similar do KBM+gamepad. Operator forks (asked up front): **per-scheme native** reticle (KBM crosshair + gamepad world ring) and **precise mouse / gamepad-only auto-aim**.
|
||||
|
||||
## Done
|
||||
|
||||
- **Root-caused** the jank: `PlayerInput.Aim` was bound only to `<Gamepad>/rightStick`; KBM had no aim path → `PlayerAimSystem` fell back to the movement heading.
|
||||
- **Mouse cursor aim** wired in `PlayerInputGatherSystem` (client): cursor → `Camera.main.ScreenPointToRay` → `AimMath.PlanarAimFromRay` (new pure, Burst-safe, unit-tested) → player→cursor direction written to the existing `PlayerInput.Aim` `[GhostField]`. **No new ghost/netcode surface**; strafe-while-aiming is free (movement already decoupled from facing).
|
||||
- **Active-scheme detection** (last-meaningful-actuation-wins, deadzone + `lastUpdateTime` tiebreak) → new replicated **`byte PlayerInput.Scheme`** (`InputSchemeId`, byte not enum for Burst).
|
||||
- **Auto-target gated to gamepad** in `AbilityFireSystem` (precise mouse): cone applied only when `applied.InternalInput.Scheme == Gamepad`.
|
||||
- **Per-scheme presentation** in new `AimReticleSystem` (client `PresentationSystemGroup`, asset-free): KBM procedural crosshair cursor; gamepad hidden cursor + flat world reticle ring along replicated `PlayerFacing`. Static bridge `AimPresentation.Scheme` (resets on play-enter). `DebugInputInjectionSystem` stamps `Scheme` for editor validation.
|
||||
- **Validation:** compile/Burst clean, 0 new warnings, **EditMode 81/81** (7 new `AimMathTests`). Runtime: worlds boot, no exceptions, `Scheme` replicates to server (`=1`), `Aim=(1,0)`→server `Facing=(1,0)`, reticle activates/flat/positioned/material, cursor hides on gamepad.
|
||||
- **Adversarial review workflow** (5 dims, verified): 5 confirmed / 5 rejected → fixed the static-reset (major), `Shader.Find` guard, debug-injection scheme sync; declined the `mainTexture` nit (verified correct).
|
||||
|
||||
## Decisions
|
||||
|
||||
- [[DR-012_Aim_Controls_Cursor_Gamepad]] — client-derived cursor aim on the existing `[GhostField]` direction; replicated `byte Scheme` gates gamepad-only assist; per-scheme native cursor/reticle; reset-static-presentation-bridge idiom.
|
||||
|
||||
## Refinement — world-space cursor (follow-up)
|
||||
|
||||
After the first pass landed and tested well, the operator asked to make KBM aiming feel more natural / world-space. A research workflow (V Rising action-mode cursor-hide, Last Epoch / PoE2 / Diablo, TopDown Engine `ReplaceMousePointer`, dual-stick feel) confirmed the perspective-mismatch artifact (a flat screen crosshair sits visually *above* the angled ground point it targets) and recommended **reticle-only**.
|
||||
|
||||
- **KBM now shows the world ground ring at the cursor's ground-projection point** — re-raycast **inside `AimReticleSystem`** (PresentationSystemGroup runs after the camera's LateUpdate move, so the ring tracks the cursor with no 1-frame follow-cam drift), NOT latched from the gather. The screen crosshair is gone; the OS cursor is hidden while aiming + focused and restored on focus-loss/destroy. New pure `AimMath.TryGroundHit` returns the world point; last valid point held on a miss.
|
||||
- **Radial dead-zone** (`AimMath.PlanarAimFromRay` `deadZoneRadius`, 0.6u in the gather) holds facing when the cursor is over/near the character (no spin).
|
||||
- **Camera look-ahead** — `PrototypeCameraRig.AimLeadDistance` (tunable, default 2.5u, 0 = off) leads the framed point toward the replicated `PlayerFacing` (driven off facing, not the cursor projection → no feedback loop); `PrototypeCameraTargetSystem` now publishes `TargetFacing`.
|
||||
- Validated: EditMode **86/86** (5 new AimMath tests), console clean; runtime KBM ring active at the cursor ground point, OS cursor hidden when focused, `TargetFacing` published, no exceptions.
|
||||
|
||||
## Open / deferred
|
||||
|
||||
- Real mouse-cursor path + live KBM↔gamepad auto-switch need a **focused** Game view (unfocused editor can't inject mouse position); operator focused click-test pending. Headless validation covered math/replication/gate/reticle.
|
||||
- Auto-target priority/feel tuning; optional controller soft-target reticle snap; rebindable controls; multi-ability slots.
|
||||
|
||||
## Next
|
||||
|
||||
- Operator focused click-test of cursor aim + device switching; then consider ability-slot expansion or controller aim-assist tuning.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
date: 2026-06-03
|
||||
type: session
|
||||
tags: [session, dots, netcode, art, synty, urp, vfx, presentation, environment, world, visual]
|
||||
permalink: gamevault/07-sessions/2026/2026-06-03-synty-world-and-vfx
|
||||
---
|
||||
|
||||
# Session 2026-06-03 (B) — Synty grounded world + GabrielAguiar VFX
|
||||
|
||||
## Goal
|
||||
|
||||
Second art pass (after [[2026-06-03_Visual_Upgrade_HomeBase]]). Operator: "implement the VFX (now imported), change the world to be **not a floating plane** — make it feel grounded (terrain or otherwise), deepen the environment; I imported a ton of Synty packs — inventory and use them; whatever works best; **it should all look cohesive**." Two forks were resolved by the operator: **go full Synty** (cohesive — retire the BefourStudios base) and **keep primitives** for player/enemies (DOTS has no easy skeletal animation; static rigged meshes would slide as T-poses). Locked in [[DR-011_Synty_World_VFX_Integration]].
|
||||
|
||||
## Inventory (what landed)
|
||||
|
||||
- **GabrielAguiar VFX — now extracted:** 499 prefabs + 27 `.vfx`. **472/499 are Shuriken ParticleSystems** (pool/instantiate-friendly), URP-compatible; only the HitsImpactsV2 + beams are VFX Graph (deferred). Packs: Magic Abilities, Projectiles Vol2/3, SciFi Vol1, Stylized Explosions.
|
||||
- **Synty — 6 POLYGON packs**, all **URP-native** (`Synty/Generic_Basic` etc — no HDRP→URP conversion). `SciFiCity + SciFiSpace + Mech` = a fully cohesive flat-shaded sci-fi set (buildings, walls, landing pads, **14 planets + asteroids** for a horizon, hangar floors, characters); `Generic` = ground/cliffs (earth-toned); `DungeonRealms` = fantasy (clashes, skip); `ParticleFX` = extra particles.
|
||||
|
||||
## Process
|
||||
|
||||
- 3 read-only Explore agents inventoried VFX, Synty, and the current scene/VFX hook points; 2 operator forks via `AskUserQuestion`.
|
||||
- **Implementation sequential via MCP** (single editor). World built as **classic-URP cosmetic GameObjects in SampleScene** — sidesteps the Synty-shader-in-Entities-Graphics question entirely (only the gameplay subscene needs EG/physics).
|
||||
- **Adversarial review workflow (3 lenses)** over the diff — caught a real blocker (below) + perf notes; all fixed/verified.
|
||||
|
||||
## Done
|
||||
|
||||
- **Retired BefourStudios from the subscene** — deleted the `EnvDecor` root (13 props); **disabled** `Wall_North`/`Wall_East`/`Pillar_Center` MeshRenderers while **keeping their BoxColliders** (gameplay collision intact, no invisible RenderMesh); disabled the old grey `Ground` renderer. Subscene re-bakes dome-less on Play.
|
||||
- **Grounded Synty world** (`SyntyWorld` root in SampleScene, ~60 cosmetic objects): large Synty ground plane (top at y=0), a 16-tile paved tech plaza over the play area, a **16-building skyline ring** (facing centre) + perimeter city walls/tower for depth, **boundary barriers aligned to the collision walls**, scattered props (crates/pipes/light-bars/antenna/landing-pad), a **planet on the horizon** + asteroid field, a Synty **space skybox** (`Skybox/6 Sided`), brighter flat ambient + light fog. Kills the floating-plane: it reads as a colony on a planet under a nebula.
|
||||
- **GabrielAguiar VFX wired into combat** — new `VFXConfig` MonoBehaviour bridge (`ProjectM.Client`, static `Instance`, 5 prefab slots; mirrors `PrototypeCameraRig`) on a SampleScene object, assigned cyan-energy muzzle/trail/hit + orange stylized explosions for death. `CombatFeedbackSystem` now `Burst()`es the authored prefab at each hook (muzzle/hit/enemy-death/player-death) with the procedural ParticleSystem as fallback, plus `UpdateProjectileTrails` (a trail GameObject follows each projectile ghost, pruned on despawn). Verified: blue hit VFX fires on husk-on-player contact, no errors.
|
||||
|
||||
## Validation
|
||||
|
||||
- **EditMode 74/74** (unchanged). Both worlds boot, **11 ghosts replicate**; the re-bake correctly drops the dome; **player collision with the (now-invisible) subscene walls intact**; the world reads as a cohesive grounded Synty sci-fi colony (hero shot `Assets/Screenshots/synty_hero_final.png`); **hit VFX visibly fires** with no console errors (only the unfocused-editor tick-batching warning). Cosmetic Synty world has **zero** sim/netcode/physics impact (classic PhysX colliders are separate from the baked DOTS PhysicsWorld; nothing in SampleScene is a ghost).
|
||||
- **Adversarial review (3 lenses):** **1 blocker + perf findings, all fixed** (below); the scene/netcode isolation reasoning verified end-to-end.
|
||||
|
||||
## Review fixes (this session)
|
||||
|
||||
- **BLOCKER — the `ProjectileTrail` prefab was a GA demo *projectile*, not a passive trail** (`vfx_Projectile_Orb01_Blue` ships a non-kinematic Rigidbody + collider + `ProjectileMoveScript` speed 25). Instantiated per projectile, it self-propelled (fighting the per-frame reposition), collided with classic scene colliders, and spawned secondary muzzle/hit VFX. **Fixed** with `StripCosmetic()` — strips `Rigidbody`/`Collider` and disables any `Projectile`/`Move`-named MonoBehaviour (before its `Start` runs) on every spawned VFX, so only the ParticleSystems remain. Future-proofs all VFX slots.
|
||||
- **TTL** now derived from the prefab's longest ParticleSystem (`main.duration + startLifetime`, clamped 1–6 s) instead of a blanket 3 s; **`MaxActiveVfx=40`** caps one-shot VFX churn under swarms; trails are cleared if `VFXConfig` goes null mid-run.
|
||||
- Verified single active global Volume; the lone modified PDF `.meta` is the operator's GA import artifact (not ours).
|
||||
|
||||
## Diagnosis notes (for future me / future Synty packs)
|
||||
|
||||
- **Synty is URP-native — no conversion** (unlike the HDRP BefourStudios art). Place Synty as **classic-URP GameObjects in SampleScene** (cosmetic, client-only) and the custom `Synty/Generic_Basic` shader just renders; only the gameplay subscene needs Entities Graphics + physics. This sidesteps verifying Synty-shader DOTS-instancing.
|
||||
- **"Grounded" = surround + horizon, not a bigger plane.** A skyline ring of tall buildings + a planet/asteroid backdrop + a space skybox + fog killed the floating-plane far better than extending the ground; the ground edge curving to a starfield reads as a planetoid surface.
|
||||
- **A GA "projectile" prefab is NOT a trail** — it's a self-moving demo with physics + secondary-VFX spawns. Any authored VFX dropped into a cosmetic slot must be **stripped to particles** (kill Rigidbody/Collider/mover). Same "grabbed the wrong prefab kind" trap as last pass's HDRP-vs-trail material bug — verify the prefab's components, not just its name.
|
||||
- **Disabled MeshRenderer + kept BoxCollider** in a subscene = invisible wall with collision (collider still bakes to the static PhysicsCollider; no RenderMesh entity). The clean way to keep gameplay bounds while swapping the visual to another scene/style.
|
||||
- **Cosmetic SampleScene colliders are inert to gameplay** — they live in classic PhysX, separate from the DOTS PhysicsWorld baked from the subscene; the planar-pinned CC never sees them. So a cosmetic world needs no collider stripping for *gameplay* (only stripped on VFX to stop demo movers).
|
||||
- **VFX prefab bridge pattern:** a `MonoBehaviour` with a static `Instance` + prefab fields (assigned in the bootstrap scene) is the clean way to hand authored assets to a managed client `SystemBase` — mirrors `PrototypeCameraRig`. Keep a procedural fallback so a null slot still runs.
|
||||
- **Projectile-follow VFX:** query `SystemAPI.Query<RefRO<LocalTransform>>().WithAll<Projectile>()` client-side each presentation frame; dict-by-`Entity` spawn/reposition/prune (same idiom as the Health cache). Destroy the trail when the projectile entity vanishes.
|
||||
- **One-shot Fire still drops under the unfocused editor** — so muzzle / projectile-trail / enemy-death VFX (which need the player to fire/kill) weren't visually fired this session; they use the same verified `SpawnVfx` path as the confirmed hit VFX. Confirm with a focused editor or a real client.
|
||||
|
||||
## Open / deferred
|
||||
|
||||
- **Confirm fire-driven VFX visually** (muzzle, projectile trail, enemy-death explosion) with a focused editor / real client.
|
||||
- **Ghost-prop cohesion gap:** Storage/UpgradePickup ghosts still use the BefourStudios converted meshes/materials (they render via Entities Graphics; a Synty mesh there would need the Synty shader's DOTS-instancing verified). Reskin to flat Synty-style or simple emissive later.
|
||||
- **Orphaned `Materials/Env/` (BefourStudios)** — the decorative converted materials are now unused (EnvDecor deleted); a few are still referenced by the ghosts/hidden walls. Prune the truly-orphaned ones in a cleanup pass.
|
||||
- **Characters** — player/enemies remain primitives; revisit with DOTS skeletal animation as its own task (Synty has crew/alien/mech meshes ready).
|
||||
- **Perf**: top-down Bloom + ~60 Synty objects + a 300-unit planet — fine in-editor; budget bloom + confirm frustum/distance culling for a build. VFX Graph hit/beam packs need separate URP setup if wanted.
|
||||
- **Mixed-theme arena** — BioHorror/Synty corrupted zones for danger areas (deferred from the scope gate).
|
||||
|
||||
## Next
|
||||
|
||||
Confirm the fire-driven VFX with a focused editor, then either polish (ghost-prop reskin + orphaned-material prune + a reflection probe) or resume the milestone track. The Synty-in-SampleScene world pattern + the `VFXConfig` bridge generalize to all future packs.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
date: 2026-06-03
|
||||
type: session
|
||||
tags: [session, dots, netcode, art, urp, entities-graphics, materials, presentation, home-base, visual]
|
||||
permalink: gamevault/07-sessions/2026/2026-06-03-visual-upgrade-homebase
|
||||
---
|
||||
|
||||
# Session 2026-06-03 — Art import + home-base visual upgrade (Synty/BefourStudios → URP)
|
||||
|
||||
## Goal
|
||||
|
||||
The operator imported a large art/VFX asset bundle (commit `e362aae`, ~4,830 files) and asked to **inventory it and use it to make the project look visually better**, with more Synty packs coming later. Scope was set via a 4-question gate: **render pass + curated home-base dressing**, enemies/player stay primitives (no character meshes in these packs), VFX deferred, theme = **clean orbital base**. Locked in [[DR-010_Art_Import_URP_Conversion_Visual_Upgrade]].
|
||||
|
||||
## Inventory (what was actually imported)
|
||||
|
||||
- **BefourStudios/Art** (orbital-base modular kit — domes, batteries, crates, plants, modular blocks, lights, solar, storage), **/SciFiEngineersRoom** (interior), **/BioHorrorSciFiEnvironment** (organic/decay). ~560 prefabs, hundreds of FBX + PBR textures (`T_*_B/_N/_ORM`).
|
||||
- **GabrielAguiarProductions VFX = NOT in the repo** — only 3 PDF docs committed; zero `.unitypackage`/`.vfx`/prefabs. VFX deferred until imported.
|
||||
- **No character meshes anywhere** — packs are environment/props only.
|
||||
- **Pipeline mismatch:** the art is **HDRP-authored** (`Shader Graphs/S_General`, HDRP/Lit; `_DISABLE_SSR_TRANSPARENT`, `RayTracingPrepass`) while the project runs **URP 17.4 + Entities Graphics** → source materials render **magenta** under URP. Meshes + textures are fully usable; materials must be re-authored to stock URP/Lit (`933532a4…`, the same shader the project's working prototypes use → Entities-Graphics-compatible). Blank auto-generated `MI_*` URP stubs exist but carry no textures.
|
||||
|
||||
## Process
|
||||
|
||||
- **Plan-gated** (read-only): 3 Explore agents inventoried the packs + current visual/render setup; a Plan agent pressure-tested the execution sequence (corrected several of my assumptions by reading files). Operator approved.
|
||||
- **Implementation = sequential via MCP** (single editor, domain-reload-ordered; NOT a parallel swarm): a reusable Editor converter, ghost-prefab mesh swaps (PrefabUtility round-trip), subscene dressing (open additive → place → save → re-bake), and a SampleScene render pass.
|
||||
- **Adversarial review workflow (3 lenses: code / netcode / conventions)** over the diff. It **earned its keep** — caught 2 blockers + 1 major that the dark lighting masked in the screenshot. All fixed; minors triaged.
|
||||
|
||||
## Done
|
||||
|
||||
- **`Assets/_Project/Scripts/Editor/EnvArtTools.cs`** (new; Assembly-CSharp-Editor, `#if UNITY_EDITOR`) — reusable HDRP→URP material converter for future packs. Reads source texture refs across HDRP/Lit + ShaderGraph property names (`_BaseColorMap`/`_BaseTexture`→`_BaseMap`, `_NormalMap`/`_NormalTexture`→`_BumpMap`), **type-guards every color/float/texture read** (verify `ShaderPropertyType` before `GetColor`/`GetFloat`), low metallic (no reflection probe ⇒ high-metallic reads black), source-flag-gated emission, alpha-clip from source flags. `ConvertCurated()` menu item + `RemapRenderersToEnv(go)`. GUID-preserving overwrite (refs survive re-runs). Outputs to `Assets/_Project/Materials/Env/` (20 materials).
|
||||
- **Ghost prop mesh swaps** — `Storage.prefab` → `SM_Storage_LOD0` (scale 0.6), `UpgradePickup.prefab` → `SM_Battery_LOD0` + emissive `M_Env_PickupGlow` (scale 2.5). GhostAuthoring/LinkedEntityGroup/gameplay authoring preserved; only mesh+material+scale changed.
|
||||
- **Two server spawners patched to preserve baked scale** (`UpgradePickupSpawnSystem`, `SharedStorageSpawnSystem`): `LocalTransform.FromPosition()` hard-sets Scale=1, which silently discarded the prefab scale — now they read the prefab's baked `LocalTransform` and only override Position.
|
||||
- **Gameplay subscene dressed** — `EnvDecor` root of 13 collider-stripped, unpacked static props (dome backdrop, modular blocks, batteries/charger, crates, plants, light poles, solar panels) with URP materials; existing `Wall_North/East`/`Pillar_Center` re-skinned (colliders/positions kept) with tiled `M_Env_Wall`. No GhostAuthoring on scenery.
|
||||
- **SampleScene render pass** — cool key light @1.45–1.75; dark-space procedural skybox; flat dark ambient; exp fog @0.006 (keeps the z=26 dome visible); `Ground` re-skinned to tiled `M_Env_Floor`; **`PostFX_DarkSciFi` profile populated** (Bloom / ACES Tonemapping / ColorAdjustments / Vignette) and made the single active global volume (overlapping `GlobalPostFX` disabled).
|
||||
|
||||
## Validation
|
||||
|
||||
- **EditMode 74/74 green** (unchanged; the spawner edits compiled clean — note: EditMode test *init* timed out once on the unfocused editor, passed on retry with `init_timeout=180000`).
|
||||
- **Runtime (single in-editor client, 6.4.7):** both worlds boot, **11 ghosts replicate** server↔client; player input → prediction → replication works and the **character is blocked by the east wall** (static PhysicsWorld survived the dressing); ghost **scales now apply** (Storage 0.60, pickups 2.50, others 1.0). Console clean of code/Burst/material/bake errors (only "Server Tick Batching" warnings — the documented unfocused-editor symptom; decor adds **zero** server-sim load). Screenshots `Assets/Screenshots/result_clean_base.png` (after) vs `baseline_editmode.png` (before) confirm the jump.
|
||||
- **Adversarial review (3 lenses):** **2 blockers + 1 major, all fixed** (below); remaining findings are minor/future-pack robustness, addressed or noted.
|
||||
|
||||
## Diagnosis notes (for future me / future Synty packs)
|
||||
|
||||
- **The art is HDRP, the project is URP.** Source `M_*` materials render magenta. Convert to **stock URP/Lit** via `EnvArtTools` (do NOT switch the project to HDRP — it would break Entities Graphics). Meshes + `_B/_N/_ORM` textures are reusable as-is.
|
||||
- **A screenshot under dark lighting MASKS material bugs.** The adversarial review caught a **black-`_BaseColor` blocker** on ~16/20 materials: `HasProperty("_BaseColorMultiply")` was true (it's a *float* on `S_General`), `GetColor()` on a float returns (0,0,0) and logs a "doesn't have a color property" warning — the very warning I'd dismissed as cosmetic. **Always `shader.GetPropertyType(idx)`-guard before `GetColor`/`GetFloat`;** the real tint is `_AlbedoTint`. Verify material *values*, not just the render.
|
||||
- **Source emission needs the `_Emissive` (0/1) flag gate.** `S_General` carries a non-zero default `_EmissiveColor` even when emission is off → reading the color unconditionally made crates/dome/walls glow. Emit only when `_Emissive>0.5` AND the name marks a light fixture; flat color emission can't reproduce the source's emission mask anyway.
|
||||
- **`VolumeProfile.Add<T>()` does NOT persist the override as a sub-asset** — on save the `components` list serializes 4 `{fileID:0}` nulls (works in-session, gone after reload). Must `AssetDatabase.AddObjectToAsset(component, profile)` for each, then `SaveAssets`. Verify on disk (non-null refs + N+1 MonoBehaviour blocks).
|
||||
- **`LocalTransform.FromPosition()` resets Scale to 1** — any ghost spawned via it ignores its prefab's authored scale (and Scale *is* a replicated `[GhostField]`, so it's consistent-but-wrong, not a desync). Read the prefab's baked `LocalTransform` and override only Position to keep authored scale.
|
||||
- **High metallic + no reflection probe + dark skybox = near-black surfaces.** Keep converted env metallic low (0.1–0.2); rely on albedo + direct light. (A baked reflection probe would let metallic read correctly later.)
|
||||
- **Metallic without reflections looked "too dark" before the tint bug was even found** — two compounding causes (black albedo + high metallic); fixing both gave a bright, readable base.
|
||||
- **Editing a subscene via MCP:** `manage_scene load … additive` opens the authoring scene (the baked-entity view it was showing goes away — empty game view is expected), edit + `SaveScene`, then `close_scene` so the SubScene re-bakes from the saved file on Play. Verify placement via `execute_code` enumerating the scene roots, not the game view.
|
||||
- **HUD-free beauty shot:** a **positioned `game_view` capture** (`view_position`/`view_rotation`) uses direct camera rendering, which *excludes* Screen-Space-Overlay UI — so the gameplay death overlay doesn't bleed into the render. (`scene_view` rejects positioned capture.)
|
||||
- **`execute_code` is a method body** (no usings; fully-qualify). Reusable converter logic belongs in a committed Editor script, not repeated `execute_code` blobs — the operator is importing more packs.
|
||||
|
||||
## Open / deferred
|
||||
|
||||
- **VFX** — import the GabrielAguiar `.unitypackage`s, then wire the **Shuriken** packs (projectiles/explosions/shields/auras) into the existing client `ParticleSystem` pool; the **VFX Graph** packs (hits/beams) need separate URP setup.
|
||||
- **Characters** — player/enemies are still primitives; swap for real models when a character/Synty pack arrives (the prefab+material pattern generalizes).
|
||||
- **Decor LODs bake into both worlds** — the 13 props' full LOD hierarchies are in the shared subscene, so the server carries renderable+`MeshLODGroup` entities for nothing. For more decor, move pure cosmetics to a client-only/cosmetic subscene or flatten to LOD0.
|
||||
- **Higher material fidelity** — current converter uses uniform metallic/smoothness (ORM channels don't map to URP); a per-channel ORM→URP repack (or a small ORM ShaderGraph) + a baked reflection probe would deepen the look.
|
||||
- **More dressing** — mine `S_OrbitalBase.unity` for a fuller layout once the pipeline is proven; the BioHorror pack fits future "corrupted" arena zones (mixed-theme option from the scope gate).
|
||||
|
||||
## Next
|
||||
|
||||
Either **import + wire the VFX** (biggest feel win, needs the operator to import the packs) or **deepen the environment** (more orbital-base dressing + a reflection probe + ORM fidelity). The reusable `EnvArtTools` converter + the duplicate-and-reskin prefab pattern are the foundation for every future Synty pack.
|
||||
Reference in New Issue
Block a user