基于Unity3d SendMessage实现事件管理器

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace Game

{

    //事件监听管理器

    internal class EventListener
    {
        public string name;
        public GameObject listener;
        public string func;
    }

   // 事件派发器
    public class EventDispatcher : MonoBehaviour
    {
        private Hashtable _listeners = new Hashtable();
        public static EventDispatcher Instance;
        void Awake()
        {
            Instance = this;
        }
        void OnDestroy()
        {
            Instance = null;
            _listeners.Clear();
        }


     
       //检查事件类型是否添加
        private bool checkForEvent(string eventType)
        {
            if (_listeners.ContainsKey(eventType))
            {
                return true;
            }    
            return false;
        }

        //检查监听者
        private bool checkForListener(string eventType, GameObject listener,string func)
        {
            if (!checkForEvent(eventType))
            {
                recordEvent(eventType);
            }


            ArrayList listenerList = _listeners[eventType] as ArrayList;
            foreach (EventListener callback in listenerList)
            {
                if (string.Equals(callback.name, (listener.GetInstanceID().ToString() + "_" + func)))
                    return true;
            }
            return false;
        }

           //添加事件
        private bool recordEvent(string eventType)
        {
            if (!checkForEvent(eventType))
            {
                _listeners.Add(eventType, new ArrayList());
            }
            return true;
        }

       // 添加监听者(保存名字为监听者_func)
        private bool recordListener(string eventType, GameObject listener, string func)
        {
            if (!checkForListener(eventType, listener, func))
            {
                ArrayList listenerList = _listeners[eventType] as ArrayList;
                EventListener callback = new EventListener();
                callback.name = listener.GetInstanceID().ToString() + "_" + func;
                callback.listener = listener;
                callback.func = func;
                listenerList.Add(callback);
                return true;
            }
            else
            {
                return false;
            }
        }


        public bool AddListener(string eventType,GameObject listener,string func)
        {
            if (listener == null && eventType == null)
            {
                return false;
            }
            return recordListener(eventType, listener, func);
        }


        public bool RemoveListener(string eventType, GameObject listener, string func = null)
        {
            if (func == null)
            {
                return removeEventListener(eventType, listener);
            }
            else
            {
                return removeEventListener(eventType, listener, func);
            }
        }


        public void RemoveAllListener(GameObject listener)
        {
            removeAllEventListeners(listener);
        }


        //发送事件
        public void SendEvent(EventBase ev)
        {
            string eventType = ev.type;
            if (!checkForEvent(eventType))
            {
                return;
            }
            ArrayList listenerList = _listeners[eventType] as ArrayList;
            for (int i = 0; i < listenerList.Count; ++i)
            {
                EventListener callback = GetEventListener(eventType, i);
                if (callback != null)
                {
                    if (callback.listener && callback.listener.activeSelf)
                    {
                        callback.listener.SendMessage(callback.func, ev, SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
        }
        // 
        private bool removeEventListener(string eventType, GameObject listener)
        {
            if (!checkForEvent(eventType)) return false;
            ArrayList listenerList = _listeners[eventType] as ArrayList;
            foreach (EventListener callback in listenerList)
            {
                if (string.Equals(callback.name,listener.GetInstanceID().ToString()))
                {
                    listenerList.Remove(callback);
                    return true;
                }
            }
            return false;
        }


        // 移除事件监听器
        private bool removeEventListener(string eventType, GameObject listener, string func)
        {
            if (!checkForEvent(eventType)) return false;


            ArrayList listenerList = _listeners[eventType] as ArrayList;
            foreach (EventListener callback in listenerList)
            {
                if (string.Equals(callback.name,(listener.GetInstanceID().ToString() + "_" + func)))
                {
                    listenerList.Remove(callback);
                    return true;
                }
            }
            return false;
        }
        // 移除所有事件监听器
        private void removeAllEventListeners(GameObject listener)
        {
            foreach (EventListener callback in _listeners)
            {
                if (string.Equals(callback.listener.GetInstanceID().ToString(),listener.GetInstanceID().ToString()))
                {
                    _listeners.Remove(callback);
                }
            }
        }


        private EventListener GetEventListener(string _EventType,int _index)
        {
            ArrayList listenerList = _listeners[_EventType] as ArrayList;
            for (int i = 0; i < listenerList.Count; ++i)
            {
                if (i == _index)
                {
                    return (EventListener)listenerList[i];
                }
            }
            return null;
        }




        //测试;
        public void Update()
        {
            if (Input.GetMouseButtonDown(1))
            {
                TestEvent e = new TestEvent();
                e.type = "test";
                e.test = "test99999";
                Instance.SendEvent(e);
                Debug.Log("test");
            }
        }


        public void Start()
        {
            Test();
        }
        public void Test()
        {
            Instance.AddListener("test",this.gameObject, "CallBack");
        }


        public void CallBack(EventBase e)
        {
            //Debug.Log("CallBack1");
            TestEvent t = (TestEvent)e;
            Debug.Log("CallBack1 = " + t.test);
            //Instance.removeEventListener("test", this.gameObject, "CallBack2");
        }
    }

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米神探

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值