18.界面-UI

本文详细介绍了Gameframework的UI框架,包括框架的说明、具体使用方法以及详细的打开UI流程,针对Unity游戏开发中的界面管理进行了深入探讨。

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

Gameframework中的UI框架

框架说明

UIComponent
入口类,功能委托给 UIManager
UIManager
实际UI管理类
IResourceManager
加载UI预制体
IUIFormHelper
实例化UI
IUIForm
UI界面接口
UIGroup
管理UI分组
OpenUIFormInfo
创建UI时整合参数用的
UIForm
ugui界面实现
UIFormLogic
界面逻辑
DefaultUIFormHelper
ResourceManager
UGuiForm
ugui 界面逻辑从这里派生
YourUIFormLogic
你的界面逻辑

使用

    //  首先制作一个界面的预制体,假设放在 Assets/Resources/UI/Login.prefab
    //  然后定义 UGuiForm 派生类用来实现界面逻辑
    public class UILogin : UGuiForm
    {
        
        protected override void OnInit(object userData)
        {
            base.OnInit(userData);
        }

        protected override void OnOpen(object userData)
        {
            base.OnOpen(userData);
        }

        protected override void OnResume()
        {
            base.OnResume();
        }

        protected override void OnClose(bool isShutdown, object userData)
        {
            base.OnClose(isShutdown, userData);
        }

        protected override void OnUpdate(float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(elapseSeconds, realElapseSeconds);
        }
    }

    //  接着把 UILogin 添加到 Login.prefab 根元素上 
    //  最后使用 ui
    public class Test
    {
        public static void OpenUI()
        {
            UIComponent uiComponent = GameEntry.GetComponent<UIComponent>();
            //  第1个参数是路径,必须是 ResourceManager 能加载到资源的路径
            //  第2个参数是界面分组,就是在 UIComponent 上添加的,默认有个 Default 分组
            //  最后一个参数是界面相关的数据
            int formId = uiComponent.OpenUIForm("UI/Login.prefab", "Default", new List<string>{""});

            //  一般是把数据直接塞给界面,也就是 MVC 模式,UGuiForm 派生类是C , UGUI 是V,界面数据是 M
            //  但如果你想访问界面,也是可以的
            //  首先判断界面是否加载完成
            //  方法1  
            if ( !uiComponent.IsLoadingUIForm(formId) )
            {
                UIForm uiForm = uiComponent.GetUIForm(formId);
                if ( uiForm != null )
                {
                    UILogin logic = (UILogin)uiForm.Logic;
                }
            }
            //  方法2
            EventComponent eventComponent = GameEntry.GetComponent<EventComponent>();
            eventComponent.Subscribe(OpenUIFormSuccessEventArgs.EventId,(sender,eventArgs)=>{
                UIForm uiForm = (UIForm)(((OpenUIFormSuccessEventArgs)eventArgs).UIForm);
                if ( uiForm != null )
                {
                    UILogin logic = (UILogin)uiForm.Logic;
                }
            });
        }
    }

打开UI流程

    UIComponent.OpenUIForm(string uiFormAssetName, string uiGroupName)
    {
        //  使用异步方式加载资源,所以先返回一个id,可通过 IsLoadingUIForm(id) 来判断是否正在加载UI,false表示加载完成
        return m_UIManager.OpenUIForm(uiFormAssetName, uiGroupName, priority, pauseCoveredUIForm, userData) //  UIManager.OpenUIForm
        {
            UIGroup uiGroup = (UIGroup)GetUIGroup(uiGroupName);
            
            int serialId = ++m_Serial;  //  给一个唯一id
            m_UIFormsBeingLoaded.Add(serialId, uiFormAssetName);    //  加入加载队列中

            //  开始加载UI预制体
            m_ResourceManager.LoadAsset(uiFormAssetName, priority, m_LoadAssetCallbacks, OpenUIFormInfo.Create(serialId, uiGroup, pauseCoveredUIForm, userData))    //  ResourceManager.LoadAsset
            {
                //  资源加载成功,uiFormAssetName 就是预制体路径,uiFormAsset 就是加载进内存的预制体
                UIManager.LoadAssetSuccessCallback(string uiFormAssetName, object uiFormAsset, float duration, object userData)
                {
                    m_UIFormsBeingLoaded.Remove(openUIFormInfo.SerialId);   //  移出等待队列
                    //  预制体实例化
                    object instance = m_UIFormHelper.InstantiateUIForm(uiFormAsset) //  DefaultUIFormHelper.InstantiateUIForm
                    {
                        return Instantiate((Object)uiFormAsset);
                    }

                    //  执行界面打开操作,uiFormAssetName 就是预制体路径,uiFormAsset 就是加载进内存的预制体, instance 是预制体实例化对象
                    UIManager.InternalOpenUIForm(openUIFormInfo.SerialId, uiFormAssetName, openUIFormInfo.UIGroup, instance, openUIFormInfo.PauseCoveredUIForm, true, duration, openUIFormInfo.UserData)
                    {
                        IUIForm uiForm = m_UIFormHelper.CreateUIForm(uiFormInstance, uiGroup, userData) //  DefaultUIFormHelper.CreateUIForm
                        {
                            GameObject gameObject = uiFormInstance as GameObject;
                            return gameObject.GetOrAddComponent<UIForm>();  //  创建的界面上如果没有 UIForm 组件,会自动添加
                        };

                        uiForm.OnInit(serialId, uiFormAssetName, uiGroup, pauseCoveredUIForm, isNewInstance, userData)  //  UIForm.OnInit
                        {
                            //  UIForm 是最终类,内部用来管理UI的,不是用来实现UI逻辑的,UI逻辑要派生 UIFormLogic 来实现
                            m_UIFormLogic = GetComponent<UIFormLogic>();    //  界面根对象上要有 UIFormLogic 组件来实现逻辑

                            //  你可以重载 OnInit 做你的初始化工作,userData 是你 OpenUIForm 时传入的额外数据
                            m_UIFormLogic.OnInit(userData);
                        }

                        uiForm.OnOpen(userData) //  UIForm.OnOpen
                        {
                            //  你可以重载 OnOpen 在界面打开时做点事
                            m_UIFormLogic.OnOpen(userData);
                        }
                    }
                }
            }

        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值