7.事件-Event

本文深入探讨了GameFramework在Unity游戏引擎中的事件管理系统,包括类图解析、使用方法及详细代码分析,帮助开发者理解如何有效地实现游戏逻辑中的事件监听与触发。

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

GameFramework事件管理

类图

    classDiagram

    EventComponent --> EventManager
    EventManager --> EventPool~GameEventArgs~
    EventPool~GameEventArgs~ o--> EventHandler~GameEventArgs~
    EventPool~GameEventArgs~ o--> Event~GameEventArgs~
    EventHandler~GameEventArgs~ <|-- YourEventHandler

    EventComponent : 入口
    EventManager : 事件管理器 
    EventPool~GameEventArgs~ :事件池,真实管理事件的地方
    EventHandler~GameEventArgs~ : 事件监听器
    YourEventHandler : 你的事件监听器
    Event~GameEventArgs~ : 事件对象

使用

    //  定义你的事件参数
    public sealed class ShowEntitySuccessEventArgs : GameEventArgs
    {
        //  定义一个唯一编号
        public static readonly int EventId = typeof(ShowEntitySuccessEventArgs).GetHashCode();

        //  必须重载 Id
        public override int Id
        {
            get
            {
                return EventId;
            }
        }
        
        //  增加你的事件参数
        public float Duration;
    }

    class Test : MonoBehaviour
    {
        void Start()
        {
            //  注册监听器
            GameEntry.GetComponent<EventComponent>().Subscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
        }

        void OnDestroy()
        {
            //  取消监听
            GameEntry.GetComponent<EventComponent>().Unsubscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
        }

        void OnShowEntitySuccess(object sender, GameEventArgs e)
        {
            //  处理事件
            ShowEntitySuccessEventArgs args = (ShowEntitySuccessEventArgs)e;
        }

        void DoSomething()
        {
            //  派发事件
            GameEntry.GetComponent<EventComponent>().Fire(this, new ShowEntitySuccessEventArgs{Duration=5});
        }
    }
    

代码分析

    //  注册监听器
    EventManager.Subscribe(int id, EventHandler<GameEventArgs> handler)
    {
        m_EventPool.Subscribe(id, handler)  //  EventPool<GameEventArgs>.Subscribe
        {
            m_EventHandlers.Add(id, handler);
        }
    }

    //  派发事件
    EventManager.Update(float elapseSeconds, float realElapseSeconds)
    {
        m_EventPool.Update(elapseSeconds, realElapseSeconds)    //  EventPool<GameEventArgs>.Update
        {
            Event eventNode = m_Events.Dequeue();
            HandleEvent(eventNode.Sender, eventNode.EventArgs)  //  EventPool<GameEventArgs>.HandleEvent
            {
                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、付费专栏及课程。

余额充值