• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

U3D 事情系统

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0511/491.html

 
前言
App开发培训游戏开发中抛事情,收事情也是比拟常用的解耦方式,我所了解的设计形式旁观者形式有相似的原理,所以事情系统在一个框架中还是蛮重要的一块,本惹事件系统不算一个大系统,代码量不多,主要是思绪就是注册监听。
 
代码
EventManager
 
 
using GF.Debug;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
 
namespace GF.EventSystem
{
    /// <summary>
    /// 音讯分发器
    /// </summary>
    public class EventManager
    {
        private static EventManager instance;
        public static EventManager Instance
        {
            get
            {
                if (null == instance)
                    instance = new EventManager();
                return instance;
            }
            set
            {
                instance = value;
            }
        }
        /// <summary>
        /// 拜托事情
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sender"></param>
        /// <param name="evt"></param>
        public delegate void EventHandler<T>(object sender, T evt);
 
        /// <summary>
        /// 注册事情字典
        /// </summary>
        public Dictionary<Type, List<object>> handlers = new Dictionary<Type, List<object>>();
 
        /// <summary>
        /// 注册事情
        /// </summary>
        /// <typeparam name="T">Class类型</typeparam>
        /// <param name="handler">函数</param>
        public void Register<T>(EventHandler<T> handler)
        {
            Debugger.Log("注册事情:" + handler.Method.Name);
            Register(typeof(T), handler);
        }
 
        private void Register<T>(Type EventType, EventHandler<T> handler)
        {
            if (!handlers.ContainsKey(EventType))
            {
                handlers.Add(EventType, new List<object>());
            }
            if (!handlers[EventType].Contains(handler))
            {
                handlers[EventType].Add(handler);
            }
        }
 
        /// <summary>
        /// 分发事情
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sender"></param>
        /// <param name="evt"></param>
        public void Publish<T>(object sender, T evt)
        {
            subscribe(null, typeof(T), evt);
        }
 
        /// <summary>
        /// 发送通知事情
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sender"></param>
        /// <param name="EventType"></param>
        /// <param name="evt"></param>
        private void publish<T>(object sender, Type EventType, T evt)
        {
            if (handlers.ContainsKey(EventType))
            {
                Debugger.Log("public event key:" + typeof(T));
                //移除一切的无效事情
                handlers[EventType].RemoveAll(delegate (object handler) { return handler == null; });
 
                for (int i = 0; i < handlers[EventType].Count; i++)
                {
                    object handler = handlers[EventType][i];
                    MethodInfo method = handler.GetType().GetMethod("Invoke");
                    method.Invoke(handler, new object[] { sender, evt });
                }
            }
            else
            {
                Debugger.Log(string.Format("<color=red>未注册的Key:{0}</color>", EventType));
            }
        }
 
 
        /// <summary>
        /// 注销事情
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="handler">注册函数名</param>
        public void UnRegister<T>(EventHandler<T> handler)
        {
            UnRegister(typeof(T), handler);
        }
 
        private void UnRegister<T>(Type EventType, EventHandler<T> handler)
        {
            if (handlers.ContainsKey(EventType))
            {
                handlers[EventType].Remove(handler);
                Debugger.Log("Remove Event:" + handler);
 
                if (0 == handlers[EventType].Count)//注册常州网站开发培训事情为空时,移除字典Key
                {
                    handlers.Remove(EventType);
                }
            }
        }
 
        /// <summary>
        /// 清空注册事情
        /// </summary>
        public void Clear()
        {
            handlers.Clear();
        }
    }
}
 
运用
监听音讯
EventManager.Instance.Register<FishRoundData>(onFrameData);
 
取消监听
EventManager.Instance.UnRegister<FishRoundData>(onFrameData);
 
监听音讯回调
 
private void onFrameData(object sender, FishRoundData data)
{
 
}
 
分发音讯
EventManager.Instance.Publish<FishRoundData>(this, roundData.Value);
 
改良
我们能够将要监听的事情构造笼统一下,然后每新增一个音讯就直接继承这个基类,这样我们监听音讯回调就是一个统一的办法,然后强转data变成自定义的事情构造。
 
事情基类 GFEventArgs
 
  /// <summary>
    /// 游戏框架中包含事情数据的类的基类。
    /// </summary>
    public abstract class GFEventArgs : EventArgs
    {
        /// <summary>
        /// 初始化游戏框架中包含事情数据的类的新实例。
        /// </summary>
        public GFEventArgs()
        {
 
        }
    }
    
游戏事情基类
/// <summary>
    /// 游戏逻辑事情基类。
    /// </summary>
    public abstract class GameEventArgs : GFEventArgs
    {
 
    }
 
EventManager
internal sealed class EventManager1
{
    private readonly List<GameEventArgs> m_EventPool;
 
    public EventManager1()
    {
        m_EventPool = new List<GameEventArgs>();
    }
 
    public bool Check(int id, EventHandler<GameEventArgs> handler)
    {
        //检查事情
    }
 
    public void Subscribe(int id, EventHandler<GameEventArgs> handler)
    {
        //订阅音讯
    }
 
    public void Unsubscribe(int id, EventHandler<GameEventArgs> handler)
    {
        //取消订阅企业培训
    }
 
    public void Fire(object sender, GameEventArgs e)
    {
        //放入事情响应队列
    }
 
    public void FireNow(object sender, GameEventArgs e)
    {
        //立即响应
    }
}
 
 
运用
Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
    OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
    // 判别userData能否为本人
    if (ne.UserData != this)
    {
        return;
    }
    Log.Debug("UI_Menu:祝贺你,胜利地召唤了我。");
}
 

上篇:上一篇:Unity+IOS GPS后台更新GPS数据
下篇:下一篇:particle-editor用法