首页 学习日记正文

Unity事件处理封装【事件注册、派发】

阿沐 学习日记 2020-04-05 567 0 unity

Unity事件处理封装【事件注册、派发】

1、使用场景:

有复杂的事件关联,逻辑关系杂乱

2、作用:

处理复杂的事件关联,降低代码耦合,便于功能开发维护

3、理论原理:

借鉴观察者模式,使用事件中心处理,注册派发执行指定事件

4、实现原理:

通过一个字典保存事件,通过委托实现事件的绑定添加

5、代码实现:【场景:怪物死后玩家血量增加、背包获得奖励】

image.png

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

怪物死亡方法:

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

玩家类:

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

背包类:

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

最终实现效果:

image.png

打赏

评论

Music