Unity UIBasePanel 简单的ui基类

简单的ui基类

UIBasePanel.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;namespace MYTOOL.UI
{public class UIBasePanel : MonoBehaviour{//通过里式转换原则 来存储所有的控件private readonly Dictionary<string, List<UIBehaviour>> controlDic = Pool<Dictionary<string, List<UIBehaviour>>>.Get();private bool dirty = true;#region >> Unity 生命周期函数protected virtual void Awake(){FindChildrenControl<Button>();FindChildrenControl<Image>();FindChildrenControl<Text>();FindChildrenControl<Toggle>();FindChildrenControl<Slider>();FindChildrenControl<ScrollRect>();FindChildrenControl<InputField>();OnAwake();}protected virtual void Start(){OnStart();}protected virtual void Update(){if (dirty){dirty = false;OnDirty();}OnUpdate();}protected virtual void OnDestroy(){OnClose();controlDic.Clear();Pool<Dictionary<string, List<UIBehaviour>>>.Release(controlDic);}#endregion Unity 生命周期函数#region >> 生命周期函数(需子类重写)/// <summary>/// Awake生命周期/// </summary>protected virtual void OnAwake() { }/// <summary>/// Start生命周期/// </summary>protected virtual void OnStart() { }/// <summary>/// Update生命周期/// </summary>protected virtual void OnUpdate() { }/// <summary>/// Update生命周期中执行OnDirty/// </summary>protected virtual void OnDirty() { }/// <summary>/// OnDestroy生命周期/// </summary>protected virtual void OnClose() { }protected virtual void OnShow() { }protected virtual void OnHide() { }protected virtual void OnClick(string btnName) { }protected virtual void OnValueChanged(string toggleName, bool value) { }#region >> 复制子类重写函数/*protected override void OnAwake() { }protected override void OnStart() { }protected override void OnUpdate() { }protected override void OnDirty() { }protected override void OnClose() { }protected override void OnShow() { }protected override void OnHide() { }protected override void OnClick(string btnName) { }protected override void OnValueChanged(string toggleName, bool value) { }*/#endregion 复制子类重写函数#endregion 生命周期函数(需子类重写)/// <summary>/// 显示自己/// </summary>public void ShowMe(){gameObject.SetActive(true);OnShow();}/// <summary>/// 隐藏自己/// </summary>public void HideMe(){gameObject.SetActive(false);OnHide();}public void SetDirty(){dirty = true;}/// <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)return controlDic[controlName][i] as T;}}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 (!objName.StartsWith('@')){continue;}else{objName = objName.Substring(1);}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);});}}}}
}

Pool.cs

using System.Collections.Generic;namespace MYTOOL.UI
{public class ObjectPool<T> where T : new(){private readonly Stack<T> _stack = new Stack<T>();private readonly System.Action<T> _actionOnGet;private readonly System.Action<T> _actionOnRelease;public int CountAll { get; private set; }public int CountInactive { get { return _stack.Count; } }public int CountActive{get{return CountAll - CountInactive;}}public ObjectPool(System.Action<T> actionOnGet, System.Action<T> actionOnRelease){_actionOnGet = actionOnGet;_actionOnRelease = actionOnRelease;}public T Get(){T element;if (_stack.Count == 0){element = new T();CountAll++;}else{element = _stack.Pop();}if (_actionOnGet != null){_actionOnGet(element);}return element;}public void Release(T element){if (_stack.Count > 0 && ReferenceEquals(_stack.Peek(), element)){UnityEngine.Debug.LogError("Internal error. Trying to destroy object that is already released to pool.");}if (_actionOnRelease != null){_actionOnRelease(element);}_stack.Push(element);}}public static class ListPool<T>{private static readonly ObjectPool<List<T>> _listPool = new ObjectPool<List<T>>(null, Clear);private static void Clear(List<T> l) { l.Clear(); }public static List<T> Get(){return _listPool.Get();}public static void Release(List<T> toRelease){_listPool.Release(toRelease);}}public static class Pool<T> where T : new(){private static readonly ObjectPool<T> _objectPool = new ObjectPool<T>(null, null);public static T Get(){return _objectPool.Get();}public static void Release(T element){_objectPool.Release(element);}}
}

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

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

相关文章

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布&#xff0c;这是微软公司2024年发行的的最…

Android App开发基础(1)—— App的开发特点

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

TensorFlow2实战-系列教程3:猫狗识别1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 基本流程&#xff1a; 数据预处理&#xff1a;图像数据处理&#xff0c…

Git 对文件名大小写不敏感的问题解决方案

目录 一、Git 对文件名大小写不敏感1.1 问题描述1.2 原因分析1.3 解决方案方式一&#xff1a;使用git命令进行修改方式二&#xff1a;关闭git 忽略大小写配置 &#xff08;可以当前项目设置&#xff0c;也可以全局设置 --global&#xff09; 二、新的问题&#xff08;重复的目录…

Web3:B站chainlink课程Lesson5遇到的小坑汇总

ethers代码 我用的ethers.js 6 &#xff0c;和视频里一样用的是5的不用看代码部分 ethers.providers.JsonRpcProvider("server") //无了 ethers.JsonRpcProvider("server") //现在的wallet.getTransactionCount() //无了 wallet.getNonce() //现在的Big…

已解决:安卓,怎么优雅接入科大讯飞语音评测功能?

写在前面&#xff1a; 网上关于讯飞接入的博客都很少&#xff0c;按说讯飞都是业界翘楚&#xff0c;不知为何&#xff0c;很少搜索到精品&#xff0c;一搜就是一个要求开会员的博客&#xff0c;我也是醉了。讯飞提供的文档也是不清晰&#xff0c;我是摸着石头过河&#xff0c;…

java集合ArrayList和HashSet的fail-fast与fail-safe以及ConcurrentModificationException

在 java 的集合工具类中&#xff0c;例如对 ArrayList 或者 HashSet 进行删除元素后再遍历元素时&#xff0c;会抛出 ConcurrentModificationException 异常。 fail-fast ArrayList public class TestList {public static void main(String[] args) {ArrayList<Integer>…

【iOS ARKit】BlendShapes

BlendShapes 基础介绍 利用前置摄像头采集到的用户面部表情特征&#xff0c;ARKit 提供了一种更加抽象的表示面部表情的方式&#xff0c;这种表示方式叫作 BlendShapes,BlendShapes 可以翻译成形状融合&#xff0c;在3ds Max 中也叫变形器&#xff0c;这个概念原本用于描述通过…

Ubuntu18编译jdk8源码

环境 系统 ubuntu18 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux jdk源码openjdk-8u41-src-b04-14_jan_2020.zip bootJdk jdk-8u391-linux-x64.tar.gz ps -e|grep ssh sudo apt-get install ssh…

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法(LSBoost、Bag)含自动优化超参数和特征敏感性分析功能

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法&#xff08;LSBoost、Bag&#xff09;含自动优化超参数和特征敏感性分析功能 本文展示多种非常用多输入单输出回归预测模型效果。 注&#xff1a;每次运行数据训练集测试集为随机&#xff0c;故对比不严谨&…

京东广告算法架构体系建设--在线模型系统分布式异构计算演变 | 京东零售广告技术团队

一、现状介绍 算法策略在广告行业中起着重要的作用&#xff0c;它可以帮助广告主和广告平台更好地理解用户行为和兴趣&#xff0c;从而优化广告投放策略&#xff0c;提高广告点击率和转化率。模型系统作为承载算法策略的载体&#xff0c;目前承载搜索、推荐、首焦、站外等众多广…

Linux 远程服务器与本地互传文件

本地传远程服务器: 你可以使用 scp 命令将整个文件夹复制到远程服务器上。以下是一个示例命令&#xff1a; scp -r /home/wanghaiyang/Documents/DockerServer/docker_compose_project/apollo apollo254.564.257.12:/home/apollo/code/docker_compose/ 请确保将 /home/wangh…

Word插入音乐视频文件快速方法 exe zip doc apk txt pdf bat等

需求&#xff1a; Word插入文件有哪些极限操作&#xff1f;如何快速插入音乐视频等文件 问题解决&#xff1a; 使用拖动进行文件快速插入&#xff08;PPT Excle 同理&#xff09; 操作 1.让文件和word界面处于同一屏幕&#xff0c;可以使用分屏 2.鼠标选中文件左键或者使用笔…

一些反序列化总结

1 反序列化漏洞原理 如果反序列化的内容就是那串字符串&#xff0c;是用户可以控制的&#xff08;即变量的值&#xff09;&#xff0c;且后台不正当的使用了PHP中的魔法函数&#xff0c;就会导致反序列化漏洞&#xff0c;可以执行任意命令。Java 序列化指 Java 对象转换为字节序…

面试经典 150 题 ---- 合并两个有序数组

面试经典 150 题 ---- 合并两个有序数组 合并两个有序数组方法一&#xff1a;直接合并后排序方法二&#xff1a;双指针方法三&#xff1a;逆向双指针 合并两个有序数组 方法一&#xff1a;直接合并后排序 这种方法最简单&#xff0c;直接将 nums2 的数组放到 nums1 数组的尾部…

Flink问题解决及性能调优-【Flink根据不同场景状态后端使用调优】

Flink 实时groupby聚合场景操作时&#xff0c;由于使用的是rocksdb状态后端&#xff0c;发现CPU的高负载卡在rocksdb的读写上&#xff0c;导致上游算子背压特别大。通过调优使用hashmap状态后端代替rocksdb状态后端&#xff0c;使吞吐量有了质的飞跃&#xff08;20倍的性能提升…

2024年,你是否还在迷茫?

2024年&#xff0c;你是否还在迷茫&#xff1f; 别担心&#xff01;鸿蒙来了&#xff0c;这个未来技术的制高点&#xff0c;为你提供了答案&#xff01; 诸多大厂疯抢、24年预计鸿蒙相关的岗位需求将达到百万级、就业均薪达到19K&#xff0c;全国高校开课…… 种种现象都在表…

VirtualBox安装Ubuntu22.04

目录 1、新建虚拟机 1.1、设置内存大小 1.2、创建虚拟硬盘 2、虚拟机设置 2.1、设置启动顺序​编辑 2.2、选择iso镜像文件 2.3、设置网络(桥接网卡) 3、启动 3.1、设置语言环境 3.2、系统更新安装(不更新) 3.3、选择键盘布局(默认即可) 3.4、选择安装类型 3.5、网…

硬件知识(1) 手机的长焦镜头

#灵感# 手机总是配备好几个镜头&#xff0c;研究一下 目录 手机常配备的摄像头&#xff0c;及效果举例 长焦的焦距 焦距的定义和示图&#xff1a; IPC的焦距和适用场景&#xff1a; 手机常配备的摄像头&#xff0c;及效果举例 以下是小米某个手机的摄像头介绍&#xff1a…