QFramework 是一套 渐进式 的 快速开发 框架。目标是作为无框架经验的公司、独立开发者、以及 Unity3D 初学者们的 第一套框架。框架内部积累了多个项目的在各个技术方向的解决方案。学习成本低,接入成本低,重构成本低,二次开发成本低,文档内容丰富(提供使用方式以及原理、开发文档)。github:https://github.com/liangxiegame/QFramework


前段时间忙着公司的项目,一直没得空更新QF系列文章,不过接下来的项目更新我打算使用QF重构,因此~接下来的一段时间都会熟悉QF的使用,至于原理等熟悉使用了再更新吧,而且QF团队也一直在出框架的文章,请点传送门

咳咳,进入正题,我最新关注的就是UI间的切换,上一个项目版本使用的是从siki学院学习的UI框架,那么我们来看看QF中UI的切换(此案例在QFramework\Assets\QFramework\Example\UIKitExample\1.Example.scene)

效果:

结构如下:

一.加载显示Panel

UIRoot是QF的一个预制体,其子物体对应各层(这里没太明白AlwayBottom与AlwayTop层,因为我发现在这两层的与UIRoot同级,这样不是看不到了么!!!?,面板上没有Canvas):

    public enum UILevel
	{
		AlwayBottom = -3, //如果不想区分太复杂那最底层的UI请使用这个
		Bg = -2, //背景层UI
		AnimationUnderPage = -1, //动画层
		Common = 0, //普通层UI
		AnimationOnPage = 1, // 动画层
		PopUI = 2, //弹出层UI
		Guide = 3, //新手引导层
		Const = 4, //持续存在层UI
		Toast = 5, //对话框层UI
		Forward = 6, //最高UI层用来放置UI特效和模型
		AlwayTop = 7, //如果不想区分太复杂那最上层的UI请使用这个
	}

Example上只挂了一个脚本,代码如下:

using UnityEngine;

namespace QFramework.UIExample
{
	public class Example : MonoBehaviour
	{
		private void Awake()
		{
            UIMgr.OpenPanel<UIMenuPanel>(prefabName:"Resources/UIMenuPanel");
		}
	}
}

这个过程我也一步步F12看了一下,主要是CreateUI与CreateUIObj两个函数,CreateUI函数里会调用CreateUIObj方法创建面板,并调用其init方法,CreateUIObj函数找到预制体创建面板,并根据层级设置其父物体

运行之后UIRoot下Common出现新加载的panel:

二.点击切换Panel

新建Panel步骤总结:

       1.新建Panel要继承UIPanel

       2.实现InitUI / RegisterUIEvent / ProcessMsg函数

插入一个partial的小知识 : https://blog.csdn.net/niemeiquan/article/details/7801803

记得在上一步加载panel时我们调用了init函数,在UIPanel中init是这样子的:

public void Init(IUIData uiData = null)
		{
			mUIData = uiData;
			InitUI(uiData);
			RegisterUIEvent();
			
			mSubPanelInfos.ForEach(subPanelInfo => UIMgr.OpenPanel(subPanelInfo.PanelName, subPanelInfo.Level));
		}

在此案例中UIMenuPanel实现为:

public partial class UIMenuPanel : UIPanel
	{
		protected override void InitUI(IUIData uiData = null)
		{
			ImageBg.color = "#FFFFFFFF".HtmlStringToColor();
		}

		protected override void ProcessMsg(int eventId, QMsg msg)
		{
			Log.I("Process");
			switch (eventId)
			{
				case (int) UIEventID.MenuPanel.ChangeMenuColor:
					Log.I("{0}:Process EventId {1}", Transform.name, eventId);
					ImageBg.color = "#00FFFFFF".HtmlStringToColor();
					break;
			}
		}

		protected override void RegisterUIEvent()
		{
			RegisterEvent(UIEventID.MenuPanel.ChangeMenuColor);

			BtnPlay.onClick.AddListener(() =>
			{
				this.DoTransition<UISectionPanel>(new FadeInOut(), UILevel.Common,
					prefabName: "Resources/UISectionPanel");
			});

			BtnSetting.onClick.AddListener(() =>
			{
				UIMgr.OpenPanel<UISettingPanel>(UILevel.PopUI,
					prefabName: "Resources/UISettingPanel");
			});
		}
	}

很明显,InitUI中是使用UIMenuPanelData进行初始化,RegisterUIEvent是进行按钮事件的绑定以及注册事件响应(是不是发现这里没有按钮的定义,哈哈,F12跳转一下就知道在哪了)

先前看效果图的时候我们发现Play按钮跳转时会有一个过度的效果,这个是调用DoTransition中间加载了一个过度的panel,也是很简单的,大家自行看吧

三.UI事件

在UIMenuPanel中有一个注册UI事件的代码:

RegisterEvent(UIEventID.MenuPanel.ChangeMenuColor);

ChangeMenuColor跳转:

namespace QFramework.UIExample
{
    public static class UIEventID
    {
        public enum MenuPanel
        {
            ChangeMenuColor = 3001,//ui事件ID为3000~5999,见QMsgSpan
        }
    }
}

接收处理代码:

protected override void ProcessMsg(int eventId, QMsg msg)
		{
			Log.I("Process");
			switch (eventId)
			{
				case (int) UIEventID.MenuPanel.ChangeMenuColor:
					Log.I("{0}:Process EventId {1}", Transform.name, eventId);
					ImageBg.color = "#00FFFFFF".HtmlStringToColor();
					break;
			}
		}

很简单吧~

补充隐藏UIPanel的方法: UIManager.Instance.HideUI("Resources/Prefabs/UI Selected Role");

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