UI框架(UGUI)

article/2025/10/6 14:35:54

整个游戏的工程源码下载链接:点击打开链接

可以参考的写的Demo和本文章来学习

毕竟有些细节问题在文章中不能一一说到

工具:VS2010、Unity5.2.3f

 

先介绍整个Demo的主面板

其中任务、技能、符文等等都是按钮,点击按钮会生成相应面板

【Protobuf的生成与解析】

要使得框架的可扩展性与自适应性,我把各个面板的名字与路径配置到protobuf文件

在VS中我们把代码编写完成后生成protobuf文件

在Unity中解析

如何生成与解析请参考:点击打开链接

【UIManager】

在Unity工程中,使用UIManager这个类对整个UI框架进行管理

UIManager.cs

 

using UnityEngine;
using System.Collections;
using UIFrameworkForProtobuf;
using System.Collections.Generic;public class UIManager 
{private  Dictionary<UIPanelTypeEnum, string> dicPanelPath;//存储面板路径private Dictionary<UIPanelTypeEnum, BaseManager> dicPanelBase;//存储面板BaseManager组件private Stack<BaseManager> panelStack;//单例模式private static UIManager manager;public static UIManager GetInstance{get{if (manager == null){manager = new UIManager();}return manager;}}private UIManager(){Dederializer();}private Transform canvasTransform;private Transform CanvasTransform{get{if (canvasTransform == null){canvasTransform = GameObject.Find("Canvas").transform;}return canvasTransform;}}	
	//面板入栈public void PushPanel(UIPanelTypeEnum panelType){if (panelStack == null){panelStack = new Stack<BaseManager>();}//判断栈里面是否有页面,如果有,将栈中top对象取出if (panelStack.Count > 0){BaseManager top = panelStack.Peek();top.OnPause();}BaseManager bm = GetPanel(panelType);panelStack.Push(bm);bm.OnEnter();}//面板入栈public void PushPanel(UIPanelTypeEnum panelType){if (panelStack == null){panelStack = new Stack<BaseManager>();}//判断栈里面是否有页面,如果有,将栈中top对象取出if (panelStack.Count > 0){BaseManager top = panelStack.Peek();top.OnPause();}BaseManager bm = GetPanel(panelType);panelStack.Push(bm);bm.OnEnter();}
	//面板出栈public void PopPanel(){if (panelStack == null){panelStack = new Stack<BaseManager>();}if (panelStack.Count <= 0){return;}//关闭栈顶的页面显示BaseManager bm = panelStack.Pop();bm.OnExit();if (panelStack.Count <= 0){return;}BaseManager top = panelStack.Peek();top.OnResume();}private BaseManager GetPanel(UIPanelTypeEnum panelType){if (dicPanelBase == null){dicPanelBase = new Dictionary<UIPanelTypeEnum, BaseManager>();}BaseManager bm;dicPanelBase.TryGetValue(panelType,out bm);if (bm == null){string panelPath;dicPanelPath.TryGetValue(panelType, out panelPath);GameObject objPanel = GameObject.Instantiate(Resources.Load(panelPath)) as GameObject;objPanel.transform.SetParent(CanvasTransform, false);//参数二:是否保留世界坐标信息,由于要将对象存放在Canvase下,所以为falsedicPanelBase.Add(panelType, objPanel.GetComponent<BaseManager>());return objPanel.GetComponent<BaseManager>();}else{return bm;}}//将protobuf文件反序列化为对象private void Dederializer(){dicPanelPath = new Dictionary<UIPanelTypeEnum, string>();UIPanelTypeList panelTypes = ProtobufHelper.DederializerFromFile<UIPanelTypeList>(Application.streamingAssetsPath + "/UIPanelType.bin");foreach (UIPanelType type in panelTypes.uiPanelTypes){UIPanelTypeEnum enumType = (UIPanelTypeEnum)System.Enum.Parse(typeof(UIPanelTypeEnum), type.panelName);dicPanelPath.Add(enumType, type.panelPath);Debug.Log(type.panelName);Debug.Log(type.panelPath);}}
}
//面板出栈public void PopPanel(){if (panelStack == null){panelStack = new Stack<BaseManager>();}if (panelStack.Count <= 0){return;}//关闭栈顶的页面显示BaseManager bm = panelStack.Pop();bm.OnExit();if (panelStack.Count <= 0){return;}BaseManager top = panelStack.Peek();top.OnResume();}private BaseManager GetPanel(UIPanelTypeEnum panelType){if (dicPanelBase == null){dicPanelBase = new Dictionary<UIPanelTypeEnum, BaseManager>();}BaseManager bm;dicPanelBase.TryGetValue(panelType,out bm);if (bm == null){string panelPath;dicPanelPath.TryGetValue(panelType, out panelPath);GameObject objPanel = GameObject.Instantiate(Resources.Load(panelPath)) as GameObject;objPanel.transform.SetParent(CanvasTransform, false);//参数二:是否保留世界坐标信息,由于要将对象存放在Canvase下,所以为falsedicPanelBase.Add(panelType, objPanel.GetComponent<BaseManager>());return objPanel.GetComponent<BaseManager>();}else{return bm;}}//将protobuf文件反序列化为对象private void Dederializer(){dicPanelPath = new Dictionary<UIPanelTypeEnum, string>();UIPanelTypeList panelTypes = ProtobufHelper.DederializerFromFile<UIPanelTypeList>(Application.streamingAssetsPath + "/UIPanelType.bin");foreach (UIPanelType type in panelTypes.uiPanelTypes){UIPanelTypeEnum enumType = (UIPanelTypeEnum)System.Enum.Parse(typeof(UIPanelTypeEnum), type.panelName);dicPanelPath.Add(enumType, type.panelPath);Debug.Log(type.panelName);Debug.Log(type.panelPath);}}
}


