游戏事件中心模块(基于观察者模式)

当怪物死亡,可能会触发玩家金币增加、另一种怪物重生、跳转到下一关等事件,如果通过事件监听的方法来处理这个过程,会让程序耦合性增加,侦听效率很低。
因此我设计了一个简单的事件中心模块,将怪物死亡这个事分发到事件中心,需要根据怪物死亡来处理相关逻辑的事件可以直接侦听。

using System.Collections.Generic;
using UnityEngine.Events;
//1.字典
//2.委托
//3.观察者模式

//事件信息接口
public interface IEventInfo
{
}
//事件信息类
//事件侦听依赖于接口 
//有参数的事件
public class EventInfo<T>:IEventInfo
{
    public UnityAction<T> actions;
    public EventInfo(UnityAction<T> action)
    {
        this.actions+=action;
    }
}

//无参数的事件
public class EventInfo:IEventInfo
{
    public UnityAction actions;
    public EventInfo(UnityAction action)
    {
        this.actions+=action;
    }
}
public class EventCenter : BaseManager<EventCenter>
{
    //事件集合
    private Dictionary<string,IEventInfo> eventDic=new Dictionary<string, IEventInfo>();

//添加侦听事件
    public void AddEventListener<T>(string name,UnityAction<T> action)
    {
        if(eventDic.ContainsKey(name))
        {
            (eventDic[name] as EventInfo<T>).actions+=action;
        }
        else
        {
            eventDic.Add(name,new EventInfo<T>(action));
        }
    }

    public void AddEventListener(string name,UnityAction action)
    {
        if(eventDic.ContainsKey(name))
        {
            (eventDic[name] as EventInfo).actions+=action;
        }
        else
        {
            eventDic.Add(name,new EventInfo(action));
        }
    }

//对象被移除时,必须移除对应的侦听函数
    public void RemoveEventListener<T>(string name,UnityAction<T> action)
    {
        if(eventDic.ContainsKey(name))
        {
            (eventDic[name] as EventInfo<T>).actions-=action;
        }
    }

     public void RemoveEventListener(string name,UnityAction action)
    {
        if(eventDic.ContainsKey(name))
        {
            (eventDic[name] as EventInfo).actions-=action;
        }
    }
    
//事件触发方法
    public void EventTrigger<T>(string name,T info)
    {
        if(eventDic.ContainsKey(name))
        {
            if((eventDic[name] as EventInfo<T>).actions!=null)
                (eventDic[name] as EventInfo<T>).actions.Invoke(info);
        }
    }

    public void EventTrigger(string name)
    {
        if(eventDic.ContainsKey(name))
        {
            if((eventDic[name] as EventInfo).actions!=null)
                (eventDic[name] as EventInfo).actions.Invoke();
        }
    }

//清除所有事件
    public void Clear()
    {
        eventDic.Clear();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值