UnityGameFramework事件

本文详细介绍了GameFramework中的事件系统,包括如何订阅、取消订阅事件,定义事件处理函数,以及如何抛出事件。通过扩展EventId枚举和EventComponent组件,可以实现游戏逻辑间的低耦合,提高代码的可维护性和扩展性。

GameFramework事件

Game Framework 中的很多模块在完成操作后都会抛出内置事件,监听这些事件将大大解除游戏逻辑之间的耦合。
除了这些内置事件,用户也可以定义自己的游戏逻辑事件。为了自定义游戏逻辑事件,需要在项目内将 EventId 枚举进行扩展,扩展的事件需要从 UnityGameFramework.Runtime.EventId.GameEventStart 之后开始。

    /// 事件类型编号。
    /// </summary>
    public enum EventId
    {
        GameEventStart = UnityGameFramework.Runtime.EventId.GameEventStart,
    }

同时,在游戏逻辑层给 EventComponent 增加一些扩展方法,使得游戏内能够方便的使用这个 EventId 进行操作。

{
        // 扩展检查订阅事件方法
        public static bool Check(this EventComponent eventComponent, EventId eventId, EventHandler<GameEventArgs> handler)
        {
            return eventComponent.Check((UnityGameFramework.Runtime.EventId)eventId, handler);
        }
 
        // 扩展订阅事件方法
        public static void Subscribe(this EventComponent eventComponent, EventId eventId, EventHandler<GameEventArgs> handler)
        {
            eventComponent.Subscribe((UnityGameFramework.Runtime.EventId)eventId, handler);
        }
 
        // 扩展取消订阅事件方法
        public static void Unsubscribe(this EventComponent eventComponent, EventId eventId, EventHandler<GameEventArgs> handler)
        {
            eventComponent.Unsubscribe((UnityGameFramework.Runtime.EventId)eventId, handler);
        }
    }

订阅事件:

 EventComponent eventComponent = GameEntry.GetComponent<EventComponent>();
 eventComponent.Subscribe(UnityGameFramework.Runtime.EventId.LoadDataTableSuccess, OnLoadDataTableSuccess);

取消订阅事件:

EventComponent eventComponent = GameEntry.GetComponent<EventComponent>();
            eventComponent.Unsubscribe(UnityGameFramework.Runtime.EventId.LoadDataTableSuccess, OnLoadDataTableSuccess);

定义事件处理函数

 private void OnLoadDataTableSuccess(object sender, GameEventArgs e)
        {
            UnityGameFramework.Runtime.LoadDataTableSuccessEventArgs ne = e as UnityGameFramework.Runtime.LoadDataTableSuccessEventArgs;
            // Do something.
            Log.Info("Load data table '{0}' success.", ne.DataTableName);
        }

抛出事件:

    EventComponent eventComponent = GameEntry.GetComponent<EventComponent>();
 
            // 抛出事件,这个操作是线程安全的,即使不在主线程中抛出,也可保证在主线程中回调事件处理函数,但事件会在抛出后的下一帧分发。
            eventComponent.Fire(this, new XXXEvent());
 
            // 抛出事件立即模式,这个操作不是线程安全的,事件会立刻分发。
            eventComponent.FireNow(this, new XXXEvent());

当事件被抛出后,订阅过此事件的事件处理函数就会得到响应。
enentCompoent
int Count (int id)
获取事件处理函数的数量。 更多…

bool Check (int id, EventHandler< GameEventArgs > handler)
检查是否存在事件处理函数。 更多…

void Subscribe (int id, EventHandler< GameEventArgs > handler)
订阅事件处理回调函数。 更多…

void Unsubscribe (int id, EventHandler< GameEventArgs > handler)
取消订阅事件处理回调函数。 更多…

void SetDefaultHandler (EventHandler< GameEventArgs > handler)
设置默认事件处理函数。 更多…

void Fire (object sender, GameEventArgs e)
抛出事件,这个操作是线程安全的,即使不在主线程中抛出,也可保证在主线程中回调事件处理函数,但事件会在抛出后的下一帧分发。 更多…

void FireNow (object sender, GameEventArgs e)
抛出事件立即模式,这个操作不是线程安全的,事件会立刻分发。 更多…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值