當前位置:網站首頁>基於Unity3d SendMessage實現事件管理器

基於Unity3d SendMessage實現事件管理器

2022-01-27 22:15:21 蝦米神探

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");
        }
    }

}



版權聲明
本文為[蝦米神探]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201272215209012.html

隨機推薦