using UnityEngine; // Добавляет "Казармы" в список стройки САМ при запуске сцены -- даже если никто не запускал // Tools -> Build HUD Panels. Если в BuildManager уже есть здание "Казармы" (из Data_Barracks.asset), // ничего не делает. // // Срабатывает после Awake всех объектов, но ДО Start -- то есть раньше, чем GameBootstrap загрузит // сохранение. Поэтому построенные казармы корректно восстанавливаются из save.json. public static class BarracksBootstrap { public const string BarracksName = "Казармы"; static GameObject runtimeTemplate; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] static void Init() { Ensure(); // при каждом новом входе в город (например, возврат с карты мира) -- снова добавить в новый BuildManager UnityEngine.SceneManagement.SceneManager.sceneLoaded += (s, m) => Ensure(); } public static void Ensure() { var bm = BuildManager.Instance != null ? BuildManager.Instance : Object.FindAnyObjectByType(); if (bm == null || bm.allBuildings == null) return; BuildingData template = null; foreach (var b in bm.allBuildings) { if (b == null) continue; if (b.buildingName == BarracksName) return; // уже есть if (template == null && b.prefab != null) template = b; } if (template == null) { Debug.LogWarning("[КАЗАРМЫ] Нет ни одного здания-шаблона в BuildManager"); return; } // Префаб-шаблон в памяти: копия обычного здания без сбора ресурсов, с компонентом Barracks if (runtimeTemplate == null) { runtimeTemplate = Object.Instantiate(template.prefab); runtimeTemplate.name = "Barracks"; runtimeTemplate.SetActive(false); Object.DontDestroyOnLoad(runtimeTemplate); foreach (var c in runtimeTemplate.GetComponents()) Object.DestroyImmediate(c); foreach (var c in runtimeTemplate.GetComponents()) Object.DestroyImmediate(c); foreach (var c in runtimeTemplate.GetComponents()) Object.DestroyImmediate(c); for (int i = runtimeTemplate.transform.childCount - 1; i >= 0; i--) Object.DestroyImmediate(runtimeTemplate.transform.GetChild(i).gameObject); // полоска запаса ресурса var sr = runtimeTemplate.GetComponent(); if (sr != null) sr.color = new Color(1f, 0.55f, 0.55f); // пока нет арта -- отличаем цветом runtimeTemplate.AddComponent(); } var data = ScriptableObject.CreateInstance(); data.name = "Data_Barracks_Runtime"; data.buildingName = BarracksName; data.icon = template.icon; data.prefab = runtimeTemplate; data.requiredTownHallLevel = 1; data.cost = new[] { new ResourceCost { type = ResourceType.Wood, amount = 300 }, new ResourceCost { type = ResourceType.Stone, amount = 200 }, }; bm.allBuildings.Add(data); Debug.Log("[КАЗАРМЫ] Добавлены в список стройки"); } }