【面板状态组件】

 

我们为每个面板添加一个C#脚本组件,分别命名为TaskPanel、SkillPanel.............

他们分别继承自BaseManager类

BaseManager.cs

 

using UnityEngine;
using System.Collections;public class BaseManager :MonoBehaviour
{/// <summary>/// 界面显示/// </summary>public virtual void OnEnter(){}/// <summary>/// 界面暂停/// </summary>public virtual void OnPause(){}/// <summary>/// 界面继续/// </summary>public virtual void OnResume(){}/// <summary>/// 界面不显示,退出这个界面,界面被关闭/// </summary>public virtual void OnExit(){}
}


这里介绍主面板的MainPanel组件

 

MainPanel.cs

 

using UnityEngine;
using System.Collections;public class MainPanel : BaseManager
{private CanvasGroup canvasGroup;void Start(){canvasGroup = GetComponent<CanvasGroup>();}public override void OnPause(){canvasGroup.blocksRaycasts = false;//当弹出新的面板的时候,让主菜单面板 不再和鼠标交互}public override void OnResume(){canvasGroup.blocksRaycasts = true;}public void OnPushPanel(string panelTypeString){UIPanelTypeEnum panelType = (UIPanelTypeEnum)System.Enum.Parse(typeof(UIPanelTypeEnum), panelTypeString);UIManager.GetInstance.PushPanel(panelType);}
}

 

 

 

 

 

主面板的各个按钮中,将按钮点击事件注册到OnPushPanel函数中,并传入一个面板名

 

【检测】

将主面板添加到游戏对象上

ManagerRoot.cs

 

using UnityEngine;
using System.Collections;public class ManagerRoot : MonoBehaviour 
{// Use this for initializationvoid Start () {UIManager.GetInstance.PushPanel(UIPanelTypeEnum.Main);}}


文章写得并不是很详细和易懂得话可以下载参考我的源码

 

 

 

 


http://chatgpt.dhexx.cn/article/q6DYWbvy.shtml

相关文章

UGUI相关使用

UGUI 文章目录 UGUI1.六大基础组件概述1.1 Canvas组件1.2 CanvasScaler组件1.3 Graphic Raycaster组件1.4 Event System组件1.5 Standalone Input Module组件1.6 RectTransform组件 2.三大基础控件概述2.1 图像控件Image2.2 文本控件Text2.3 RawImage原始图像组件 3.七大组合控…

Unity UGUI系统

UI系统对比 对 UI 系统的选择取决于是为 Unity 编辑器开发 UI&#xff0c;还是为游戏或应用程序开发运行时 UI。 UI 的类型UI 工具包Unity UI(uGUI)IMGUI注意事项运行时&#xff08;调试&#xff09;✔ *✔✔这指用于调试用途的临时运行时 UI。运行时&#xff08;游戏内&…

UGUI 详解

1.RectTransform RectTransform组件 继承自Transform组件&#xff0c;是2D界面中元素的Transform。 对比Transform增加了新的属性分别是&#xff1a;Anchor&#xff08;锚点&#xff09;和 Pivot&#xff08;轴心点&#xff09;。 属性&#xff1a; localPosition&#xff1a;图…

UGUI学习笔记(八)UGUI不规则响应区域

一、Unity自带的点击策略 在上一篇文章中我们了解到&#xff0c;UI的默认响应区域是UI元素所在的矩形框线内的区域。这也就意味着&#xff0c;当UI的图形为不规则形状时&#xff0c;点击图形的外部也可能会触发事件。 但其实Unity自带了一种不规则区域点击策略。要想使用它&…

[Unity UGUI图集系统]浅谈UGUI图集使用

**写在前面&#xff0c;下面是自己做Demo的时候一些记录吧&#xff0c;参考了很多网上分享的资源 一、打图集 1.准备好素材&#xff08;建议最好是根据图集名称按文件夹分开&#xff09; 2、创建一个SpriteAtlas 3、将素材添加到图集中 4、生成图集 到此&#xff0c;我们的图…

Ngui和Ugui的区别

NGUI的元素更新&#xff1a; UIPanel.LateUpdate采用轮询的方式&#xff0c;每帧都会执行&#xff0c;并且每帧都会有UIPanel.UpdateWidgets这个函数的调用&#xff0c;做的事情就是对这些UI元素的位置、缩放等信息的获取&#xff0c;也就是即使没有变化的UI元素&#xff0c;也…

Unity—UGUI

每日一句&#xff1a;读数、学习 去更远的地方&#xff0c;才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例&#xff1a;用户名和密码 Toggle组件 案例&#xff1a;冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容 Character Limit 输入字符…

【Unity3D】UGUI概述

1 UGUI 与 GUI 区别 GUI控件 在编译时不能可视化&#xff0c;并且界面不太美观&#xff0c;在实际应用中使用的较少。UGUI 在编译时可视化&#xff0c;界面美观&#xff0c;实际应用较广泛。 2 Canvas 渲染模式&#xff08;Render Mode&#xff09; Screen Space - Overlay&a…

怎样使用UGUI

什么是 UGUI UGUI 是 Unity 自带的一套 GUI 系统&#xff0c;含有基本的一些 UI 控件。 UGUI 控件有哪些&#xff1f; 我们常用的有 Canvas&#xff0c;Text&#xff0c;Image&#xff0c;Button&#xff0c;Toggle&#xff0c;Slider&#xff0c;Scroll Bar&#xff0c;Scroll…

Unity3D UGUI系列之合批

目录 1. 什么是UGUI的合批1.1 准备工作1.2 批处理1.3 批处理的意义1.4 UGUI的合批 2 分析工具的使用2.1 Frame Debugger的使用2.2 Profiler-UI的使用 3 UGUI合批规则3.1 UGUI合批初体验3.2 UGUI合批被打断初体验3.3 UGUI合批规则详解3.3.1 合批规则3.3.2 合批规则示例13.3.3 合…

unity中NGUI与UGUI的区别?

什么是UI? UI即User Interface&#xff08;用户界面&#xff09;的简称。泛指用户的操作界面&#xff0c;UI设计主要指界面的样式&#xff0c;美观程度。而使用上&#xff0c;对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的UI不仅是让软件变得…

【UGUI】UGUI入门,系统介绍

Unity 2017.1.0f3 常用的UI控件 添加UI控件 创建UI控件时&#xff0c;如果没有Canvas和EventSystem系统会自动创建。 Canvas是画布&#xff0c;是所有UI控件的根类&#xff0c;所有UI控件都必须在Canvas上绘制。如果UI控件不在Canvas下&#xff0c;将无法正常渲染显示。 Eve…

UGUI框架

记录最新学习的UGUI框架。 UIType类保存面板基本信息&#xff08;名称、路径&#xff09;&#xff0c;该面板会在具体的面板类里面&#xff08;StartPanel&#xff09;进行实例化。 public class UIType {private string name;public string Name { get > name; }private …

UGUI的简单理解

1.Canvas(画布) UGUI中几乎所有的组件都要在Canvas下搭建 2.EventSysteam(事件系统) 如果进行UI搭建的时候,缺少或删除了EventSysteam的话会导致UGUI中的组件无法交互,无法发生事件. 3.Panel 平时我们进行UI工程搭建的时候,我们都会先创建Panel面板,创建Panel面板的…

UGUI底层

关于UGUI底层的小知识---上 (转雨松momo) 1 | UGUI原理简述 1.1 原理 首先得生成显示UI用的Mesh&#xff0c;如图1-1所示&#xff0c;一个矩形的Mesh&#xff0c;由4个顶点&#xff0c;2个三角形组成&#xff0c;每个顶点都包含UV坐标&#xff0c;如果需要调整颜色&#xf…

UGUI组件详解

什么是 UGUI UGUI 是 Unity 自带的一套 GUI 系统&#xff0c;含有基本的一些 UI 控件。 UGUI 控件有哪些&#xff1f; 我们常用的有 Canvas&#xff0c;Text&#xff0c;Image&#xff0c;Button&#xff0c;Toggle&#xff0c;Slider&#xff0c;Scroll Bar&#xff0c;Scroll…

【Unity基础】ugui的基础知识篇

文章目录 前言一、常用用可视化控件1、Image2、RawImageI.和Image的区别 3、Text组件4、画布是怎么渲染出可视化UI的&#xff1f;II.这里整理一下渲染相关的关系图&#xff0c;如下: 5、关于画布的布局重构 二、Button交互组件1、Button组件的源码以及使用方式2、Button组件是如…

Unity之UGUI详解

UGUI 文章目录 UGUI六大基础组件概述Canvas对象上依附的&#xff1a;CanvasCanvas ScalerGraphic RaycasterRectTransform EventSystem对象上依附的&#xff1a;EventSystemStandalone Input Module Canvas画布组件Screen Space overlayScreen Space CameraWorld Space CanvasS…

using namespace std

整体认识 —— 解决命名冲突 一个简单的C程序&#xff1a; #include<iostream>using namespace std;int main(int argc,char **argv) {cout<<"hello world !"<<endl;system("pause"); // 让程序暂停,按任意键继续 注意&#xff0c;…

K8S:Namespace详解

Namespace概念 Kubernetes 支持多个虚拟集群&#xff0c;它们底层依赖于同一个物理集群&#xff0c;这些虚拟集群被称为命名空间。 命名空间 namespace 是 k8s 集群级别的资源&#xff0c;可以给不同的用户、租户、环境或项目创建对应的命名空间。 在创建pod的时候可以指定p…