Unity中UI框架的使用1-添加面板、显示Loading页面

2023-11-20

其中BasePanel和Canvas都是挂在面板的预制物上的。

1.导入我们的UI框架(本篇文章中有用的是两个UIPanelType,NUIManager和NBasePanel,会放在文章最后供大家使用)

2.先将我们做好的Panel设置成预制物,注意这边创建一个叫做Resources的文件夹,并且下面创建一个Panel文件夹,然后把预制物都放在里面。

3.在PanelType的脚本文件中注册我们需要管理的面板的信息。(这边注册两个来示范)

4.在PanelType的json配置文件中注册这些面板的名字以及路径信息

5.在Unity中创建一个空物体取名为GameManager并且在其身上挂上一个名叫GameManager的脚本,在脚本的Start方法里写一个弹出面板的功能。

 6.在你的预制物身上挂上Canvas Group和NBasePanel脚本

7.点击运行,可以看到我们在GameManager的Start方法里面写的显示LoadingPanel的语句成功调用,并且在Unity里面成果显出除了此面板的UI。

最后是UI框架的代码

UIPanelType.json:

{
	"PanelList": [
        {
            "PanelName": "LodingPanel",
            "PanelPath": "Panel/LodingPanel"
        },
        {
            "PanelName": "MainPanel",
            "PanelPath": "Panel/MainPanel"
        },
        {
			"PanelName": "PopUp",
			"PanelPath": "Panel/PopUp"
		}

	            ]   
}

DicTool.cs:

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

public static class DicTool{
    public static TValue TryGetValueByNN<TKey, TValue>(this Dictionary<TKey, TValue> dic, TKey type )
    {
        TValue v;

        dic.TryGetValue(type, out v);

        return v;
    }
}

NBasePanel.cs:

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

public class NBasePanel : MonoBehaviour {
    protected CanvasGroup canvas;



    public virtual  void OnEnter()
    {
        if (canvas == null)
        {
            canvas = GetComponent<CanvasGroup>();
        }
      
        print("open");
        canvas.alpha = 1;
        canvas.blocksRaycasts = true;
    }

    public virtual void OnExit()
    {
        print("close");
        canvas.alpha = 0;
        canvas.blocksRaycasts = false;
    }

    public virtual void OnPause()
    {
        print("OnPause");
    }
    public virtual void OnResume()
    {
        print("OnResume");
    }
}

NUIManager.cs:




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

public class NUIManager
{
    private static NUIManager Instance;
    private Transform CanvasTransform;
    UIPanelTypeJson json;

    //打开的顺序  堆 
    Stack<NBasePanel> PanelStack = new Stack<NBasePanel>();
    private Dictionary<UIPanelType, GameObject> PanelCach = new Dictionary<UIPanelType, GameObject>();



    public static NUIManager GetInstance()
    {
        //惰性实例化
        if (Instance == null)
        {
            Instance = new NUIManager();
        }
        return Instance;
    }
    /// <summary>
    /// 现实一个面板
    /// </summary>
    /// <param name="panelType"></param>
    public void PushPanel(UIPanelType panelType)
    {
        //调用被挡住的OnPause
        if (PanelStack.Count != 0)
        {
            PanelStack.Peek().OnPause();

        }

        NBasePanel panel = GetPanel(panelType);
        PanelStack.Push(panel);

        panel.OnEnter();


    }

    public void PopPanel()
    {
        if (PanelStack.Count == 0)
            return;
        NBasePanel panel = PanelStack.Pop();
        panel.OnExit();

        if (PanelStack.Count != 0)
            PanelStack.Peek().OnResume();
    }




    private NUIManager()
    {
        ParseUIPanelTypeJson();
        CanvasTransform = GameObject.Find("Canvas").transform;
    }


    private void ParseUIPanelTypeJson()
    {
        //加载json文件
        TextAsset t = Resources.Load<TextAsset>("UIPanelType");
        json = JsonUtility.FromJson<UIPanelTypeJson>(t.text);
        Debug.LogError(json.PanelList.Length);
        Debug.LogError(json.PanelList[0].PanelPath);
    }
    /// <summary>
    /// 创建一个面板并且显示
    /// </summary>
    /// <param name="panelType"></param>
    /// <returns></returns>
    private NBasePanel GetPanel(UIPanelType panelType)
    {
        GameObject instPanel = PanelCach.TryGetValueByNN(panelType);
        //判断缓存里面有没有,如果没有,创建新的,如果有拿缓存里的
        if (instPanel == null)
        {

            //通过名字找路径
            string path = "";
            foreach (var item in json.PanelList)
            {
                Debug.Log("开始查找" + item.PanelName + ":" + item.PanelPath);
                if (item.PanelName == panelType.ToString())
                {
                    path = item.PanelPath;
                    Debug.Log("找到啦" + item.PanelName);
                }
            }
            Debug.Log("新创建创建啦:" + path);
            instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
            instPanel.transform.SetParent(CanvasTransform, false);
            PanelCach.Add(panelType, instPanel);
        }
        else
        {
            Debug.Log("用的缓存");
        }

        return instPanel.GetComponent<NBasePanel>();
    }
}

