【Unity之UI编程】玩法面板的实现

👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:UI_Unity专栏

⭐UI程序袁⭐
文章目录
- ⭐UI程序袁⭐
- 🎶前言
- 🎶(==1==)开始面板LoginPanel 脚本
- 🎶(==2==)提示面板TipPanel 脚本
- 优化后的面板基类BasePanel
- 优化后的Mono管理器
- ⭐相关文章⭐
🎶前言
🅰️ ****

🎶(1)开始面板LoginPanel 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 开始面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class LoginPanel : BasePanel
{private CanvasGroup PanelGroup;// Start is called before the first frame updateprivate void Awake(){PanelGroup = GetComponent<CanvasGroup>();if (!PanelGroup){PanelGroup = gameObject.AddComponent<CanvasGroup>();}}protected override void Start(){base.Start();AllEvent();}/// <summary>/// 重写隐藏方法/// </summary>public override void HideMe(){Fade(false, PanelGroup);//进行淡出的效果base.HideMe();}/// <summary>/// 添加控件监听事件/// </summary>private void AllEvent(){try{GetControl<Button>("ButtonS").onClick.AddListener(() =>{Debug.Log(GetControl<InputField>("InputAC").text);//如果账号密码为空if (GetControl<InputField>("InputAC").text == "" && GetControl<InputField>("InputAC").text == ""){ UIManager.GetInstance().ShowPanel<TipPanel>("TipPanel"); //显示提示面板}});}catch{Debug.Log("没有获取到");}}
}
🎶(2)提示面板TipPanel 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
//-------------------------------------
//—————————————————————————————————————
//___________项目:
//___________功能: 提示面板
//___________创建者:_______秩沅_____
//_____________________________________
//-------------------------------------public class TipPanel : BasePanel
{private CanvasGroup PanelGroup;private UnityAction evnetListen ;private void Awake(){PanelGroup = GetComponent<CanvasGroup>();if (!PanelGroup){PanelGroup = gameObject.AddComponent<CanvasGroup>();}}protected override void Start(){base.Start();//添加点击事件GetControl<Button>("BtuSure").onClick.AddListener(()=>{UIManager.GetInstance().RemovePanel("TipPanel");});}/// <summary>/// 重写的显示方法/// </summary>public override void ShowMe(){Fade(true, PanelGroup);base.ShowMe();}/// <summary>/// 重写的隐藏方法/// </summary>public override void HideMe(){Fade(false, PanelGroup);base.HideMe();}/// <summary>/// 提供给外部改变提示文本内容的方法/// </summary>/// <param name="component"></param>public void ChangComponent(string component){GetControl<Text>("ContentText").text = component;}
}
优化后的面板基类BasePanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;/// <summary>
/// 面板基类
/// 帮助我门通过代码快速的找到所有的子控件
/// 方便我们在子类中处理逻辑
/// 节约找控件的工作量
/// </summary>
public class BasePanel : MonoBehaviour
{//通过里式转换原则 来存储所有的控件private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();// Use this for initializationprotected virtual void Start (){FindChildrenControl<Button>();FindChildrenControl<Image>();FindChildrenControl<Text>();FindChildrenControl<Toggle>();FindChildrenControl<Slider>();FindChildrenControl<ScrollRect>();FindChildrenControl<InputField>();}/// <summary>/// 显示自己/// </summary>public virtual void ShowMe(){gameObject.SetActive(true);}/// <summary>/// 隐藏自己/// </summary>public virtual void HideMe(){gameObject.SetActive(false);}/// <summary>/// 销毁自己/// </summary>public virtual void RemoveMe(){Destroy(gameObject);}/// <summary>/// 得到对应名字的对应控件脚本/// </summary>/// <typeparam name="T"></typeparam>/// <param name="controlName"></param>/// <returns></returns>protected T GetControl<T>(string controlName) where T : UIBehaviour{if(controlDic.ContainsKey(controlName)){for( int i = 0; i <controlDic[controlName].Count; ++i ){if (controlDic[controlName][i] is T){Debug.Log("获取到了" + controlName);return controlDic[controlName][i] as T;}else{Debug.Log("未获取到" );}}}return null;}/// <summary>/// 找到面板中子对象的对应控件/// </summary>/// <typeparam name="T"></typeparam>private void FindChildrenControl<T>() where T:UIBehaviour{//把相同类型的空间脚本存储在数组当中T[] controls = this.GetComponentsInChildren<T>(); for (int i = 0; i < controls.Length; ++i){string objName = controls[i].gameObject.name;if (controlDic.ContainsKey(objName))controlDic[objName].Add(controls[i]);elsecontrolDic.Add(objName, new List<UIBehaviour>() { controls[i] });//那如果包含多个相同的空间,并且每个空间执行的逻辑都不一样,那该怎么优化(觉得还是取消这个代码好)//除非在这些相同的控件中执行的功能都是一样的//如果是按钮控件//if(controls[i] is Button)//{// (controls[i] as Button).onClick.AddListener(()=>// {// OnClick(objName);// });//}如果是单选框或者多选框//else if(controls[i] is Toggle)//{// (controls[i] as Toggle).onValueChanged.AddListener((value) =>// {// OnValueChanged(objName, value);// });//}}}/// <summary>/// 淡入淡出的效果/// </summary>public void Fade( bool flag , CanvasGroup Panel){if (flag){Panel.alpha = 0;MonoManager.GetInstance().RemoveUpdateListener("fadeOut");MonoManager.GetInstance().AddUpdateListener("fadeIn", () =>{if(Panel != null )Panel.alpha = Mathf.Lerp(Panel.alpha, 1, Time.deltaTime * 5);});}else{MonoManager.GetInstance().RemoveUpdateListener("fadeIn");MonoManager.GetInstance().AddUpdateListener("fadeOut", () =>{if (Panel != null)Panel.alpha = Mathf.Lerp(Panel.alpha, 0, Time.deltaTime * 5);});}}}
优化后的Mono管理器
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;public class MonoManager : SingleManager<MonoManager>
{private MonoController controller;public MonoManager(){//保证了MonoController对象的唯一性GameObject obj = new GameObject("MonoController");controller = obj.AddComponent<MonoController>();}/// <summary>/// 给外部提供的 添加帧更新事件的函数/// </summary>/// <param name="fun"></param>public void AddUpdateListener(string name ,UnityAction fun){controller.AddUpdateListener(name,fun);}/// <summary>/// 提供给外部 用于移除帧更新事件函数/// </summary>/// <param name="fun"></param>public void RemoveUpdateListener(string name){controller.RemoveUpdateListener(name);}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;public class MonoController : MonoBehaviour {private Dictionary<string, UnityAction> eventDic = new Dictionary<string, UnityAction>();// Use this for initializationvoid Start () {DontDestroyOnLoad(this.gameObject);}// Update is called once per framevoid Update () {foreach( UnityAction monoEvent in eventDic.Values ){if (monoEvent != null)monoEvent();}}/// <summary>/// 给外部提供的 添加帧更新事件的函数/// </summary>/// <param name="fun"></param>public void AddUpdateListener(string name ,UnityAction fun){if(eventDic.ContainsKey(name)){eventDic[name] += fun;}else{if(fun != null )eventDic.Add(name, fun);}// updateEvent += fun;}/// <summary>/// 提供给外部 用于移除帧更新事件函数/// </summary>/// <param name="fun"></param>public void RemoveUpdateListener(string name){if (eventDic.ContainsKey(name)){eventDic.Remove(name);}else{Debug.Log("未添加过该事件!!");}}
}
⭐相关文章⭐
⭐ 软件设计师高频考点大全⭐
⭐ unity之c#专题篇—系统强基⭐
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!
相关文章:
【Unity之UI编程】玩法面板的实现
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:UI_…...
栈和队列:栈
栈的概念: 栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。…...
由浅入深学习统计学 - 常用统计图形学习
学习笔记 第一章- 信息图形化 图形化(可视化) 在一堆数据中,自己发现了这些数据的规律,但是无法表述给其他人知道,图形化就是便于他人理解数据的规律的展示的手段。 或者说我们也可以从统计的数据图形中发现某些没有…...
【java进阶】集合的三种遍历(迭代器、增强for、Lambda)
目录 一、先谈集合: 二、单列集合的三种遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 一、先谈集合: 🔥那我们平常用for循环依赖下标遍历不行嘛,这就与集合的分类有关了。 集合的体系结构: collection是单…...
Qt实现动态桌面小精灵(含源码)
目录 一、设计思路 二、部分源码演示 三、源码地址 🌈write in front🌈 🧸大家好,我是三雷科技.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由三雷科技原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:三雷科技🧸—CSDN博客 🎁欢…...
Qt 自定义分页控件
目录 前言1、功能描述2、代码实现2.1 ui文件2.1 头文件2.2 源码文件2.3 设计思路 4、示例5、总结 前言 在应用程序开发时经常会遇到数据分页的需求,每一页展示特定数量的数据,通过点击按钮翻页或者输入页码跳转到指定页。 本文介绍一个自定义分页控件&a…...
Java中的7大设计原则
在面向对象的设计过程中,首先需要考虑的是如何同时提高一个软件系统的可维护性和可复用性。这时,遵从面向对象的设计原则,可以在进行设计方案时减少错误设计的产生,从不同的角度提升一个软件结构的设计水平。 1、单一职责 一个类…...
Spring Cloud和Kubernetes + Spring Boot 用哪个?
Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案,它们各有优势和不足,选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架,它提供了一套完整的微服务解决方案࿰…...
web-worker 基本使用
Web Workers 是浏览器中的一项技术,它允许在独立的线程中运行 JavaScript 代码,从而避免主线程阻塞。这对于执行长时间运行的计算、处理大量数据或执行其他 CPU 密集型任务非常有用。下面是一个简单的使用 Web Workers 的示例,包括主线程和工…...
SpringBoot使用@PropertySource读取 properties 配置
SpringBoot使用PropertySource读取 properties 配置 properties配置文件 在resources文件夹下,新建一个文件 property-demo.properties, 示例如下: my.config.test.namewumy.config.test.id123配置的类 PropertySource 指定配置文件。 c…...
100天精通风控建模(原理+Python实现)——第5天:风控建模中数据标准化是什么?
风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。 之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模? 100天精通风控建模(原理+Python实现)——第2天:风控建模有什么目的? 100天精通风控建模(原理+Python实现…...
find和grep命令的简单使用
find和grep命令的简单使用 一、find例子--不同条件查找 二、grep正则表达式的简单说明例子--简单文本查找例子--结合管道进行查找 一、find find 命令在指定的目录下查找对应的文件。 find [path] [expression]● path 是要查找的目录路径,可以是一个目录或文件名…...
力扣:164. 最大间距(Python3)
题目: 给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 来源:力扣(LeetC…...
游戏平台采集数据
首先,你需要在你的项目中添加Kotlin的网络库,例如OkHttp。你可以在你的build.gradle文件中添加以下依赖: dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后,你可以使用以下代码来创建一个基本的网络爬虫&a…...
CSS让两个标签在同一行显示并自适应宽度
CSS让两个标签在同一行显示并自适应宽度 示例:svg 和 span 在同一行上并自适应宽度 使用 Flexbox 布局 HTML <div class"flex-container"><svg class"svg-icon" aria-hidden"true"><use :xlink:href"#icon-s…...
Leetcode154. Find Minimum in Rotated Sorted Array II
旋转数组找最小,这次值可以重复 不妨假设你已经做了上一题,题解 上一题的方法1肯定是用不了了,因为不再能完全分成2个不同的部分 所以我们沿着方法2走 如果 > n u m s [ r ] >nums[r] >nums[r],我们依然可以找右半边 …...
【分析思路】测试数据分析思路
测试数据分析思路: 性能数据 对性能测试数据进行分析时,可以从以下几个维度进行比较: 响应时间(Response Time):分析每一天的响应时间数据,可以查看系统在不同时间段的性能表现,是…...
链表的实现(文末附完整代码)
链表的概念及结构 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 我们在上一篇文章所学习的顺序表是连续存储的 例如: 顺序表就好比火车上的一排座位,是连续的 而链表就好比是火车…...
asp.net core 获取服务实例的几种方式
在ASP.NET Core中,我们可以使用以下几种方式来获取服务: 构造函数注入(Constructor Injection):在需要使用服务的类的构造函数中声明对应的服务类型参数,ASP.NET Core会自动将对应的服务实例注入进来。例如…...
指标体系:洞察变化的原因
一、指标概述 指标体系是指根据运营目标,整理出可以正确和准确反映业务运营特点的多个指标,并根据指标间的联系形成有机组合。 指标体系业务意义极强,所有指标体系都是为特定的业务经营目的而设计的。指标体系的设计应服从于这种目的&#x…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
