39 lines
1.4 KiB
C#
39 lines
1.4 KiB
C#
using UnityEngine;
|
|
|
|
// Слой приложения: "сердцебиение" модуля Населения. Модуль -- чистый C# и не знает про Update,
|
|
// поэтому раз в несколько секунд его досчитывает этот объект. Живёт между сценами (город <-> карта мира).
|
|
// Создаётся сам при запуске игры, вешать никуда не нужно.
|
|
public class PopulationTicker : MonoBehaviour
|
|
{
|
|
const float Interval = 2f; // секунд реального времени между расчётами
|
|
|
|
static PopulationTicker instance;
|
|
float next;
|
|
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
|
|
static void Create()
|
|
{
|
|
if (instance != null) return;
|
|
var go = new GameObject("PopulationTicker");
|
|
DontDestroyOnLoad(go);
|
|
instance = go.AddComponent<PopulationTicker>();
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
next = Time.unscaledTime + Interval; // первый расчёт -- после загрузки сохранения (она идёт в Start сцены)
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (Time.unscaledTime < next) return;
|
|
next = Time.unscaledTime + Interval;
|
|
if (GameServices.TryGet(out IPopulation population)) population.Tick(GameClock.UnixNow);
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
if (instance == this) instance = null;
|
|
}
|
|
}
|