UnityUI框架简单版

当一个程序的界面多达十几、几十个的时候,若是没有一个框架管理UI界面的跳转、数据传递,一定会感觉很混乱,总会拉下一两个,程序就会出现问题,你认为你很小心,不会有问题,当你看到大量代码都在控制UI界面的显示隐藏上,你会忍不住抓狂吗?

不会偷懒的程序猿不是一个合格的程序猿,

这时候一个合适的框架帮你管理UI界面,你会省心不少,省下很多不必要的时间

UI框架简单版

核心思想

  1. 把程序的UI界面做成预制体,等到需要用到的时候加载
  2. 把所有的UI界面的名字、路径保存成配置文件
  3. 编写基类,基类包括所有界面的通用操作(界面的进入、界面的退出、界面的刷新。。。)
  4. 编写管理类,管理类是一个单例对象,管理类使用字典(Dictionary)保存所有界面路径、界面对象实体和一个用来记录程序操作的栈(Stack)

实践是检验真理的唯一标准,接下来用代码证明一切

1、所有界面的预制体保存到Resources下方的文件夹,加载时使用Resource.Load("界面路径")

     不要问为什么放在Resources文件夹,相信看到这里的人都懂,若是不懂建议从Unity基础治疗

2、把所有界面的名字和路径保存成配置文件,这里一般使用Json,你也可以使用其他配置文件,反正程序运行时你把程序的名字和放置路径拿到就行

{
    "UI": [
        {
            "name": "HomePage",
            "path": "UI/HomePage"
        },
        {
            "name": "QJDL",
            "path": "UI/QJDL"
        },
        {
            "name": "QYZY",
            "path": "UI/QYZY"
        },
        {
            "name": "YWZY",
            "path": "UI/YWZY"
        },
        {
            "name": "ZHXX",
            "path": "UI/ZHXX"
        },
        {
            "name": "WDYY",
            "path": "UI/WDYY"
        },
        {
            "name": "DotInfo",
            "path": "UI/DotInfo"
        }
    ]
}

3、编写基类


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//此项目只用到界面进入和退出,你可以根据自己的情况添加,只需要在界面的脚本实现相应的方法即可
public class BaseUI : MonoBehaviour
{
    /// <summary>
    /// UI界面进入
    /// </summary>
    public virtual void OnEnter()
    {
    }
    /// <summary>
    /// UI界面退出
    /// </summary>
    public virtual void OnExit()
    {
    }
}

4、编写管理类

      4.1、所有界面的枚举

public enum E_UIType
{
    HomePage,//首页
    QJDL,
    QYZY,
    YWZY,
    ZHXX,
    WDYY,
    DotInfo
}

     4.2界面管理类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

 //界面管理类
public class UIManager : Singleton<UIManager>
{
    private Transform uIParent;    
//构造函数,第一次创建类时读取界面名字和路径
    public UIManager()
    {
        LoadUIPath();
    }
//程序界面加载到界面后的父对象
    public Transform UIParent
    {
        get
        {
            if (uIParent == null)
            {
                uIParent = GameObject.Find("UI").transform;
            }
            return uIParent;
        }
    }


    Dictionary<E_UIType, string> uIPathDic;//所有界面路径
    Dictionary<E_UIType, BaseUI> uIObjectDic;//界面Base
    Stack<BaseUI> uIStack;//界面进入的深度


//程序界面进入的入口
    public void PushUI(E_UIType uIType)
    {
        if (uIStack == null)
            uIStack = new Stack<BaseUI>();

        if (uIStack.Count > 0)
        {
            BaseUI topUI = uIStack.Peek();
            topUI.OnExit();
        }

        BaseUI loadUI = LoadUI(uIType);
        loadUI.OnEnter();
        uIStack.Push(loadUI);


        returnBtn.Instance.RefreshReturn(uIType);


    }

