66 lines
3.4 KiB
C#
66 lines
3.4 KiB
C#
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<BuildManager>();
|
|
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<ResourceCollector>()) Object.DestroyImmediate(c);
|
|
foreach (var c in runtimeTemplate.GetComponents<ResourceProducer>()) Object.DestroyImmediate(c);
|
|
foreach (var c in runtimeTemplate.GetComponents<BuildingUI>()) Object.DestroyImmediate(c);
|
|
for (int i = runtimeTemplate.transform.childCount - 1; i >= 0; i--)
|
|
Object.DestroyImmediate(runtimeTemplate.transform.GetChild(i).gameObject); // полоска запаса ресурса
|
|
var sr = runtimeTemplate.GetComponent<SpriteRenderer>();
|
|
if (sr != null) sr.color = new Color(1f, 0.85f, 0.35f); // пока нет арта -- отличаем цветом (золотой)
|
|
runtimeTemplate.AddComponent<HeroCastle>();
|
|
}
|
|
|
|
var data = ScriptableObject.CreateInstance<BuildingData>();
|
|
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("[ТЕРЕМ] Добавлен в список стройки");
|
|
}
|
|
}
|