//序列化
[Serializable]
public class UIPanelTypeJson
{
    public UIPanelInfo[] PanelList;
}
//序列化
[Serializable]
public class UIPanelInfo
{
    public string PanelName;
    public string PanelPath;

}

UIPanelType.cs:

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

public enum UIPanelType {
    LodingPanel,
    MainPanel
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity中UI框架的使用1-添加面板、显示Loading页面 的相关文章

  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • UI自动化测试的正确姿势 —— Airtest设备连接&API详解第一篇

    一 背景 Airtest作为一款优秀的自动化测试工具 有着强大的API功能 处理日常自动化测试过程中需要的各类操作 今天就给大家逐一介绍关于设备连接和常用API部分 结合自动化测试中的各类需求 看看如何通过使用Airtest来快速实现 二
  • 探索创意无限的Photoshop CC 2020Mac/Win版

    作为一款功能强大的图像处理软件 Photoshop CC 2020 简称PS 2020 在全球范围内备受设计师 摄影师和艺术家的喜爱和推崇 它不仅为用户提供了丰富多样的工具和功能 还不断推出新的创意特效和改进的功能 让用户的创意无限延展 首
  • 296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI

    1 根因分析 根因分析 当有新版本并且grade等级是2的时候 点击ptz的时候使用的是RSDialog WA DeleteOnClose属性默认是为true的 并且是栈上的变量 当关闭ptz的时候 diolog的exec结束会向系统发送延
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 基于Selenium和python的UI自动化测试方案

    一 概述 对于比较复杂的系统 每次有小的迭代测试同学不可能会把所有的流程验证一遍 如果开发无意改动影响了某些流程而测试又没测试到 就可能会出现生产问题 因此很有必要通过自动化的测试去确保系统的稳定性 自动化测试可以选择接口自动化测试和UI自
  • UI自动化测试方案

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 3k次 点赞60次 收藏8次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自动
  • APP UI自动化测试思路总结

    首先想要说明一下 APP自动化测试可能很多公司不用 但也是大部分自动化测试工程师 高级测试工程师岗位招聘信息上要求的 所以为了更好的待遇 我们还是需要花时间去掌握的 毕竟谁也不会跟钱过不去 接下来 一起总结一下APP UI自动化测试的思路吧
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • WPF-UI HandyControl 控件简单实战

    文章目录 前言 UserControl简单使用 新建项目 直接新建项目 初始化UserControl Geometry 矢量图形 额外Icon导入
  • Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验

    Axure RP 8 一款引领潮流的交互式原型设计工具 为设计师提供了无限的可能性 让他们能够创造出逼真的原型 从而更好地展示和测试他们的设计 Axure RP 8拥有丰富的功能和工具 让设计师可以轻松地创建出复杂的交互式原型 从简单的按钮
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • Mac版 Photoshop 2021---PS2021

    Adobe Photoshop 2021是一款强大的图像处理软件 它可以帮助用户进行各种图像编辑 修饰和合成工作 这款软件拥有先进的图像处理技术 支持多种图像格式 可以轻松实现各种复杂的图像处理任务 它还提供了丰富的滤镜和工具 使用户可以自
  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 界面控件DevExpress WPF属性网格 - 让应用轻松显示编辑各种属性事件

    DevExpress WPF Property Grid 属性网格 灵感来自于Visual Studio Visual Studio启发的属性窗口 对象检查器 让在WPF应用程序显示和编辑任何对象的属性和事件变得更容易 P S DevExp
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 一文从0到1手把手教学UI自动化测试之数据驱动!

    在UI的自动化测试中 我们需要把测试使用到的数据分离到文件中 如果单纯的写在我们的测试模块里面 不是一个好的设计 所以不管是什么类型的自动化测试 都是需要把数据分离出来的 当然分离到具体的文件里面 文件的形式其实有很多的 这里主要说明JSO

随机推荐

  • vue:实现锚点双向滚动/文章章节联动滚动效果

    文章目录 需求描述 实现思路 示例代码 参考网址 需求描述 需要实现类似doc中文档大纲的效果 点击对应章节的名称时定位到相应的正文 而当正文滚动时 高亮显示对应的章节名称 实现思路 其实笔者一开始想到的是利用a标签页内跳转 也就是 锚点
  • pandas学习笔记--增加行或列

    一 增加行 1 loc 想增加一行 行名称为 5 内容为 16 17 18 19 df loc 5 16 17 18 19 后面的序列是Iterable就行 2 at df at 5 16 17 18 19 3 set value df s
  • CTFShow web1-7——CTF秀WEB模块解题思路