    /// <summary>
    /// 出栈,退出当前界面,加载上一个界面
    /// </summary>
    public void PopUI()
    {
        if (uIStack == null)
            uIStack = new Stack<BaseUI>();



        BaseUI exitUI = uIStack.Pop();
        exitUI.OnExit();

        if (uIStack.Count <= 0) return;

        BaseUI loadUI = uIStack.Peek();
        loadUI.OnEnter();

        if (uIStack.Count <= 1)
            returnBtn.Instance.RefreshReturn(E_UIType.HomePage);

    }


    /// <summary>
    /// 加载UI界面时,先根据枚举查找所有已加载的界面里是否存在,若是存在直接返回,若是没有查找界面所有的路径,根据路径加载界面,然后返回
    /// </summary>
    /// <param name="uIType"></param>
    /// <returns></returns>
    BaseUI LoadUI(E_UIType uIType)
    {
        if (uIObjectDic == null)
            uIObjectDic = new Dictionary<E_UIType, BaseUI>();

        BaseUI loadUI = uIObjectDic.TryGet(uIType);

        if (loadUI == null)
        {
            string path = uIPathDic.TryGet(uIType);
            GameObject temp = Resources.Load<GameObject>(path);
            GameObject uIObject = GameObject.Instantiate(temp, UIParent);
            uIObjectDic.Add(uIType, uIObject.GetComponent<BaseUI>());
            return uIObject.GetComponent<BaseUI>();
        }
        else
        {
            return loadUI;
        }
    }

    /// <summary>
    /// 读取界面路径,保存到界面路径字典中,这里只说框架,至于读取json问题,就不在这里说了
    /// </summary>
    void LoadUIPath()
    {
        TextAsset data = Resources.Load<TextAsset>("UI");
        UI_ModeJson jsonObject = JsonUtility.FromJson<UI_ModeJson>(data.text);
        foreach (UI_Mode item in jsonObject.UI)
        {
            if (uIPathDic == null)
                uIPathDic = new Dictionary<E_UIType, string>();

            uIPathDic.TryAdd(item.UIType, item.path);
        }
    }
}

5、程序使用时只需要提供一个入口即可

UIManager.Instance.PushUI(E_UIType.HomePage);

当然这个框架只是最简单的框架,也有一定局限性,此框架的局限性在于没办法显示层级界面,当进入的界面覆盖上一个界面的一部分,上一个界面也需要显示而不是隐藏时,就会暴露出来了,当然有问题就会有解决方案,把每个界面的属性保存,比如界面是否是一个窗口的一部分等一些枚举值记录,这就是优化之后的事情了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity UI框架是一种用于创建用户界面(UI)的工具集和组件集合。它提供了丰富的UI元素和功能,可以帮助开发者轻松地构建交互性和可视化的界面。 Unity UI框架可以通过Unity Asset Store进行下载。打开Unity编辑器,点击"Window"菜单,选择"Asset Store"选项,会打开Asset Store窗口。在搜索栏中输入"Unity UI框架",可以找到很多可用的UI框架。 在选择和下载UI框架之前,开发者应该了解项目的需求并进行评估。可以根据项目的规模、复杂度和用户需求来选择合适的UI框架。一些常用的UI框架包括:"TextMeshPro"、"DOTween" 和 "UGUI"等。开发者可以根据自己的需要选择适合的框架。 下载UI框架后,可以将其导入到Unity项目中。在Asset Store或者Unity Package Manager中选择合适的UI框架,点击"Download" 或者 "Import"按钮进行安装。安装完成后,可以在Unity编辑器的"Assets"文件夹中找到导入的UI框架。 使用UI框架时,可以在Unity编辑器中创建UI元素,如按钮、文本、滑动条等,并对其进行布局和样式设置。可以通过脚本代码来实现交互性功能,如按钮的点击事件、输入框的文本处理等。UI框架还提供了很多可定制的功能和效果,如动画、过渡和绘制等,可以增强用户界面的视觉效果和交互体验。 总之,Unity UI框架是一个方便使用的工具集,可以帮助开发者快速构建用户界面。通过下载合适的UI框架,开发者可以轻松地创建、布局和管理UI元素,提供良好的用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值