生命周期系统

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 调试支持

支持全局注册 OnDrawGizmosOnDrawGizmosSelected 回调。

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);
});