介绍
Mono 管理器,用于集中管理和调度 Update、FixedUpdate、和 LateUpdate 方法中的逻辑。它继承自 SingletonAutoMono<MonoMgr>,即通过单例模式管理,使得项目中任何地方都可以使用该类提供的功能。
主要功能:
-  帧更新事件管理: - Update:用于监听常规每帧的更新函数。
- FixedUpdate:用于监听固定时间间隔的更新函数,通常用于物理相关的计算。
- LateUpdate:用于在所有- Update调用结束后执行的更新函数,常用于相机的跟踪等。
 
-  事件注册和移除: - 提供了 AddUpdateListener、RemoveUpdateListener、AddFixedUpdateListener、RemoveFixedUpdateListener、AddLateUpdateListener、RemoveLateUpdateListener方法来动态添加或移除不同类型的更新事件监听。
 
- 提供了 
-  内部调用: - Update()、- FixedUpdate()、- LateUpdate()会自动调用对应的事件,当这些方法被触发时,所有注册的回调函数都会被执行。
 
代码解释:
- UnityAction是 Unity 内置的委托类型,允许注册无参数的函数作为回调。
- updateEvent、- fixedUpdateEvent、- lateUpdateEvent是存储对应的帧更新事件的委托链,允许多个函数同时监听同一类型的事件。
- ?.Invoke()是 C# 中的空检查操作符,确保在事件链不为空时才触发回调函数。
使用场景:
MonoMgr 是一个 全局的事件调度器,能够帮助你在项目中避免每个对象都定义 Update、FixedUpdate 和 LateUpdate 方法,改为将逻辑集中在统一的管理器中执行,减少性能开销并提高代码管理的便捷性。
案例实现:管理敌人移动
假设我们有一个敌人移动的逻辑,每帧需要更新敌人的位置。我们可以使用 MonoMgr 来管理敌人的移动更新,而不需要每个敌人自己实现 Update 方法。
步骤:
- 创建一个敌人管理类 EnemyManager,将每帧的更新操作注册到MonoMgr的Update事件中。
- 当敌人被销毁时,取消对 Update的注册。
案例代码:
using UnityEngine;public class MonoEnemy : MonoBehaviour
{private Vector3 targetPosition;private float speed = 2f;private void Start(){// 将移动逻辑注册到 MonoMgr 的 Update 事件中MonoMgr.Instance.AddUpdateListener(MoveTowardsTarget);// 定义敌人移动目标点targetPosition = new Vector3(10, 0, 0);}private void MoveTowardsTarget(){// 计算移动transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);// 如果到达目标点,取消监听if (transform.position == targetPosition){MonoMgr.Instance.RemoveUpdateListener(MoveTowardsTarget);}}private void OnDestroy(){// 当敌人被销毁时,取消事件监听MonoMgr.Instance.RemoveUpdateListener(MoveTowardsTarget);}
}
分析:
- MonoMgr.Instance.AddUpdateListener(MoveTowardsTarget):注册了敌人移动的逻辑,使其在每帧调用- MoveTowardsTarget方法。
- MonoMgr.Instance.RemoveUpdateListener(MoveTowardsTarget):在敌人到达目标位置或被销毁时,移除了更新监听,避免不必要的性能开销。
- 移动逻辑:在 MoveTowardsTarget方法中,每帧根据速度移动敌人到目标位置。
优点:
- 集中管理:所有的帧更新逻辑可以集中管理,方便调试和维护。
- 性能优化:避免过多的 MonoBehaviour实现Update、FixedUpdate等方法,减轻引擎调用的负担。
- 动态注册和移除:可以根据对象的需求动态注册和移除监听,避免了不必要的更新开销。
通过这样的管理方式,你可以更加有效地控制多个对象的生命周期和帧更新逻辑。