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

来源:互联网 发布:php api接口开发规范 编辑:程序博客网 时间:2024/06/10 19:16

事件机制广泛应用于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);        }    }}

1 0
原创粉丝点击