介绍
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
的注册。
案例代码:
cs
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
等方法,减轻引擎调用的负担。 - 动态注册和移除:可以根据对象的需求动态注册和移除监听,避免了不必要的更新开销。
通过这样的管理方式,你可以更加有效地控制多个对象的生命周期和帧更新逻辑。