using UnityEngine; namespace ProjectM.Client { /// /// Live-tunable knobs for — the Phase 1.5 "world alive" ambient layer /// (per-biome drift particles + idle foliage sway + walk-through rustle). Mirrors the /// / bridge idiom: a MonoBehaviour in /// the gameplay scene with a static the client presentation system reads (falling /// back to these same defaults when absent). Pure presentation — never touches the simulation. /// public sealed class AmbientMotionConfig : MonoBehaviour { public static AmbientMotionConfig Instance; [Header("Master")] public bool Enabled = true; [Header("Biome drift particles (emitter follows the camera; sim space stays world)")] public bool DriftEnabled = true; [Min(0f)] public float DriftRate = 28f; [Min(0.01f)] public float DriftSize = 0.09f; public Color MeadowMoteColor = new Color(0.62f, 0.85f, 0.60f, 0.35f); public Color AridDustColor = new Color(0.85f, 0.68f, 0.45f, 0.28f); public Color CavernMoteColor = new Color(0.55f, 0.65f, 0.95f, 0.33f); public Color BlightSporeColor = new Color(0.72f, 0.50f, 0.85f, 0.33f); public Vector3 AridWind = new Vector3(2.2f, -0.15f, 0.5f); [Header("Idle foliage sway (root tilt) — OFF by default since 1.5b: ALL Synty flora uses the Synty/Foliage")] [Header("VERTEX-wind shader, so root tilt double-animates. Keep for A/B; rustle below stays the reactive layer.")] public bool SwayEnabled = false; [Min(1f)] public float SwayRadius = 30f; [Min(0f)] public float SwayAmpDeg = 1.4f; [Min(0.05f)] public float SwayHz = 0.8f; [Header("Walk-through rustle (local player brushing flora)")] public bool RustleEnabled = true; [Min(0.2f)] public float RustleRadius = 1.7f; [Min(0f)] public float RustleAmpDeg = 7f; [Min(0.5f)] public float RustleHz = 9f; [Min(0.2f)] public float RustleDecay = 2.5f; void OnEnable() { Instance = this; } void OnDisable() { if (Instance == this) Instance = null; } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void ResetStatics() { Instance = null; } } }