生命周期系统
1. 设计目的
Unity 的生命周期(Update / FixedUpdate / LateUpdate / 协程 / Gizmos)只能在继承 MonoBehaviour 的组件中使用。
为了让框架内任意普通类(如管理器、工具类、数据模块)也能使用这些功能,MonoManager 提供了以下能力:
- 为非 MonoBehaviour 脚本提供 Update、FixedUpdate、LateUpdate 生命周期。
- 提供 统一的帧更新管理中心。
- 支持注册 Gizmos 与 GizmosSelected 回调,方便调试可视化。
- 可以被全局各个系统调用,不需要依赖场景中的对象。
- 避免到处写 MonoBehaviour,实现 去组件化 和 可控的生命周期管理。
2. MonoManager 基本结构
public class MonoManager : SingletonAutoMono<MonoManager>
继承自 SingletonAutoMono<T>,意味着:
- 它会自动创建 GameObject 并挂载自身
- 全局唯一
- 生命周期常驻场景
3. 生命周期事件与注册方式
3.1 Update
用于每帧逻辑:
public void AddUpdateListener(UnityAction unityAction)
public void RemoveUpdateListener(UnityAction unityAction)
3.2 FixedUpdate
用于物理帧逻辑:
public void AddFixedUpdateListener(UnityAction unityAction)
public void RemoveFixedUpdateListener(UnityAction unityAction)
3.3 LateUpdate
用于摄像机、动画等晚于普通更新执行的逻辑:
public void AddLateUpdateListener(UnityAction unityAction)
public void RemoveLateUpdateListener(UnityAction unityAction)
4. Gizmos 调试支持
支持全局注册 OnDrawGizmos 与 OnDrawGizmosSelected 回调。
4.1 Gizmos
public void AddGizmosListener(UnityAction unityAction)
public void RemoveGizmosListener(UnityAction unityAction)
4.2 GizmosSelected
public void AddGizmosSelectedListener(UnityAction unityAction)
public void RemoveGizmosSelectedListener(UnityAction unityAction)
5. Unity 内部绑定
MonoManager 自动在 Unity 生命周期中调用对应事件:
private void Update() => updateEvent?.Invoke();
private void FixedUpdate() => fixedUpdateEvent?.Invoke();
private void LateUpdate() => lateUpdateEvent?.Invoke();
private void OnDrawGizmos() => gizmosEvent?.Invoke();
private void OnDrawGizmosSelected() => gizmosSelectedEvent?.Invoke();
6. 使用示例
6.1 普通类中使用 Update
public class TestSystem
{
public TestSystem()
{
MonoManager.Instance.AddUpdateListener(OnUpdate);
}
private void OnUpdate()
{
Debug.Log("Running every frame");
}
}
6.2 启用 Gizmos 画线
MonoManager.Instance.AddGizmosListener(() =>
{
Gizmos.color = Color.red;
Gizmos.DrawLine(Vector3.zero, Vector3.one);
});