using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement; using System.Collections.Generic; using System.Linq; public static class SceneStartupFix { [MenuItem("Tools/Diagnose Scene Size")] public static void DiagnoseScene() { var all = Object.FindObjectsOfType(true); var counts = new Dictionary(); var bigParents = new List<(int count, string path)>(); foreach (GameObject go in all) { if (go == null) continue; string n = go.name; counts[n] = counts.ContainsKey(n) ? counts[n] + 1 : 1; int total = go.GetComponentsInChildren(true).Length; if (total > 50) { string path = go.name; if (go.transform.parent != null) path = go.transform.parent.name + "/" + path; bigParents.Add((total, path)); } } bigParents.Sort((a, b) => b.count.CompareTo(a.count)); string report = $"Total objets: {all.Length}\n\nTop parents (>50 enfants):\n"; foreach (var p in bigParents.GetRange(0, Mathf.Min(20, bigParents.Count))) report += $" {p.count,5} {p.path}\n"; Debug.Log(report); } static readonly HashSet _keepActive = new HashSet { "Canvas", "Panel_start", "Pnl_start", "EventSystem", "WaitCircle", "LoadingCircle", "Language", }; // Root-level objects that must be INACTIVE at startup static readonly string[] _rootDeactivate = new string[] { "PLAN2DHandler", }; [MenuItem("Tools/Fix Scene Startup State")] public static void FixStartupState() { var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); int disabled = 0; // Deactivate known root objects that should be inactive at startup foreach (string name in _rootDeactivate) { GameObject obj = GameObject.Find(name); if (obj != null && obj.activeSelf) { Undo.RecordObject(obj, "Fix Startup"); obj.SetActive(false); Debug.Log($"[Fix] Root désactivé: {name}"); disabled++; } } // Trouver le Canvas racine et désactiver TOUS ses enfants directs // sauf ceux dans _keepActive GameObject canvas = GameObject.Find("Canvas"); if (canvas != null) { foreach (Transform child in canvas.transform) { if (child == null) continue; if (_keepActive.Contains(child.name)) continue; if (!child.gameObject.activeSelf) continue; Undo.RecordObject(child.gameObject, "Fix Startup"); child.gameObject.SetActive(false); Debug.Log($"[Fix] Canvas enfant désactivé: {child.name}"); disabled++; } } EditorSceneManager.MarkSceneDirty(scene); int remaining = Object.FindObjectsOfType(true) .Count(go => go != null && go.activeInHierarchy); Debug.Log($"[Fix] Désactivé {disabled} objets | Actifs restants: {remaining} → Ctrl+S"); } }