Unity_基础UI框架(面板的切换,减少代码间的耦合)_unity ui切换代码-程序员宅基地

技术标签: Unity框架  unity3d  


加油!

脚本分类

1.UIManager UI逻辑的核心脚本

负责UI逻辑的控制,包括动态加载面板,显示面板,移除面板等相关逻辑。

using System.Collections.Generic;
using UnityEngine;

public class UIManager : MonoBehaviour
{
    
    #region 单例模式

    private static UIManager instance;

    public static UIManager Instance
    {
    
        get
        {
    
            if (instance == null)
            {
    
                instance = new UIManager();
            }
            return instance;
        }
    }

    private UIManager()
    {
    
    }

    #endregion 单例模式

    #region 面板初始化

    //面板的父物体
    private RectTransform ParentCanvas;

    private Dictionary<E_UIType, UIBase> panelDict;    //key:面板类型  Value:面板

    private Stack<UIBase> panelStack;              //存放当前显示的界面

    //解析面板
    private UIBase ParesePanel(E_UIType e_UIType)
    {
    
        if (panelDict == null)
            panelDict = new Dictionary<E_UIType, UIBase>();

        UIBase panel;
        panelDict.TryGetValue(e_UIType, out panel);
        if (panel == null)
        {
    
            //实例化
            //枚举名字与名字要一样
            GameObject obj = Resources.Load<GameObject>(e_UIType.ToString());
            GameObject p = Instantiate(obj, ParentCanvas, false);
            panel = p.GetComponent<UIBase>();
            panelDict.Add(e_UIType, panel);
            return panel;
        }
        else
        {
    
            return panel;
        }
    }

    #endregion 面板初始化

    private void Start()
    {
    
        ParentCanvas = GameObject.Find("Panel").transform as RectTransform;
    }

    //显示面板
    public void ShowPanel(E_UIType e_UIType)
    {
    
        //初始化栈
        if (panelStack == null)
            panelStack = new Stack<UIBase>();

        if (panelStack.Count > 0)  //如果当前栈中有元素
        {
    
            //将当前的栈
            UIBase uiBase = panelStack.Peek();
            uiBase.Hide();
        }

        UIBase showPanel = ParesePanel(e_UIType);

        showPanel.Show();

        //存入栈中
        panelStack.Push(showPanel);
    }

    //隐藏面板
    public void HidePanel()
    {
    
        if (panelStack == null)
            panelStack = new Stack<UIBase>();

        if (panelStack.Count <= 0) return;

        //关闭栈顶
        UIBase uIBase = panelStack.Pop();
        uIBase.Hide();

        if (panelStack.Count <= 0) return;
        //将下一个元素显示
        UIBase panel = panelStack.Peek();
        panel.Show();
    }
}

2.类型面板和JSON

在结构体中声明UI的面板类型。

public enum E_UIType
{
    
    BG,
    Panel1,
    Panel2,
    Panel3,
    Panel4,
}

配置文件JSON 我这里将面板名字对应枚举中的面板类型名,加载的时候直接根据枚举名字加载即可
注释: 枚举名字:面板名字

{
    
	"BG":"BG",
	"Panel1":"Panel1",
	"Panel2":"Panel2",
	"Panel3":"Panel3",
	"Panel4":"Panel4"
}

3.UIBase (具体面板父脚本)

using UnityEngine;

//UI基类
public class UIBase : MonoBehaviour
{
    
    [HideInInspector]
    public CanvasGroup canvasGroup;

    protected virtual void Awake()
    {
    
        canvasGroup = this.GetComponent<CanvasGroup>();
    }

    //显示
    public virtual void Show()
    {
    
        canvasGroup.alpha = 1;
    }

    //隐藏
    public virtual void Hide()
    {
    
        canvasGroup.alpha = 0;
    }
}

4.UI框架启动

using UnityEngine;
using UnityEngine.UI;

public class GameRoot : MonoBehaviour
{
    
    public Button btn1;
    public Button btn2;
    public Button btn3;
    public Button btn4;

