Files
Gen_Hack-and-Slash-Roguelit…/Client/Assets/Scripts/Base/Clock.cs
2025-07-09 11:35:52 +08:00

125 lines
3.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Cell
{
public class Clock : MonoBehaviour
{
private static Clock _instance;
public bool pause = false;
public List<ITick> ticks = new();
public List<ITickPhysics> tickPhysics = new();
public List<ITickUI> tickUIs = new();
//float timer = 0;
public static Clock Instance
{
get
{
if (_instance == null)
{
// 检查场景中是否已存在实例
_instance = FindAnyObjectByType<Clock>();
// 如果不存在,创建一个新的
if (_instance == null)
{
GameObject clockObject = new GameObject("[Clock]");
_instance = clockObject.AddComponent<Clock>();
DontDestroyOnLoad(clockObject); // 确保对象不被销毁
}
}
return _instance;
}
}
private void Awake()
{
// 确保只有一个实例存在
if (_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this; // 设置当前实例为静态变量
SceneManager.sceneLoaded += OnSceneLoaded; // 注册场景加载事件
}
private void OnDestroy()
{
// 移除事件监听
SceneManager.sceneLoaded -= OnSceneLoaded;
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
// 场景加载完成后调用 Init 方法
Init();
}
/// <summary>
/// 初始化方法
/// </summary>
public void Init()
{
ticks.Clear();
tickPhysics.Clear();
tickUIs.Clear();
foreach (var obj in UnityEngine.Object.FindObjectsByType<MonoBehaviour>(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);
}
}
}
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;
}
void FixedUpdate()
{
if(!pause)
{
foreach (var physicsTick in tickPhysics)
{
physicsTick.TickPhysics();
}
}
}
}
}