【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#专题篇—系统强基⭐



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/189352.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud和Kubernetes + Spring Boot 用哪个?

Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案&#xff0c;它们各有优势和不足&#xff0c;选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架&#xff0c;它提供了一套完整的微服务解决方案&#xff0…

OpenMMlab导出yolov3的onnx模型并推理

手动导出 直接使用脚本 import torch from mmdet.apis import init_detector, inference_detectorconfig_file ./configs/yolo/yolov3_mobilenetv2_8xb24-ms-416-300e_coco.py checkpoint_file yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823-f68a07b3.pth mod…

Django(复习篇)

项目创建 1. 虚拟环境 python -m venv my_env ​ cd my_env activate/deactivate ​ pip install django ​2. 项目和app创建 cd mypros django-admin startproject Pro1 django-admin startapp app1 ​3. settings配置INSTALLED_APPS【app1"】TEMPLATES【 DIRS: [os.pat…

JavaEE初阶学习:Linux 基本使用和 web 程序部署

1.Linux的基本认识 Linux 是一个操作系统.(搞管理的系统) 和Windows都是同类产品~~ Linux 实际的场景: 1.服务器 2.嵌入式设备 3.移动端(手机)Android 其实就是Linux 1991年,还在读大学的 芬兰人 Linus Benedict Torvalds,搞了一个Linux 这样的系统0.01版,正式发布了~ 后…

数据结构-双向链表

目录 1.带头双向循环链表&#xff1a; 2. 带头双向循环链表的实现&#xff1a; 双向链表初始化&#xff1a; 双向链表打印&#xff1a; 开辟节点函数&#xff1a; 双向链表头插&#xff1a; 双向链表尾插&#xff1a; 双向链表头删&#xff1a; 双向链表尾删&#xff…

指标体系:洞察变化的原因

一、指标概述 指标体系是指根据运营目标&#xff0c;整理出可以正确和准确反映业务运营特点的多个指标&#xff0c;并根据指标间的联系形成有机组合。 指标体系业务意义极强&#xff0c;所有指标体系都是为特定的业务经营目的而设计的。指标体系的设计应服从于这种目的&#x…

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第一弹)

一、已知一颗二叉树如下图&#xff0c;试求&#xff1a; (1)该二叉树前序、中序和后序遍历的结果。 (2)该二叉树是否为满二叉树&#xff1f;是否为完全二叉树&#xff1f; (3)将它转换成对应的树或森林。 (4)这颗二叉树的深度为多少? (5)试对该二叉树进行前序线索化。 (6)试对…

算法之双指针

双指针算法的作用 双指针算法是一种使用2个变量对线性结构(逻辑线性/物理线性)&#xff0c;进行操作的算法&#xff0c;双指针可以对线性结构进行时间复杂度优化&#xff0c;可以对空间进行记忆。 双指针算法的分类 1.快慢指针 2.滑动窗口 3.左右指针 4.前后指针 双指针OJ题目…

docker可视化

什么是portainer&#xff1f; portainer就是docker图形化界面的管理工具&#xff0c;提供一个后台面板供我们操作 目前先用portainer(先用这个)&#xff0c;以后还会用到Rancher(CI/CD在用) 1.下载portainer 9000是内网端口&#xff0c;8088是外网访问端口 docker run…

Linux文件系统(1)

Linux文件系统(1) &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容从系统层面重新认识我们的文件系统 文…

每日一题(LeetCode)----数组--长度最小的子数组

每日一题(LeetCode)----数组–长度最小的子数组 1.题目&#xff08; 209.长度最小的子数组&#xff09; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &…

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况&#xff0c;需要自定义来实现——可以用窗口&#xff08;window&#xff09;来表示。为了更方便地实现基于时间的合流操作&#xff0c;Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结&#xff08;Window Join&#xff09; 一…

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

SOME/IP 协议介绍(四)RPC协议规范

RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息&#xff0c;可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释&#xff0c;而第[SIP_RPC_450页&#xff0c;第36页]节讨论了选择哪种传输协议。…

【Go入门】面向对象

【Go入门】面向对象 前面两章我们介绍了函数和struct&#xff0c;那你是否想过函数当作struct的字段一样来处理呢&#xff1f;今天我们就讲解一下函数的另一种形态&#xff0c;带有接收者的函数&#xff0c;我们称为method method 现在假设有这么一个场景&#xff0c;你定义…

Linux驱动开发——PCI设备驱动

目录 一、 PCI协议简介 二、PCI和PCI-e 三、Linux PCI驱动 四、 PCI设备驱动实例 五、 总线类设备驱动开发习题 一、 PCI协议简介 PCI (Peripheral Component Interconnect&#xff0c;外设部件互联) 局部总线是由Intel 公司联合其他几家公司一起开发的一种总线标准&#…

前端开发引入element plus与windi css

背景 前端开发有很多流行框架&#xff0c;像React 、angular、vue等等&#xff0c;本文主要讲vue 给新手用的教程&#xff0c;其实官网已经写的很清楚&#xff0c;这里再啰嗦只是为了给新手提供一个更加简单明了的参考手册。 一、打开element plus官网选则如图所示模块安装命令…

Nginx缓存基础

1 nginx缓存的流程 客户端需要访问服务器的数据时&#xff0c;如果都直接向服务器发送请求&#xff0c;服务器接收过多的请求&#xff0c;压力会比较大&#xff0c;也比较耗时&#xff1b;而如果在nginx缓存一定的数据&#xff0c;使客户端向基于nginx的代理服务器发送请求&…

华为L410上制作内网镜像模板02

原文链接&#xff1a;华为L410上制作离线安装软件模板02 hello&#xff0c;大家好啊&#xff0c;今天给大家带来第二篇在内网搭建Apache服务器&#xff0c;用于安装完内网操作系统后&#xff0c;在第一次开机时候&#xff0c;为系统安装软件的文章&#xff0c;今天给大家介绍在…

Linux之基础开发工具gdb调试器的使用(三)

文章目录 一、Linux调试器-gdb使用1、安装gdb2、背景3、Debug和release4、区分Debug和release 二、Linux调试器-gdb命令演示1、显示指定行之后的代码&#xff08;自动记录最后一条指令&#xff09;2、断点1、打印断点2、查看断点3、删除断点4、使能&#xff08;禁用/开启&#…