    private void Start()
    {
    
        UIManager.Instance.ShowPanel(E_UIType.BG);
        btn1.onClick.AddListener(show1);
        btn2.onClick.AddListener(show2);
        btn3.onClick.AddListener(show3);
        btn4.onClick.AddListener(show4);
    }

    private void Update()
    {
    
    }

    private void show1()
    {
    
        UIManager.Instance.ShowPanel(E_UIType.Panel1);
    }

    private void show2()
    {
    
        UIManager.Instance.ShowPanel(E_UIType.Panel2);
    }

    private void show3()
    {
    
        UIManager.Instance.ShowPanel(E_UIType.Panel3);
    }

    private void show4()
    {
    
        UIManager.Instance.ShowPanel(E_UIType.Panel4);
    }
}

5.具体的面板

需要继承 UIBase 父脚本,将面板的共性在UIBase 封装好。其它子面板同理。

public class Panel1 : UIBase
{
    
    
    private void Start()
    {
    
    }

    private void Update()
    {
    
    }

    public override void Show()
    {
    
        base.Show();
		//可以初始化以下子面板的方法
    }

    public override void Hide()
    {
    
        base.Hide();
    }
}

6.测试界面

Panel为动态加载面板的父对象。
在这里插入图片描述
Resources文件夹内容如下:BG(背景图 启动时默认加载),Panel1~Panel4为测试面板
在这里插入图片描述
脚本挂载入下:
在这里插入图片描述
到这就可以启动测试了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44446603/article/details/109270924

智能推荐

jmu-Java-07多线程-Runnable与匿名类_6-1 jmu-java-07多线程-runnable与匿名类-程序员宅基地

文章浏览阅读902次,点赞2次,收藏3次。题目详情:6-1 jmu-Java-07多线程-Runnable与匿名类 (10 分)在Main方法中启动一个线程t1,该线程输出3行信息:主线程名 线程t1的线程名 线程t1所实现的所有接口。提示:使用System.out.println(Arrays.toString(getClass().getInterfaces()));输出。注:本题也可使用Lambda表达式实现。裁判测试程序:public class Main { public static void_6-1 jmu-java-07多线程-runnable与匿名类

[论文阅读] (07) RAID2020 Cyber Threat Intelligence Modeling Based on Heterogeneous GCN_cyber threat prediction using dynamic heterogeneou-程序员宅基地

文章浏览阅读6.7k次,点赞7次,收藏15次。前一篇文章分享了生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、infoGAN、WGAN)、发展历程、预备知识,并通过Keras搭建最简答的手写数字图片生成案例。这篇文章将详细介绍北航老师发表在RAID 2020上的论文《Cyber Threat Intelligence Modeling Based on Heterogeneous Graph Convolutional Network》,基于异构图卷积网络的网络威胁情报建模。希望这篇文章对您有所帮助。_cyber threat prediction using dynamic heterogeneous graph learning

Python三次样条插值与MATLAB三次样条插值简单案例_splev函数matlab-程序员宅基地

