Unity游戏框架设计之UI管理器

news/发布时间2024/5/17 5:27:09

Unity游戏框架设计之UI管理器

简单介绍

在游戏开发过程中,我们通常需要管理 UI 游戏对象的加载、打开和销毁等操作,同时也需要管理游戏数据和游戏数据在 UI 上的显示,因此我们需要一个 UI 管理器来统一实现上述基础功能。

我们可以基于 MVC 模式编写 UI 管理器,此时 UI 管理器将分为模型管理器(Model)、视图管理器(View)和控制管理器(Controller)。

UI模型管理器

简单介绍

UI 模型管理器主要管理 UI 上数据的设置和读取。为了将数据显示到 UI 上,则必须选定一个 UI 组件作为载体。对于不同的 UI 组件,则有不同的设置和读取方法。因此引入 UIModelType 类来区分不同的 UI 组件。

下述代码以 UI 组件中的 TextMeshProUGUI 组件为例,分别编写对应的 UI 组件的模型管理器。然后编写 UI 模型管理器来统一管理所有 UI 组件中的模型,并以 UIModelType 作为区分不同 UI 的标识符。

代码设计

public enum UIModelType
{TextMeshProUGUI
}
public class UITextMeshProGUIModelManager : SingletonMono<UITextMeshProGUIModelManager>
{public string GetTextModel(string sceneAssetPath, string uiName, string gameObjectName){return UIManager.Instance.FindUIComponentByName<TextMeshProUGUI>(sceneAssetPath, uiName, gameObjectName).text;}public void SetTextModel(string sceneAssetPath, string uiName, string gameObjectName, string text){UIManager.Instance.FindUIComponentByName<TextMeshProUGUI>(sceneAssetPath, uiName, gameObjectName).text = text;}
}
public class UIModelManager : SingletonMono<UIModelManager>
{protected override void Awake(){base.Awake();gameObject.AddComponent<UITextMeshProGUIModelManager>();}public string GetModel(string sceneAssetPath, string uiName, string gameObjectName, UIModelType type){switch (type){case UIModelType.TextMeshProGUI:return UITextMeshProGUIModelManager.Instance.GetTextModel(sceneAssetPath, uiName, gameObjectName);default:throw new ArgumentOutOfRangeException();}}public void SetModel(string sceneAssetPath, string uiName, string gameObjectName, string value, UIModelType type){switch (type){case UIModelType.TextMeshProGUI:UITextMeshProGUIModelManager.Instance.SetTextModel(sceneAssetPath, uiName, gameObjectName, value);break;default:throw new ArgumentOutOfRangeException();}}
}

UI视图管理器

简单介绍

UI 视图管理器主要管理 UI 的资源加载、UI 的打开、UI 的关闭、UI 的销毁。UI 视图管理器依赖于场景管理器(不是 Unity 官方 API 而是自己实现的游戏框架中的场景管理器),因为 UI 视图管理器的操作与场景管理器的操作类似。UI 的资源加载,实际上就是将资源加载到场景中。UI 的打开,实际上就是场景中游戏对象的激活。UI 的关闭,实际上就是场景中游戏对象的禁用。UI 的销毁,实际上就是场景中游戏对象的销毁。

代码设计

public class UIViewManager : SingletonMono<UIViewManager>
{public GameObject LoadUI(string sceneAssetPath, string uiAssetPath, string uiName){return SceneManager.Instance.LoadRootPrefab(sceneAssetPath, uiAssetPath, uiName);}public (GameObject, T) LoadUI<T>(string sceneAssetPath, string uiAssetPath, string uiName) where T : Component{GameObject prefab = SceneManager.Instance.LoadRootPrefab(sceneAssetPath, uiAssetPath, uiName);T component = AddUIComponent<T>(sceneAssetPath);return (prefab, component);}public GameObject OpenUI(string sceneAssetPath, string uiName){return SceneManager.Instance.ActiveRootPrefab(sceneAssetPath, uiName);}public GameObject LoadAndOpenUI(string sceneAssetPath, string uiAssetPath, string uiName){return SceneManager.Instance.LoadAndActiveRootPrefab(sceneAssetPath, uiAssetPath, uiName);}public (GameObject, T) LoadAndOpenUI<T>(string sceneAssetPath, string uiAssetPath, string uiName) where T : Component{GameObject prefab = LoadAndOpenUI(sceneAssetPath, uiAssetPath, uiName);T component = AddUIComponent<T>(sceneAssetPath);return (prefab, component);}public void CloseUI(string sceneAssetPath, string uiName){SceneManager.Instance.InactiveRootPrefab(sceneAssetPath, uiName);}public void CloseAndDestroyUI(string sceneAssetPath, string uiName){SceneManager.Instance.InactiveAndDestroyRootPrefab(sceneAssetPath, uiName);}private T AddUIComponent<T>(string sceneAssetPath) where T : Component{return SceneManager.Instance.AddRootGameObjectComponent<T>(sceneAssetPath);}
}

UI控制管理器

简单介绍

UI 控制管理器主要用于控制 UI 事件的处理。首先我们通过 UI 控制管理器向 UI 添加 UI 事件的监听器,然后当 UI 事件触发时,将自动执行监听器中的代码来完成对 UI 事件的处理。下面以 Button 组件的事件监听器的绑定作为例子,编写 UI 控制管理器。

代码设计

public class UIControllerManager : SingletonMono<UIControllerManager>
{public void AddListenerOnButtonClick(string sceneAssetPath, string uiName, string gameObjectName, Action onButtonClick){UIManager.Instance.FindUIComponentByName<Button>(sceneAssetPath, uiName, gameObjectName).onClick.AddListener(() => onButtonClick());}
}

代码说明

(一)使用 UI 控制管理器时,必须在场景中添加 EventSystem 组件,否则 UI 事件将不会触发。

(二)允许重复添加事件监听器。

(三)向 UI 添加 UI 事件的监听器后,不需要主动在 UI 被禁用或者被销毁时删除 UI 事件的监听器,监听的删除操作由 Unity 自动完成。

后记

由于个人能力有限,文中不免存在疏漏之处,恳求大家斧正,一起交流,共同进步。

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

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

相关文章

eth-proj-bg-merge-0

面向初学者的 ETH 项目(全)原文:zh.annas-archive.org/md5/5b197ea4ae8836b6854907e58ea8a1dc 译者:飞龙 协议:CC BY-NC-SA 4.0前言 本书旨在让你深入了解以太坊区块链世界,并让你使用以太坊制作自己的加密货币。在本书中,你将学习各种概念,并直接应用这些知识,同时还…

初三奥赛模拟测试5

初三奥赛模拟测试5点击查看快读快写代码 #include <cstdio>using namespace std; // orz laofudasuan // modifiednamespace io {const int SIZE = (1 << 21) + 1;char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55]; int f, qr;…

网络接收全流程

网卡简介 网卡是一块通信硬件。属于数据链路层。用户可以通过电缆或无线相互连接。每一个网卡都有一个独一无二的MAC地址(48位),它被写在卡上的一块ROM中。IEEE负责为网卡销售商分配唯一的MAC地址。 可以在终端运行sudo lshw -C network来查看网卡型号 可以在/lib/modules/$(u…

重链剖分题目选讲

染色 给定一棵 \(n\) 个节点的无根树,共有 \(m\) 个操作,操作分为两种:将节点 \(a\) 到节点 \(b\) 的路径上的所有点(包括 \(a\) 和 \(b\))都染成颜色 \(c\)。 询问节点 \(a\) 到节点 \(b\) 的路径上的颜色段数量。颜色段的定义是极长的连续相同颜色被认为是一段。例如 1…

for reading (没有那个文件或目录)en file `

001、奇怪的报错: for reading (没有那个文件或目录)en file `[sy20223040796@admin1 test]$ ls ## 测试文件及命令 test.bed test.sh [sy20223040796@admin1 test]$ cat test.bed ## 测试文件 1 5400001 5400002 1 5425001 5425002 1 …

2024年4月总结及随笔之多事之月

2024年4月总结及随笔之多事之月1. 回头看 日更坚持了486天。读《所罗门的密码》更新完成 读《天才与算法:人脑与AI的数学思维》开更并持续更新中2023年至2024年3月底累计码字1081378字,累计日均码字2225字。 2024年4月码字87695字,同比增长52.5%,环比下降7.5%,日均码字数2…