using UnityEngine; // Добавляет «Госпиталь» в список стройки САМ при запуске сцены (как Казармы -- BarracksBootstrap). // Срабатывает до восстановления зданий из сохранения (SettlementRestoringEvent), поэтому построенный // госпиталь и его уровень корректно восстанавливаются из save.json. public static class HospitalBootstrap { public const string HospitalName = "Госпиталь"; 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 == HospitalName) return; // уже есть if (template == null && b.prefab != null) template = b; } if (template == null) { Debug.LogWarning("[ГОСПИТАЛЬ] Нет ни одного здания-шаблона в BuildManager"); return; } // Префаб-шаблон в памяти: копия обычного здания без сбора ресурсов, с компонентом Hospital if (runtimeTemplate == null) { runtimeTemplate = Object.Instantiate(template.prefab); runtimeTemplate.name = "Hospital"; 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(0.85f, 0.95f, 1f); // пока нет арта -- отличаем цветом (светло-голубой) runtimeTemplate.AddComponent(); } var config = HospitalConfig.Load(); var data = ScriptableObject.CreateInstance(); data.name = "Data_Hospital_Runtime"; data.buildingName = HospitalName; data.icon = template.icon; data.prefab = runtimeTemplate; data.requiredTownHallLevel = Mathf.Max(1, config.requiredTownHallLevel); data.cost = new[] { new ResourceCost { type = ResourceType.Wood, amount = config.buildWood }, new ResourceCost { type = ResourceType.Stone, amount = config.buildStone }, }; bm.allBuildings.Add(data); Debug.Log("[ГОСПИТАЛЬ] Добавлен в список стройки"); } }