using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Utils; namespace Base { public interface ITick { public void Tick(); } public interface ITickPhysics { public void TickPhysics(); } public interface ITickUI { public void TickUI(); } public class Clock : MonoSingleton { private bool _pause = false; public bool Pause { get { return _pause; } set { if (value) { Time.timeScale = 0; } else { Time.timeScale = 1; } _pause = value; } } public List tickPhysics = new(); public List ticks = new(); public List tickUIs = new(); private void Update() { if (!_pause) foreach (var tick in ticks) tick.Tick(); foreach (var uiTick in tickUIs) uiTick.TickUI(); //if (timer > 1) //{ // timer -= 1; // Debug.Log("滴答"); //} //timer += Time.deltaTime; } private void FixedUpdate() { if (!_pause) foreach (var physicsTick in tickPhysics) physicsTick.TickPhysics(); } private void OnDestroy() { // 移除事件监听 SceneManager.sceneLoaded -= OnSceneLoaded; } protected override void OnStart() { // 注册场景加载事件 SceneManager.sceneLoaded += OnSceneLoaded; // 初始化时调用一次 Init(); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { // 场景加载完成后调用 Init 方法 Init(); } /// /// 初始化方法 /// public void Init() { ticks.Clear(); tickPhysics.Clear(); tickUIs.Clear(); foreach (var obj in FindObjectsByType(FindObjectsSortMode.None)) { if (obj is ITick tickObj) ticks.Add(tickObj); if (obj is ITickPhysics physicsObj) tickPhysics.Add(physicsObj); if (obj is ITickUI uiObj) tickUIs.Add(uiObj); } } public static void AddTick(ITick tick) { if (Instance != null && !Instance.ticks.Contains(tick)) Instance.ticks.Add(tick); } public static void RemoveTick(ITick tick) { if (Instance != null) Instance.ticks.Remove(tick); } public static void AddTickPhysics(ITickPhysics physics) { if (Instance != null && !Instance.tickPhysics.Contains(physics)) Instance.tickPhysics.Add(physics); } public static void RemoveTickPhysics(ITickPhysics physics) { if (Instance != null) Instance.tickPhysics.Remove(physics); } public static void AddTickUI(ITickUI ui) { if (Instance != null && !Instance.tickUIs.Contains(ui)) Instance.tickUIs.Add(ui); } public static void RemoveTickUI(ITickUI ui) { if (Instance != null) Instance.tickUIs.Remove(ui); } } }