using UnityEngine; [System.Serializable] public class ResourceCost { public ResourceType type; public float amount; } [CreateAssetMenu(fileName = "NewBuilding", menuName = "Game/Building Data")] public class BuildingData : ScriptableObject { [Header("Основное")] public string buildingName; public Sprite icon; public GameObject prefab; [Header("Требования")] [Tooltip("Необходимый уровень ратуши")] public int requiredTownHallLevel = 1; [Header("Стоимость")] public ResourceCost[] cost; // Проверка - хватает ли ресурсов? (только проверяет) // Ресурсы -- модуль Экономики, поэтому только через контракт IEconomy public bool CanAfford() { return GameServices.TryGet(out IEconomy economy) && economy.CanAfford(ToAmounts(cost)); } // Списывает стоимость постройки. Вызывать только после CanAfford() == true public void PayCost() { if (GameServices.TryGet(out IEconomy economy)) economy.TrySpend(ToAmounts(cost)); } public static ResourceAmount[] ToAmounts(ResourceCost[] costs) { var result = new ResourceAmount[costs?.Length ?? 0]; for (int i = 0; i < result.Length; i++) result[i] = new ResourceAmount(costs[i].type, costs[i].amount); return result; } // Текст стоимости для UI, например "50 Wood, 20 Stone" public string GetCostText() { string result = ""; for (int i = 0; i < cost.Length; i++) { result += $"{cost[i].amount} {cost[i].type}"; if (i < cost.Length - 1) result += ", "; } return result; } }