本文师承于唐老师,但是修改了一些代码,采用更加方便理解的方式设计
1.什么是事件中心
2.可以比喻成冒险者工会的任务板子
任务板子上面有发布任务和任务完成两种基础情况
2.1 发布任务
来个冒险者发布一个任务,就执行Pulishtask方法
这个方法中包含了任务名字和完成后的需要做的事情(比如:发放奖励,完成任务后的银趴等等)
2.2 任务完成
任务完成的话就执行一下TaskCompelte方法,发布者观察到之后就触发奖励
3.上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class BulletinBoard : SingleBase<BulletinBoard> {
/// <summary>
/// 一个告示板 ,string代表任务名,UnityAction<object>代表交任务后的事件
/// </summary>
private Dictionary<string, UnityAction<object>> Task = new Dictionary<string, UnityAction<object>>();
public void PublishTask(string name, UnityAction<object> unityAction) {
if (Task.ContainsKey(name)) {
Task[name] += unityAction;
}
else {
Task.Add(name, unityAction);
}
}
/// <summary>
/// 任务完成,如果有对应任务就提交并触发后续事件
/// </summary>
/// <param name="name">任务名</param>
/// <param name="param">任务参数</param>
public void TaskComplete(string name, object param) {
if (Task.ContainsKey(name)) {
Task[name].Invoke(param);
}
else {
Debug.LogWarning($"任务 '{name}' 不存在。");
}
}
/// <summary>
/// 移除(指定)任务
/// </summary>
/// <param name="name">任务名</param>
public void RemoveTask(string name) {
Task.Remove(name);
}
/// <summary>
/// 清空所有任务
/// </summary>
public void ClearBulletin() {
Task.Clear();
}
/// <summary>
/// 过场景不销毁
/// </summary>
/// <param name="obj"></param>
public void DontDestroyBulletin(GameObject obj) {
GameObject.DontDestroyOnLoad(obj);
}
}
4.上例子
比如A发布了一个任务,并且设定好了任务完成后的事件
public class TextBulletin1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
BulletinBoard.Instance.PublishTask("怪物死亡", param=>GetGold(param));
}
public void GetGold(object param)
{
Debug.Log("得到金币"+"怪物类型为:"+ param);
}
}
B就去完成任务,触发任务完成函数
public class TextBulletin2 : MonoBehaviour {
// Start is called before the first frame update
void Start() {
StartCoroutine(DelayedDelivery());
}
private IEnumerator DelayedDelivery() {
yield return new WaitForSeconds(0.1f); // 延迟0.1秒
MonsterDead();
}
public void MonsterDead() {
Debug.Log("怪物死掉了");
BulletinBoard.Instance.TaskComplete("怪物死亡","A");
}
}
得到的结果: