【Unity】一个UI框架例子

使用框架前置条件:调整脚本运行顺序, Canvas挂载UIManager, Panel挂载对应的UIController、UI控件挂载UIControl。

UIManager:UI管理器,用于处理和管理各个UIController和UIControl的业务逻辑,挂载在Canvas上;

UIController:界面层Controller,用于管理该界面下的所有控件信息;

UIControl:控件层Control,用于管理对应的组件信息。

UIManager:

public class UIManager3 : MonoBehaviour

{

private static UIManager3 instance;

public static UIManager3 Instance { get => instance; }

private Dictionary<string, UIController3> uiControllerList = new();

public virtual void Awake()

{

instance = this;

}

public virtual void OnDestroy()

{

uiControllerList.Clear();

Destroy(this);

}

public void AddToList(string uiControllerName, UIController3 uiController3)

{

if (!uiControllerList.ContainsKey(uiControllerName))

uiControllerList.Add(uiControllerName, uiController3);

}

public void LogoutUIController(string name)

{

if (uiControllerList.ContainsKey(name))

uiControllerList.Remove(name);

}

public void SetControllerActive(string uiControllerName, bool active)

{

foreach(Transform trans in transform)

{

if (trans.name == uiControllerName) trans.gameObject.SetActive(active);

}

}

public UIController3 GetUIController(string name)

{

if (uiControllerList.TryGetValue(name, out UIController3 uiController3))

return uiController3;

return null;

}

public UIControl3 GetUIControl(string controllerName, string controlName)

{

if (uiControllerList.TryGetValue(controllerName, out UIController3 uiController3))

return uiController3.GetUIControl(controlName);

return null;

}

}

UIController:

public abstract class UIController3 : MonoBehaviour

{

private Dictionary<string, UIControl3> uiControlList = new();

public virtual void Start()

{

UIManager3.Instance.AddToList(this.name, this);

foreach(Transform trans in transform)

{

if (trans.gameObject.GetComponent<UIControl>() != null) Destroy(trans.gameObject.GetComponent<UIControl>());

trans.gameObject.AddComponent<UIControl3>();

}

}

public virtual void OnDestroy()

{

UIManager3.Instance.LogoutUIController(this.name);

Destroy(this);

}

public UIControl3 GetUIControl(string name)

{

if (uiControlList.TryGetValue(name, out UIControl3 uiControl3))

return uiControl3;

return null;

}

public void LogoutUIControl(string name)

{

if (uiControlList.ContainsKey(name))

uiControlList.Remove(name);

}

}

UIControl:

public class UIControl3 : MonoBehaviour

{

private UIController3 parentController;

public virtual void Start()

{

if (transform.parent.GetComponentInParent<UIController3>() != null) parentController = transform.parent.GetComponentInParent<UIController3>();

}

public virtual void OnDestroy()

{

parentController.LogoutUIControl(this.name);

Destroy(this);

}

public void SetText(string txt)

{

if (GetComponent<Text>() != null)

GetComponent<Text>().text = txt;

}

public void SetButtonOnClick(UnityAction unityAction)

{

if (GetComponent<Button>() != null)

GetComponent<Button>().onClick.AddListener(unityAction);

}

public void SetSliderEvent(UnityAction<float> unityAction)

{

if (GetComponent<Slider>() != null)

GetComponent<Slider>().onValueChanged.AddListener(unityAction);//unityAction(float), float为Slider改变后的value值

}

public void SetImage(Sprite sprite)

{

if (GetComponent<Image>() != null)

GetComponent<Image>().sprite = sprite;

}

public void SetInpueFieldEvent(UnityAction<string> unityAction)

{

if (GetComponent<InputField>() != null)

GetComponent<InputField>().onValueChanged.AddListener(unityAction);//unityAction(string), string为InputField的整个文本

}

}

LoginPanel(GameObject名称为“Login_Panel”):

public class LoginPanel3 : UIController3

{

public Button UI_LoginBtn;

public override void Start()

{

base.Start();

UI_LoginBtn.GetComponent<Button>().onClick.AddListener(UILoginBtnOnClick);

}

private void UILoginBtnOnClick()

{

UIManager3.Instance.SetControllerActive(this.name, false);

UIManager3.Instance.SetControllerActive("Main_Panel", true);

}

}

MainPanel(GameObject名称为“Main_Panel”):

public class MainPanel3 : UIController3

{

public Button UI_ToMenuBtn;

public Button UI_LogoutBtn;

public override void Start()

{

base.Start();

UI_ToMenuBtn.GetComponent<UIControl3>().SetButtonOnClick(UITOMenuBtnOnClick);

UI_LogoutBtn.GetComponent<UIControl3>().SetButtonOnClick(UILogoutBtnOnClick);

}

private void UITOMenuBtnOnClick()

{

UIManager3.Instance.SetControllerActive(this.name, false);

UIManager3.Instance.SetControllerActive("Menu_Panel", true);

}

private void UILogoutBtnOnClick()

{

UIManager3.Instance.SetControllerActive(this.name, false);

UIManager3.Instance.SetControllerActive("Login_Panel", true);

}

}

MenuPanel(GameObject名称为“Menu_Panel”):

public class MenuPanel3 : UIController3

{

public Button UI_TOMainBtn;

public override void Start()

{

base.Start();

UI_TOMainBtn.GetComponent<UIControl3>().SetButtonOnClick(UITOMainBtnOnClick);

}

private void UITOMainBtnOnClick()

{

UIManager3.Instance.SetControllerActive(this.name, false);

UIManager3.Instance.SetControllerActive("Main_Panel", true);

}

}

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

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

相关文章

kalibr:相机模型

文章目录 📚简介Kalibr标定支持的相机模型及适用场景📌 针孔相机模型(Pinhole)🌐 全向相机模型(Omnidirectional)🔍 特殊模型💡 选型建议⚠️ 注意事项📚简介 Kalibr作为多传感器标定的重要工具,支持多种相机模型以适应不同光学特性的视觉传感器。其核心相机…

今日行情明日机会——20250430

指数目前仍然在震荡区间&#xff0c;等后续的方向选择以及放量后的主线~ 2025年4月30日涨停主要行业方向分析 一、核心主线方向 机器人概念&#xff08;政策催化技术突破&#xff09; • 涨停家数&#xff1a;18家。 • 代表标的&#xff1a; ◦ 全筑股份&#xff08;工业机器…

量子加密通信:打造未来信息安全的“铜墙铁壁”

在数字化时代&#xff0c;信息安全已成为全球关注的焦点。随着量子计算技术的飞速发展&#xff0c;传统的加密算法面临着前所未有的挑战。量子计算机的强大计算能力能够轻易破解现有的加密体系&#xff0c;这使得信息安全领域急需一种全新的加密技术来应对未来的威胁。量子加密…

微信小程序中基于 SSE 实现轻量级实时通讯 —— 原理、实践与对比分析

本文系统梳理了在微信小程序开发中&#xff0c;如何使用 SSE&#xff08;Server-Sent Events&#xff09;方式实现轻量级即时通讯&#xff0c;结合实际项目实践&#xff0c;详细讲解原理、实现流程、对比 WebSocket/TCP/UDP 通讯方式&#xff0c;并给出完整模块封装与最佳实践建…

OpenCV 图形API(73)图像与通道拼接函数-----执行 查找表操作图像处理函数LUT()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对矩阵执行查找表变换。 函数 LUT 使用来自查找表中的值填充输出矩阵。输入矩阵中的值作为查找表的索引。也就是说&#xff0c;函数对 src 中的…

MyBatis 类型处理器(TypeHandler)注册与映射机制:JsonListTypeHandler和JsonListTypeHandler注册时机

下面几种机制会让你的 List<String>/Map<String,?> 能正确读写成 JSON 数组&#xff0f;对象文本&#xff1a; MyBatis-Plus 自动注册 最新版本的 MyBatis-Plus starter 会把类路径下所有带 MappedTypes({List.class})、MappedJdbcTypes(JdbcType.VARCHAR) 这类注…

专题二十一:无线局域网——WLAN

一、WLAN简介 WLAN&#xff08;Wireless Local Area Network &#xff09;无线局域网&#xff0c;使用的是 IEEE 802.11 标准系列。 标准版本发布年份最大传输速率频段Wi-Fi代数特点/描述IEEE 802.1119971–2 Mbps2.4 GHzWi-Fi 0最早的无线局域网标准&#xff0c;传输速率低&…

