unity事件

事件机制广泛应用于mvc模式中,灵活的事件机制能够弥补Unity中的一些缺陷,比如协程的执行。因为协程不能返回值,也不能通过out或者ref传递。通过事件机制,可以知道协程执行进度并且返回执行结果。

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

///
/// 事件手柄
///

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> dicHandler;

    private EventManager()
    {
        dicHandler = new Dictionary>();
    }

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

    ///
    /// 注册事件监听
    ///

    /// 监听类型
    /// 监听对象
    public void AddEventListener(string type, IEventHandler listher)
    {
        if (!dicHandler.ContainsKey(type))
        {
            dicHandler.Add(type,new List());
        }
        dicHandler[type].Add(listher);
    }

    ///
    /// 移除对type的所有监听
    ///

    ///
    public void RemoveEventListener(string type)
    {
        if (dicHandler.ContainsKey(type))
        {
            dicHandler.Remove(type);
        }
    }

    ///
    /// 移除监听者的所有监听
    ///

    /// 监听者
    public void RemoveEventListener(IEventHandler listener)
    {
        foreach (var item in dicHandler)
        {
            if (item.Value.Contains(listener))
            {
                item.Value.Remove(listener);
            }
        }
    }

    ///
    /// 清空所有监听事件
    ///

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

    ///
    /// 派发事件
    ///

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

        List list = dicHandler[type];
        for (int i = 0; i < list.Count; i++)
        {
            list[i].OnEvent(type,data);
        }
    }

你可能感兴趣的:(unity事件)