Unity Game FrameWork—模块使用—Event事件

官方说明:游戏逻辑监听、抛出事件的机制。
Game Framework 中的很多模块在完成操作后都会抛出内置事件,监听这些事件将大大解除游戏逻辑之间的耦合。
除了 Game Framework 内置事件外,使用者也可以定义自己的游戏逻辑事件,游戏中所有事件均派生自GameEventArgs 类,事件对象使用了引用池技术,以避免使用事件过程中频繁的内存分配。
官方对于事件的教程是比较全面的,有耐心的同学可以细看,这里大概说一下事件的使用。
看一下菜单流程ProcedureMenu中是如何订阅事件的

public override void OnEnter(ProcedureOwner procedureOwner)
{
    base.OnEnter(procedureOwner);
    GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
    m_StartGame = false;
    GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this);
}

public override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
{
    base.OnLeave(procedureOwner, isShutdown);
    GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
    if (m_MenuForm != null)
    {
        m_MenuForm.Close(isShutdown);
        m_MenuForm = null;
    }
}

private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
    OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
    if (ne.UserData != this)
    {
        return;
    }
    m_MenuForm = (MenuForm)ne.UIForm.Logic;
}

在OnEnter方法中订阅了UI打开成功事件
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
OnLeave方法中取消订阅了UI打开成功事件
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
注意:OpenUIFormSuccessEventArgs这个事件是UI打开事件,不单是菜单界面,其他界面可能也会注册事件,那怎么区分是哪个页面打开的事件呢?
其实所有注册该事件的地方都调用了,内部没有区分。只是在调用回调逻辑之后,判断是不是这个界面调用的回调。我们看一下这个是怎么实现的。
GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this);
在打开UI时,我们传入了this,这个this很关键。传入了this,回调之后this存在UserData里面传回来了。
[图片]
看一下下图的源码,传入的this就是userData参数,userData用来创建事件,赋值给事件的属性了。
[图片]
回调时再传出事件,我们通过判断这个属性是不是this即可。
这里我们发现这个参数只是转了一圈什么都没有干,最后转回来用来判断和原来传入的是不是一样。那么我们传入的这个参数不一定是this,只要可以标记这个界面即可。
下图是框架的一部分回调事件,有需要时,可以先看下框架有没有已经定义好的事件。
[图片]

猜你喜欢

转载自blog.csdn.net/qq_37619255/article/details/129725551
今日推荐