    CTFShow WEB模块详细通关教程 受篇幅所限 通关教程分为上下两部分 第一部分为1 7关 第二部分为8 14关 本篇博客为1 7关的通关教程 从解题思路和原理剖析两个方面进行讲解 CTFShow web1 7关详细教程 解题思路 CT
  • 架构师必备技能之——MySQL数据库表设计

    好记忆不如烂笔头 能记下点东西 就记下点 有时间拿出来看看 也会发觉不一样的感受 目录 一 总体设计思想 二 字段相关设计原则 三 索引设计原则 四 SQL操作原则 五 其他原则 一 总体设计思想 1 不要在数据库做运算符操作 数据库服务器
  • FastJSON、Jackson、Gson性能测试

    起因是公司原先用的是阿里开源的FastJSON 大家用的也比较顺手 但是在出现了两次严重的漏洞后 公司决定放弃FastJSON 使用其他序列化 反序列化工具 考虑大家常用的无非就是FastJSON Jackson和Gson这三种 因此领导让
  • MyBatis 中如何使用多表查询

    MyBatis 中如何使用多表查询 MyBatis 是一款优秀的 ORM 框架 支持多表查询操作 在实际开发中 经常需要使用多表查询来获取业务数据 本文将介绍 MyBatis 中如何使用多表查询 包括使用嵌套查询 使用关联查询和使用动态 S
  • 六种进程间通信方式

    转载 六种进程间通信方式 LceChan的博客 CSDN博客 如何实现进程间通信
  • swiper 轮播 多行多列 横向排列

    一直没仔细研究过swiper 用到了swiper多行多列的展示效果 官网默认是纵向排列 想要做到横向排列 需添加一个一个属性 slidesPerColumnFill row slidesPerView 4 slidesPerColumn 4
  • SpringBoot 统一功能处理

    目录 一 统一用户登录权限验证 Spring 拦截器 统一访问前缀添加 二 统一异常处理 三 统一数据格式返回 String 格式的特殊处理 一 统一用户登录权限验证 在没有统一功能处理之前 对于用户登录权限验证 每个方法都需要单独写用户登
  • 编写函数void fun(int x,int *pp,int *n),它的功能是:求出x的偶数因子,并按从小到大的顺序放在pp所指的数组中,这些因子的个数通过形参n返回(假设pp指向足够大的空间)。

    编写函数void fun int x int pp int n 它的功能是 求出x的偶数因子 并按从小到大的顺序放在pp所指的数组中 这些因子的个数通过形参n返回 假设pp指向足够大的空间 如 当x的值为24 则有6个符合要求分别是2 4
  • QT编译环境配置,以及开发板移植的问题

    一 QT编译环境的设置 编译环境的配置 这个是真个系统构建的时候配置的问题 比较麻烦 后面在补这部分的知识 韦东山的开发板和乌班图的编译工具链里面是具有qt的编译工具链的 自己看的是正点原子的视频 所以按照正点正点原子的编译工具进行配置的
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • Webpack构建多页应用Mpa(一):阐述设计概要

    应用场景 如果现在要做一个前后端分离的项目 可能第一反应就是使用市面上很火的三大MVVM框架 Vue React Angular 但如果团队没有专职前端 并且项目预留时间也很紧张 没足够时间去系统学习工程化Vue项目 但是却也想让html
  • 代码段中存放数据

    1 前面我们写的程序中 只有一个代码段 我们先来在代码段中使用数据 看看和单独一个数据段存放数据有什么差别 考虑这样一个问题 编程计算以下8个数据的和 结果存放在ax寄存器中 0123H 0456H 0789H 0abcH 0defH 0f
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • python3.7在centos下安装pygame

    python编程从入门到实践 一书的第二部分开始 需要安装pygame 我用的是centos7 里面有内置的python2 我自己装了python3 7 pip安装pip3 安装过程网上教程很多 但是一般安装的不完全 需要注意的是安装ssl
  • 关于Yarn的一些个人总结

    文章目录 前言 一 Yarn是什么 二 Yarn由什么组成 三 Yarn用来做什么 四 Yarn的优势是什么 五 Yarn解决了什么问题 总结 前言 在前面我们可以得出Yarn是Hadoop生态圈中一个重要得组成部分 主管资源管理 但是具体
  • 2021赣网杯网络安全大赛_部分Writeup

    目录 Web 1 checkin 2 gwb web easypop 3 gwb web2 挖洞大师 misc 1 decodemaster 2 gwb misc lovemath 3 gwb misc3 testcat Web 1 che
  • C++11智能指针之std::shared_ptr

    std shared ptr是在c 11中引入的一种智能指针 其特点是它所指向的资源具有共享性 即多个shared ptr可以指向同一份资源 在c 中使用shared ptr需要包含
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制