事件池-EventPool

本文详细介绍了在GameFramework事件池的使用,包括类图展示、实际应用及代码解析,旨在深入理解如何在Unity游戏开发中有效管理事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GameFramework事件池

类图

EventPool<YourBaseEventArgs>
事件池,管理事件派发
EventHandler<YourBaseEventArgs>
事件监听器接口
Event<YourBaseEventArgs>
事件对象
YourBaseEventArgs
你的事件参数基类
YourEventArgs1
你的事件参数类型1
YourEventArgs2
你的事件参数类型2
YourEventHandler
你的事件监听器

使用

    //  这个主要是用来调试一系列不同的事件用的,单个事件不需要用这个
    //  定义事件参数基类 
    public abstract class YourBaseEventArgs : BaseEventArgs
    {
    }

    //  定义你的事件池管理器
    class YourEventManager : MonoBehaviour
    {
        EventPool<YourBaseEventArgs> m_eventPool;

        void Awake()
        {
            m_eventPool = new EventPool<YourBaseEventArgs>(EventPoolMode.AllowNoHandler | EventPoolMode.AllowMultiHandler);

        }

        void OnDestroy()
        {
            m_eventPool.Shutdown();
        }

        void Update()
        {
            m_eventPool.Update(Time.deltaTime, Time.unscaledDeltaTime);
        }

        public EventPool<YourBaseEventArgs> EventPool => m_eventPool;
    }

    //  定义具体要使用的事件 
    public class YourEventArgs1 : YourBaseEventArgs
    {
        //  定义唯一Id
        public static int EventId = typeof(YourEventArgs1).GetHashCode();

        //  必须重载 Id
        public override int Id
        {
            get
            {
                return EventId;
            }
        }

        //  增加你的事件参数
        public float Duration;
    }

    //  测试事件
    class Test : MonoBehaviour
    {
        public YourEventManager EventManager;

        void Start()
        {
            EventManager.Subscribe(YourEventArgs1.EventId, OnEventFired);
        }

        void OnDestroy()
        {
            //  取消监听
            EventManager.Unsubscribe(YourEventArgs1.EventId, OnEventFired);
        }

        void OnEventFired(object sender, YourBaseEventArgs e)
        {
            //  处理事件
            YourEventArgs1 args = (YourEventArgs1)e;
        }

        void DoSomething()
        {
            //  派发事件
            EventManager.Fire(this, new YourEventArgs1{Duration=5});
        }
    }

代码分析

    //  注册监听器
    EventPool.Subscribe(id, handler)
    {
        m_EventHandlers.Add(id, handler);
    }

    //  派发事件
    EventPool.Update(elapseSeconds, realElapseSeconds)    
    {
        Event eventNode = m_Events.Dequeue();
        HandleEvent(eventNode.Sender, eventNode.EventArgs)
        {
            if (m_EventHandlers.TryGetValue(e.Id, out range))
            {
                foreach ( var eventHandler in m_EventHandlers )
                    eventHandler(sender, args);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值