using UnityEngine; // Добавляет «Терем богатыря» в список стройки САМ при запуске сцены (как Казармы и Госпиталь). // Срабатывает до восстановления зданий из сохранения (SettlementRestoringEvent), поэтому построенный // Терем корректно восстанавливается из save.json. Цена -- ТЕСТ (согласовать с Димой). public static class HeroCastleBootstrap { public const string CastleName = "Терем богатыря"; public const int CostWood = 400; // ТЕСТ public const int CostStone = 300; // ТЕСТ static GameObject runtimeTemplate; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] static void Init() { Ensure(); 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 == CastleName) return; // уже есть if (template == null && b.prefab != null) template = b; } if (template == null) { Debug.LogWarning("[ТЕРЕМ] Нет ни одного здания-шаблона в BuildManager"); return; } // Префаб-шаблон в памяти: копия обычного здания без сбора ресурсов, с компонентом HeroCastle if (runtimeTemplate == null) { runtimeTemplate = Object.Instantiate(template.prefab); runtimeTemplate.name = "HeroCastle"; 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.85f, 0.35f); // пока нет арта -- отличаем цветом (золотой) runtimeTemplate.AddComponent(); } var data = ScriptableObject.CreateInstance(); data.name = "Data_HeroCastle_Runtime"; data.buildingName = CastleName; data.icon = template.icon; data.prefab = runtimeTemplate; data.requiredTownHallLevel = 1; // ТЕСТ data.cost = new[] { new ResourceCost { type = ResourceType.Wood, amount = CostWood }, new ResourceCost { type = ResourceType.Stone, amount = CostStone }, }; bm.allBuildings.Add(data); Debug.Log("[ТЕРЕМ] Добавлен в список стройки"); } }