【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.hqwc.cn/news/169580.html

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

相关文章

【零基础小白也能轻松学会】3DMAX编织建模教程

有没有想过这些木质材料是如何在椅子上相互交织的&#xff1f;复杂吗&#xff1f;也许是也许不是……本教程将指导您一步一步地以任何形式提出自己的复杂编织图案。本教程将重点关注建模部分&#xff0c;并让您从那里开始发挥想象力。 1.首先创建一个新平面&#xff08;长度55&…

黑窗口连接远程服务

ssh root192.168.x.x 回车输入密码 查看docker docker ps 停止正在运行的服务 docker stop xxxxx 删除服务 docker rm xxxxx 查看镜像 docker images 删除镜像 docker rmi xxxxx 删除镜像 启动并运行整个服务 docker compose up -d jar包名称 idea 使用tcp方式连接docker 配置d…

nRF5 SDK 入门(三、理解 nRF5 SDK 应用与协议栈分开烧录)

说明一下 Nordic nRF5 SDK 软件 应用程序 和 协议栈分开烧录的理解前言 上一篇文章我们了解了 Nordic nRF5 SDK 目录结构&#xff0c;在那之前我们也已经搭建好了开发环境&#xff0c;实际上我们就已经可以进入我们的开发之旅了&#xff0c;但是如果刚接触 Nordic 蓝牙开发的小…

docker可视化

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

面向对象基础(以python语言为例)

1、定义一个类&#xff1b;实例化类的对象&#xff1b;调用类中的方法 #定义一个类 class Student:#类方法&#xff08;即函数&#xff09;def study(self,course_name):print(f学生正在学习{course_name})def play(self):print("xx学生正在玩游戏")#实例化&#xf…

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

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

python-jupyter实现OpenAi语音对话聊天

1.安装jupyter 这里使用的是jupyter工具&#xff0c;安装时需要再cmd执行如下命令&#xff0c;由于直接执行pip install jupyter会很慢&#xff0c;咱们直接使用国内源 pip install --user jupyter -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.t…

手机地磁传感器与常见问题

在手机中&#xff0c;存在不少传感器&#xff0c;例如光距感&#xff0c;陀螺仪&#xff0c;重力加速度&#xff0c;地磁等。关于各传感器&#xff0c;虽功能作用大家都有所了解&#xff0c;但是在研发设计debug过程中&#xff0c;却总是会遇到很多头疼的问题。关于传感器&…

基于SpringBoot的SSMP整合案例(实体类开发与数据层开发)

实体类开发 导入依赖 Lombok&#xff0c;一个Java类库&#xff0c;提供了一组注解&#xff0c;简化POJO实体类开发<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency>lombok版本由SpringB…

Flutter:改变手机状态栏颜色,与appBar状态颜色抱持一致

前言 最近在搞app的开发&#xff0c;本来没怎么注意appBar与手机状态栏颜色的问题。但是朋友一说才注意到这两种的颜色是不一样的。 我的app 京东 qq音乐 这样一对比发现是有的丑啊&#xff0c;那么如何实现呢&#xff1f; 实现 怎么说呢&#xff0c;真不会。百度到的一些是…

K9203 996920302 面向DNP3的网络安全解决方案

K9203 996920302 面向DNP3的网络安全解决方案 2014年ISA卓越技术创新奖获得者&#xff0c;超电子&#xff0c;3eTI的CyberFence工业防火墙解决方案提供强大加密和应用程序级深度数据包检测(DPI)功能。最近&#xff0c;3eTI为其CyberFence产品线增加了DNP3(分布式网络协议)支持…

stable diffusion为什么能用于文本到图像的生成

推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 - NSDT 稳定扩散获得如此多关注的原因 如果你还没有看过它&#xff1a;稳定扩散是一个文本到图像的生成模型&#xff0c;你可以输入一个文本提示&#xff0c;比如…