您的位置:首页 > 移动开发 > Unity3D

基于Unity3d SendMessage实现事件管理器

2016-10-17 16:27 736 查看
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");

        }

    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: