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

智能推荐

最新电信,网通路由表(200701日更新)-程序员宅基地

文章浏览阅读4.1k次。说明:ROS2.9.27用的网通,电信路由脚本操作方式: 添加脚本方式请,将你的正确的电信或网通的网关,使用用编辑-替换掉脚本里的“网关”,然后打开winbox,点击Terminal(控制终端)然后复制脚本,并在Terminal(控制终端)中点右键选择“paste”粘贴脚本,粘贴完后敲回车,即可完成!电信的路由表如下:/ip routeadd dst-address=

Navicat Premium 12.0.23安装与激活-程序员宅基地

文章浏览阅读517次。本文介绍Navicat Premium 12.0.24的安装、激活与基本使用。说明:博主所提供的激活文件理论支持Navicat Premium 12.0.16 - 12.0.24简体中文64位,但已测试的版本为Navicat Premium 12.0.22、12.0.23和12.0.24简体中文64位。 说明:博主所提供的压缩包格式均为RAR5,即WinRAR 5.0以上的版本才能正常解压,...

STM32标准库移植RT-Thread Nano添加FinSH与控制台_标准库实现rt_hw_console_getchar-程序员宅基地

文章浏览阅读1.6k次,点赞6次,收藏15次。添加过shell后首先要在 rtconfig.h中定义#define RT_USING_FINSH为了方便,串口相关函数添加在board.c中使用串口中断实现命令的接收/* * Copyright (c) 2006-2019, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2017-0_标准库实现rt_hw_console_getchar

chapter 4.3 cache -- 主存的地址映射和替换算法_映射替换,地址流格式-程序员宅基地

文章浏览阅读1.6k次,点赞3次,收藏4次。cache – 主存的地址映射和替换算法映射(3)1.直接映射原理主存块以cache长度分区,映射时cache缓存块仅接受各区中相对应的块号,tag仅需保存t位区号eg: cache[0] 中仅可以存放 主存[0,2c,2c+1,3*2c…]每个缓存块i(cache) 可以和 若干个主存块对应每个主存块j只能和 一个 缓存块(cache)对应地址块号直接与cache对应块标记..._映射替换,地址流格式

最长上升子序列&&最长不下降子序列-程序员宅基地

文章浏览阅读99次。百练2757: 题目描述: 对于给定的序列,求出最长上升子序列的长度。题目链接:http://bailian.openjudge.cn/practice/2757解题思路一、动态规划 1. 找子问题错误找法: “求序列的前n个元素的最长上升子序列的长度”是个子问题,但这样分解子问题,不具有“无后效性” 假设F(n) = x,但可能有多个序列满足F(n)..._. s,c; xm,xadnn/ or 0

NetWork——描述一次完整的网络请求过程_浏览器network发起请求历程-程序员宅基地

文章浏览阅读4.9k次。想拥有自己的服务器?价钱太贵,便宜的配置太低。。。总是处于各种原因,现在特大好消息,阿里云服务器活动,价钱低到爆,快来了解下,2核4G,3年低至699,时间有限,还剩10天,快来选购吧,地址:https://promotion.aliyun.com/ntms/act/vm/aliyun-group/buy.html?group=IAq264WFLl当我们在浏览器的地址栏输入 www.lin..._浏览器network发起请求历程

随便推点

对前端页面的边框设置_前端斜的边框-程序员宅基地

文章浏览阅读6.5k次。二·如何对边框设置:1.&lt;div style="text-align:center; vertical-align:middel;"&gt;&lt;input type="text"&gt;&lt;/div&gt;这样你试试,应该就是左右 上下都居中了2.如果是让内容显示的居中:&lt;html&gt;&lt;head&gt;&lt;style&gt;_前端斜的边框

Springboot2中修改tomcat参数支持请求特殊符号 解决:java.lang.IllegalArgumentException: Invalid character found in ..._springboot内置tomcat放宽http请求头特殊字符-程序员宅基地

文章浏览阅读929次。使用Springboot2中内置的tomcat启动项目时候,前端发来的请求报错:java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 at org.ap..._springboot内置tomcat放宽http请求头特殊字符

SHOW STATUS语句查看MySQL数据库的性能参数_show status like threads-程序员宅基地

文章浏览阅读1k次。SHOW STATUS语句查看MySQL数据库的性能参数1.SHOW STATUS like 'Slow_queries' //慢查询的次数 查看日志 1.配置 centos下 my.cnf log-slow-queries = /tmp/mysql-slow.log long_query_..._show status like threads

matlab如何解不等式,如何用MATLAB求解不等式组的所有可能解-程序员宅基地

文章浏览阅读2k次。太多了吧:No. a b c d1 4 86 17 652 13 96 20 873 5 97 56 544 4 32 14 ..._matlab 不等式组求解

2022年09月 Scratch图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试_2022年9月scratch三级真题-程序员宅基地

文章浏览阅读273次,点赞4次,收藏4次。所以,答案D是错误的。两个角色小猫和小狗,给小猫创建一个仅适用于当前角色的变量“奔跑速度”,给小狗也创建一个仅适用于当前角色的变量“奔跑速度”,小猫和小狗程序如下图所示,点击绿旗,按下两次空格键,小猫和小狗的奔跑速度都变为7。运行程序后角色将从(0,0)点开始移动,x和y坐标的增加值均在1至10之间,因此,移动后的位置为点(1,1),(1,10),(10,1)和(10,10)所围成的四边形中。D:“我的变量”和计时器一起增加,当“我的变量”大于15时,计时器会归零,“我的变量”会随着计时器重新开始增加。_2022年9月scratch三级真题

Spring Security 如何实现身份认证和授权?_spring security认证和授权流程-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏6次。Spring Security 是一个非常强大的安全框架,可以为 Spring Boot 应用提供完整的身份认证和授权功能。本文介绍了 Spring Security 如何实现身份认证和授权,并提供了示例代码。使用 Spring Security 可以非常方便地保护应用程序,防止恶意攻击和数据泄露。_spring security认证和授权流程

推荐文章

热门文章

相关标签