Unity ——事件中心模块、观察者模式

 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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46711336/article/details/129186440