Unity事件处理封装【事件注册、派发】
1、使用场景:
有复杂的事件关联,逻辑关系杂乱
2、作用:
处理复杂的事件关联,降低代码耦合,便于功能开发维护
3、理论原理:
借鉴观察者模式,使用事件中心处理,注册派发执行指定事件
4、实现原理:
通过一个字典保存事件,通过委托实现事件的绑定添加
5、代码实现:【场景:怪物死后玩家血量增加、背包获得奖励】
C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 事件处理【注册、派发】 单例类
/// </summary>
public class EventCenter : SingletonBase<EventCenter>
{
//保存事件的字典
private Dictionary<string, UnityAction<object>> eventDict = new Dictionary<string, UnityAction<object>>();
/// <summary>
/// 注册事件
/// </summary>
/// <param name="name">事件名称</param>
/// <param name="eve">要添加的事件名【函数名】</param>
public void AddListenerEvent(string name, UnityAction<object> action)
{
//字典存在该事件
if (eventDict.ContainsKey(name))
{
//将事件 添加绑定
eventDict[name] += action;
}
else
{
//不存在则 注册该事件 将该事件 添加进字典
eventDict.Add(name, action);
}
}
/// <summary>
/// 事件派发
/// </summary>
/// <param name="name">注册的事件名称</param>
public void EventTrigger(string name,object info)
{
//事件中心存在该事件
if (eventDict.ContainsKey(name))
{
//派发 执行
eventDict[name].Invoke(info);
}
}
/// <summary>
/// 移除事件的监听
/// </summary>
/// <param name="name">事件名称</param>
/// <param name="action">具体事件【函数名】</param>
public void RemoveEventListener(string name,UnityAction<object> action)
{
//字典存在该事件
if (eventDict.ContainsKey(name))
{
//将事件 移除
eventDict[name] -= action;
}
}
/// <summary>
/// 清空全部事件
/// 主要应用于跳转场景
/// </summary>
public void Clear()
{
eventDict.Clear();
}
}
怪物死亡方法:
C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Monster : MonoBehaviour {
public int hp = 100;
void Start ()
{
Invoke("dead",2);
}
public void dead()
{
Debug.Log("怪物死了...");
EventCenter.GetInstance().EventTrigger("MonsterDead",this);
}
}
玩家类:
C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
private int HP=100;
private double Money = 0;
void Start ()
{
EventCenter.GetInstance().AddListenerEvent("MonsterDead", addHP);
}
private void addHP(object info)
{
HP += 20;
Debug.Log("怪物少了 "+(info as Monster).hp+" 玩家HP增加了20");
}
void OnDestroy()
{
EventCenter.GetInstance().RemoveEventListener("MonsterDead", addHP);
}
}
背包类:
C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bag : MonoBehaviour {
void Start ()
{
EventCenter.GetInstance().AddListenerEvent("MonsterDead", addReward);
}
public void addReward(object info)
{
Debug.Log("背包获得奖励");
}
void OnDestroy()
{
EventCenter.GetInstance().RemoveEventListener("MonsterDead", addReward);
}
}
最终实现效果:
评论