diff --git a/Assets/_Project/Scripts/Client/Debug/PixelArtDevControls.cs b/Assets/_Project/Scripts/Client/Debug/PixelArtDevControls.cs index a10bac7af..e110589d0 100644 --- a/Assets/_Project/Scripts/Client/Debug/PixelArtDevControls.cs +++ b/Assets/_Project/Scripts/Client/Debug/PixelArtDevControls.cs @@ -21,11 +21,33 @@ namespace ProjectM.Client static PixelArtDevControls _instance; + /// + /// OPT-IN EditorPref, mirroring `ProjectM/Boot Into Menu (Editor)`. This used to self-spawn into EVERY + /// scene — Game.unity included, not just DevSandbox — and draws its toggle button on + /// every IMGUI pass BEFORE the `!_open` early-out. IMGUI dispatches at least Layout+Repaint per frame, + /// so it allocated continuously during normal gameplay and dominated allocation profiling until it was + /// found on 2026-08-13. Off by default; enable from the menu when you actually want to tune the look. + /// + const string EnabledPref = "ProjectM.PixelArtDevControls.Enabled"; + const string MenuPath = "ProjectM/Pixel Art Dev Controls (Editor)"; + + [MenuItem(MenuPath)] + static void ToggleEnabled() => EditorPrefs.SetBool(EnabledPref, !EditorPrefs.GetBool(EnabledPref, false)); + + [MenuItem(MenuPath, true)] + static bool ToggleEnabledValidate() + { + Menu.SetChecked(MenuPath, EditorPrefs.GetBool(EnabledPref, false)); + return true; + } + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] static void Bootstrap() { if (_instance != null) return; + if (!EditorPrefs.GetBool(EnabledPref, false)) + return; // opt-in only — see EnabledPref var go = new GameObject("~PixelArtDevControls") { hideFlags = HideFlags.HideAndDontSave }; DontDestroyOnLoad(go); _instance = go.AddComponent();