生命周期系统

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