Unity实现自己的事件机制(简单实现)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010133610/article/details/52668742

事件机制广泛应用于mvc模式中,灵活的事件机制能够弥补Unity中的一些缺陷,比如协程的执行。因为协程不能返回值,也不能通过out或者ref传递。通过事件机制,可以知道协程执行进度并且返回执行结果。当然,这只是个举例,也只是我习惯用的一种方式。如果有更好的实现方式,希望不吝赐教。


所有要接受事件的脚本,都要继承这个事件手柄的接口

/// <summary>
/// 事件手柄
/// </summary>
public interface IEventHandler {

    void OnEvent(string type,object data);
}


以下是EventManager的主要内容,实现了注册监听,移除监听,派发事件等基本方法。只要在事件派发前,注册好就可以运行了!

using UnityEngine;
using System.Collections.Generic;

public class EventManager {

    private static EventManager instance;

    private Dictionary<string, List<IEventHandler>> dicHandler;

    private EventManager()
    {
        dicHandler = new Dictionary<string, List<IEventHandler>>();
    }

    public static EventManager GetInstance()
    {
        if (instance == null)
        {
            instance = new EventManager();
        }
        return instance;
    }

    /// <summary>
    /// 注册事件监听
    /// </summary>
    /// <param name="type">监听类型</param>
    /// <param name="listher">监听对象</param>
    public void AddEventListener(string type, IEventHandler listher)
    {
        if (!dicHandler.ContainsKey(type))
        {
            dicHandler.Add(type,new List<IEventHandler>());
        }
        dicHandler[type].Add(listher);
    }

    /// <summary>
    /// 移除对type的所有监听
    /// </summary>
    /// <param name="type"></param>
    public void RemoveEventListener(string type)
    {
        if (dicHandler.ContainsKey(type))
        {
            dicHandler.Remove(type);
        }
    }

    /// <summary>
    /// 移除监听者的所有监听
    /// </summary>
    /// <param name="listener">监听者</param>
    public void RemoveEventListener(IEventHandler listener)
    {
        foreach (var item in dicHandler)
        {
            if (item.Value.Contains(listener))
            {
                item.Value.Remove(listener);
            }
        }
    }

    /// <summary>
    /// 清空所有监听事件
    /// </summary>
    public void ClearEventListener()
    {
        Debug.Log("清空对所有所有所有事件的监听");
        if (dicHandler!=null)
        {
            dicHandler.Clear();
        }
    }

    /// <summary>
    /// 派发事件
    /// </summary>
    /// <param name="type">事件类型</param>
    /// <param name="data">事件传达的数据</param>
    public void DispachEvent(string type, object data)
    {
        if (!dicHandler.ContainsKey(type))
        {
            Debug.Log("Did not add any IEventHandler of " + type + " in EventManager!");
            return;
        }

        List<IEventHandler> list = dicHandler[type];
        for (int i = 0; i < list.Count; i++)
        {
            list[i].OnEvent(type,data);
        }
    }
}
展开阅读全文

没有更多推荐了,返回首页