python多进程的使用

多进程编程全面指南&#xff1a;从入门到实践 摘要&#xff1a;本文是为初学者设计的Python多进程编程全攻略&#xff0c;涵盖基础概念、核心函数详解、系统特性分析&#xff0c;并附带流程图、测试用例、开源项目推荐和经典书籍清单。通过8个实战代码示例和3个性能对比实验&am…

数据库管理与安全:从用户权限到备份恢复的全面指南

引言 在数字化时代&#xff0c;数据已成为组织最宝贵的资产之一。数据库作为存储和管理这些数据的核心系统&#xff0c;其安全性和可靠性直接关系到企业的运营和发展。无论是金融交易记录、医疗健康信息&#xff0c;还是电子商务平台的用户数据&#xff0c;都需要通过完善的数…

Electron Forge【实战】带图片的 AI 聊天

改用支持图片的 AI 模型 qwen-turbo 仅支持文字&#xff0c;要想体验图片聊天&#xff0c;需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通义千问",desc: "阿里百炼 -- 通义千问",// https://help.aliyun.com/z…

在 Elastic 中使用 JOIN 进行威胁狩猎!

作者&#xff1a;来自 Elastic Paul Ewing, Jonhnathan Ribeiro Elastic 的管道查询语言 ES | QL 为查询带来了 join 功能。 威胁狩猎者欢呼吧&#xff01;你是否一直在寻找一种通过 Elastic 的速度和强大功能来连接数据的方法&#xff1f;好消息&#xff01;Elastic 现在可以通…

从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…

Ethan独立开发产品日报 | 2025-04-30

1. Daytona 安全且灵活的基础设施&#xff0c;用于运行你的人工智能生成代码。 Daytona Cloud重新定义了AI代理的基础设施&#xff0c;具备低于90毫秒的启动时间、原生性能和有状态执行能力&#xff0c;这些是传统云服务无法比拟的。您可以以前所未有的速度和灵活性来创建、管…

Unity SpriteMask(精灵遮罩)

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;SpriteMask&#xff1a;精灵遮罩 &#x1f4a1;作用就是对精灵图片产生遮罩&#xff0c…

OpenHarmony全局资源调度管控子系统之内存管理部件

OpenHarmony之内存管理部件 内存管理部件 简介目录框架 进程回收优先级列表 补充 回收策略/查杀策略 使用说明参数配置说明 availbufferSizeZswapdParamkillConfignandlife 相关仓 简介 内存管理部件位于全局资源调度管控子系统中&#xff0c;基于应用的生命周期状态&#…

姜老师的MBTI课程笔记小结(1)ENFJ人格

课程文稿&#xff1a; 好&#xff0c;今天我们的重点其实并不在ENTJ&#xff0c;而是在于如果一个人其他都很像&#xff0c;只是在思考和感受这两端选择的时候&#xff0c;他缺了思考而更尊重感受&#xff0c;它会是什么样的一个人格特质呢&#xff1f;这就是ENFG在16人格的学派…

Node.js 应用场景

Node.js 应用场景 引言 Node.js 是一个基于 Chrome V8 JavaScript 引擎的开源、跨平台 JavaScript 运行环境。它主要用于服务器端开发&#xff0c;通过非阻塞 I/O 模型实现了高并发处理能力。本文将详细介绍 Node.js 的应用场景&#xff0c;帮助你了解其在实际项目中的应用。…

Qt/C++面试【速通笔记六】—Qt 中的线程同步

在多线程编程中&#xff0c;多个线程同时访问共享资源时&#xff0c;可能会出现数据不一致或者错误的情况。这时&#xff0c;我们需要线程同步机制来保证程序的正确性。Qt 提供了多种线程同步方式&#xff0c;每种方式适用于不同的场景。 1. 互斥锁&#xff08;QMutex&#xff…

JDK-17 保姆级安装教程(附安装包)

文章目录 一、下载二、安装三、验证是否安装成功1、看 java 和 javac 是否可用2、看 java 和 javac 的版本号是否无问题 一、下载 JDK-17_windows-x64_bin.exe 二、安装 三、验证是否安装成功 java&#xff1a;执行工具 javac&#xff1a;编译工具 1、看 java 和 javac 是否…