1、事件管理中心
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 事件中心 单例模式对象
/// 1.Dictionary
/// 2.委托
/// 3.观察者模式
/// </summary>
public class EventCenter : BaseManager<EventCenter>
{
//key对应的是事件的名字(比如:红灯绿灯、通关等)
//value 对应的是监听这个事件对应的委托函数们
private Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>();
/// <summary>
/// 添加事件监听
/// </summary>
/// <param name="name">事件的名字</param>
/// <param name="action">准备用来处理事件的委托函数</param>
public void AddEventListener(string name, UnityAction<object> action)
{
//有没有对应的事件监听
//有的情况
if (eventDic.ContainsKey(name))
{
eventDic[name] += action;
}
//没有的情况
else
{
eventDic.Add(name, action);
}
}
/// <summary>
/// 移除对应的事件监听
/// </summary>
/// <param name="name">事件的名字</param>
/// <param name="action">对应之前添加的委托函数</param>
public void RemoveEventListener(string name, UnityAction<object> action)
{
if (eventDic.ContainsKey(name))
eventDic[name] -= action;
}
/// <summary>
/// 事件触发
/// </summary>
/// <param name="name">哪一个名字的事件触发 </param>
public void EventTrigger(string name, object info)
{
//有没有对应的事件监听
//有的情况
if (eventDic.ContainsKey(name))
{
eventDic[name]?.Invoke(info);
}
}
/// <summary>
/// 清空事件中心 主要用在场景切换时
/// </summary>
public void Clear()
{
eventDic.Clear();
}
}
2、敌人死亡
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Monster : MonoBehaviour
{
public string str = "123123";
public void Dead()
{
//触发事件
EventCenter.GetInstance().EventTrigger("MonsterDead", this);
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Dead();
}
}
}
3、当敌人死亡,其他各个对象要执行的方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Other : MonoBehaviour
{
private void Start()
{
EventCenter.GetInstance().AddEventListener("MonsterDead", OtherWaitMonsterDeadDo);
}
public void OtherWaitMonsterDeadDo(object info)
{
Debug.Log("其他各个对象要做的事");
}
private void OnDestroy()
{
EventCenter.GetInstance().RemoveEventListener("MonsterDead", OtherWaitMonsterDeadDo);
}
}
4、当敌人死亡,玩家获得经验
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
private void Start()
{
EventCenter.GetInstance().AddEventListener("MonsterDead", MonsterDeadDo);
}
public void MonsterDeadDo(object info)
{
Debug.Log("玩家获得奖励" + (info as Monster).str);
}
private void OnDestroy()
{
EventCenter.GetInstance().RemoveEventListener("MonsterDead", MonsterDeadDo);
}
}
5、当敌人死亡,任务完成
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Task : MonoBehaviour
{
private void Start()
{
EventCenter.GetInstance().AddEventListener("MonsterDead", TaskWaitMonsterDeadDo);
}
public void TaskWaitMonsterDeadDo(object info)
{
Debug.Log("任务记录");
}
private void OnDestroy()
{
EventCenter.GetInstance().RemoveEventListener("MonsterDead", TaskWaitMonsterDeadDo);
}
}