事件中心管理器的解释
事件中心管理器 (EventCenter
) 实现了观察者模式,用于管理事件的订阅、触发和移除。它的作用是让不同的系统模块能够通过事件进行通信,而无需直接引用或依赖彼此。这种解耦的设计特别适合大型项目中模块间的交互。
主要功能和结构:
-
EventInfoBase
: 这是一个抽象类,作为事件数据类型的基类,用于实现里氏替换原则,便于对不同事件类型进行存储。 -
EventInfo<T>
: 这是一个泛型类,继承自EventInfoBase
。它用于封装带参数的事件,通过UnityAction<T>
委托来保存订阅的回调函数。 -
EventInfo
: 这个类用于封装无参事件,通过UnityAction
委托保存无参事件的回调函数。 -
事件管理功能:
- 事件触发(
EventTrigger
):根据事件类型触发相应的回调,通知所有订阅该事件的对象。 - 添加监听(
AddEventListener
):添加对某个事件的监听,并注册对应的回调。 - 移除监听(
RemoveEventListener
):从事件中移除某个监听者。 - 清除事件(
Clear
/Clear(E_EventType)
):清空所有事件监听或清除指定事件的监听者。
- 事件触发(
使用案例
假设我们在游戏中有一个玩家和怪物系统,当怪物死亡时,玩家需要获取奖励。我们可以使用事件中心来处理这个逻辑。
代码展示
实现
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventCenterPlayer : MonoBehaviour
{
private int totalReward = 0;
private void Start()
{
EventCenter.Instance.AddEventListener<EventCenterMonster>(E_EventType.E_Monster_Dead,OnMonsterDead);
}
private void OnMonsterDead(EventCenterMonster monster)
{
totalReward += monster.rewardAmount;
Debug.Log("玩家获得奖励,当前奖励总额:" + totalReward);
}
private void OnDestroy()
{
EventCenter.Instance.RemoveEventListener<EventCenterMonster>(E_EventType.E_Monster_Dead, OnMonsterDead);
}
}
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventCenterMonster : BaseManager<EventCenterMonster>
{
EventCenterMonster() { }
public int rewardAmount = 100;
public void Die()
{
// 触发怪物死亡
EventCenter.Instance.EventTrigger(E_EventType.E_Monster_Dead, this);
}
}
使用
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventCenterMain : MonoBehaviour
{
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
EventCenterMonster.Instance.Die();
}
}
}
解释
-
Monster
类 :模拟了怪物死亡的行为,并在死亡时触发E_Monster_Dead
事件,传递当前怪物的实例。 -
Player
类 :玩家通过EventCenter
订阅E_Monster_Dead
事件,当怪物死亡时,玩家会收到通知,并调用OnMonsterDead
函数,更新玩家的奖励。
运行流程:
- 当怪物死亡时,
Monster
触发E_Monster_Dead
事件,并传递当前怪物信息。 Player
类监听此事件,并根据怪物传递的信息来处理玩家获取奖励的逻辑。