美文网首页Unity教程合集unityunity3D技术分享
在Unity中使用EventManager消息管理类来管理各种事

在Unity中使用EventManager消息管理类来管理各种事

作者: zhaoiter | 来源:发表于2017-08-29 21:03 被阅读0次

    在使用Unity进行开发的过程中,我们总需要响应各种事件,有时一个事件的触发需要我们同时进行几项处理。举个例子:比如我们有这样的需求:点击模型之后播放特定模型动画,同时播放一段音乐,如果之前有其它音乐正在播放,也应该立即停止。在这种情况下,我们就可以使用这个EventManager类来处理这种需求。

    一、写在前面

    代码来自Unity官方教程:Events: Creating a simple messaging system
    在实际项目开发过程中,感觉比较好用,分享给大家。

    二、代码

    using UnityEngine;
    using UnityEngine.Events;
    using System.Collections;
    using System.Collections.Generic;
    
    public class EventManager : MonoBehaviour {
        //这个dic用来管理需要监听的各类事件
        private Dictionary <string, UnityEvent> eventDictionary;
        
        private static EventManager eventManager;
        //单例
        public static EventManager instance
        {
            get
            {
                if (!eventManager)
                {
                    //在Unity的Hierarchy中必须有一个名为EventManager的空物体,并挂上EventManager脚本
                    eventManager = FindObjectOfType (typeof (EventManager)) as EventManager;
    
                    if (!eventManager)
                    {
                        Debug.LogError ("There needs to be one active EventManger script on a GameObject in your scene.");
                    }
                    else
                    {
                        eventManager.Init (); 
                    }
                }
    
                return eventManager;
            }
        }
    
        void Init ()
        {
            if (eventDictionary == null)
            {
                eventDictionary = new Dictionary<string, UnityEvent>();
            }
        }
        //在需要监听某个事件的脚本中,调用这个方法来监听这个事件
        public static void StartListening (string eventName, UnityAction listener)
        {
            UnityEvent thisEvent = null;
            if (instance.eventDictionary.TryGetValue (eventName, out thisEvent))
            {
                thisEvent.AddListener (listener);
            } 
            else
            {
                thisEvent = new UnityEvent ();
                thisEvent.AddListener (listener);
                instance.eventDictionary.Add (eventName, thisEvent);
            }
        }
        //在不需要监听的时候停止监听
        public static void StopListening (string eventName, UnityAction listener)
        {
            if (eventManager == null) return;
            UnityEvent thisEvent = null;
            if (instance.eventDictionary.TryGetValue (eventName, out thisEvent))
            {
                thisEvent.RemoveListener (listener);
            }
        }
        //触发某个事件
        public static void TriggerEvent (string eventName)
        {
            UnityEvent thisEvent = null;
            if (instance.eventDictionary.TryGetValue (eventName, out thisEvent))
            {
                thisEvent.Invoke ();
            }
        }
    }
    

    2.1代码讲解

    场景中添加好这个脚本后,在需要监听某个事件的脚本中这行代码来开始监听某个事件:

    EventManager.StartListening ("(事件key值)", listener);
    

    结束监听某个事件:

    EventManager.StopListening ("(事件key值)", listener);
    

    某个时刻触发这个事件:

    //这里触发了事件之后,上面的listener绑定的事件将会随之触发,如果有多个脚本监听这个事件,也会同时触发这些listener
    EventManager.TriggerEvent ("(事件key值)");
    

    三、工程Demo

    对于想要看整个工程demo的,可以去上面给出的链接中找,我自己也写了个Demo项目在这里,有需要的可以自行下载。PS:由于博客更新的时,我已经把Unity版本升级到了2017.1.0f3,所以需要下载Unity最新版哟~
    https://pan.baidu.com/s/1mhIxWus 密码:y2uf

    相关文章

      网友评论

        本文标题:在Unity中使用EventManager消息管理类来管理各种事

        本文链接:https://www.haomeiwen.com/subject/hltndxtx.html