文章浏览阅读7.3k次,点赞7次,收藏51次。1 三次样条插值早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线,成为样条曲线。设函数S(x)∈C2[a,b] ,且在每个小区间[xj, xj+1]上是三次多项式,其中a=x0<x1<...<xn=b 是给定节点,则称S(x)是节点x0,x1,...xn上的三次样条函数。若在节点xj上给定函数值yj=f(xj..._splev函数matlab

Hadoop集群搭建所遇到的一些问题_error org.apache.hadoop.security.token.delegation.-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏8次。1.命令找不到环境变量配置的不正确.2.权限问题2.1 /home/hadoop目录权限2.1 创建完hadoop用后/home/hadoop目录权限问题./home/Hadoop2.2 秘钥文件权限1.如下图的提示,是当前hadoop用的公钥没有添加到认证文件中去解决方法:将node1节点上的hadoop用户的公钥添加到认证文件中[hadoop@node1 ~]$ chmod -R 755 .ssh/[hadoop@node1 ~]$ cd .ssh/[hadoop@node_error org.apache.hadoop.security.token.delegation.abstractdelegationtokensec

ModuleNotFoundError: No module named ‘ahocorasick‘,亲测100%有效_modulenotfounderror: no module named 'ahocorasick-程序员宅基地

文章浏览阅读2.3k次,点赞10次,收藏10次。ModuleNotFoundError: No module named ‘ahocorasick‘,安装:pip install pyahocorasick -i HTTPS://mirrors.aliyun.com/pypi/simple/下面是我在安装是遇到的要安装最近在搞自然语言处理的知识图谱但是在搭建系统的时候使用了一个AC自动机词过滤,就是去掉敏感词汇就比如这些敏感词汇,需要将他替换成为**等一些隐含词或者符号。这个有许多的方法,这里列举几个:- 1、AC自动机- 2、DFA_modulenotfounderror: no module named 'ahocorasick

随便推点

OpenGLES demo - 11. 透视投影变换_opengles 透视变换-程序员宅基地

文章浏览阅读1.7k次。这章介绍一下透视投影变换,一个物体经过了透视投影变换之后,就会有jindayuan_opengles 透视变换

大数取模运算Barrett reduction-程序员宅基地

文章浏览阅读1.3w次,点赞11次,收藏40次。Barrett reduction算法的证明和使用。作者刚做完了课程设计作业,闲来无事写篇文章。大数中的指数运算,需要对一个数进行取模,因为最大可能二进制下2048位的2048位次方,所以必须边做乘法边取模。乘法使用快速幂,如果底数位数是x,指数位数是e,底数足够大的话,复杂度取决于模数,模数是m位的话,复杂度是O(m*m*e)。程序里,大数的存储是2的32次方进制的,这里..._barrett reduction

MIT 线性代数导论 第二讲:矩阵消元_方程组\left\{ \begin{matrix}3x - 4y = k + 1\\2x + 3y -程序员宅基地

文章浏览阅读367次。第二讲的主要内容:线性方程组的消元法使用矩阵语言表示消元过程向量、矩阵乘的理解置换矩阵的概念初步逆矩阵的概念线性方程组的消元法例子:{x+2y+z=23x+8y+z=124y+z=2\left\{\begin{matrix}x+2y+z=2\\ 3x+8y+z=12\\ 4y+z=2\end{matrix}\right.⎩⎨⎧​x+2y+z=23x+8y+z=12..._方程组\left\{ \begin{matrix}3x - 4y = k + 1\\2x + 3y = 5\end{matrix}\right.{ 3x 4y=k+1 2x+3y=5 的解中x与y的值相等,则k等于( ) a -1 b -2 c -3 d -4 查看提示

macOS下配置环境变量/查看环境变量_mac查看环境变量-程序员宅基地

文章浏览阅读4.8w次,点赞27次,收藏98次。Mac OS 的配置文件清单a. /etc/profile b. /etc/paths c. ~/.bash_profile d. ~/.bash_login e. ~/.profile f. ~/.bashrc 终端如何查看java的安装目录?输入命令:/usr/libexec/java_home -V如何查看java的版本信息?输入命令:java -version如何查看Mac的全部环境变量输入命令 export,查看全部的环境变量如何设置系统环境变量?系统环境变量应该在_mac查看环境变量

table表格------一行隐藏和显示_让row里面的内容成一行显示超出隐藏-程序员宅基地

文章浏览阅读5k次。这个功能是table原生js操作一行表_让row里面的内容成一行显示超出隐藏

使用C#使用Windows的HID通信-程序员宅基地

文章浏览阅读2k次。Windows使用HID通信相对比较简单,HID都是通过PID、VID信息来查找连接的,相比于串口,几乎无变化,连接无需人工选择,十分方便,也不需要驱动。下面上实例,PID为0x003f,VID为0x04D8,支持发送接收数据显示到UI,使用C#来编写,调用的是windows api(create file、read file、write file)。本实例将HID接口分成3层,支持自动连接..._c# hid 指定pid和vid

推荐文章

热门文章

相关标签