Unity笔记-31-UI框架(思路)
2023-09-11 14:22:30 时间
Unity笔记-31-UI框架(思路)
不用框架所面临的问题
- 游戏UI中出现多个窗口,窗口与窗口之间的模态关系
- 当出现多个窗口,上面的窗口是当前只能操作的窗口
- 下面的窗口是模态的,看不清的,也是不能操作的
- 经常需要找对象,找组件,找组件里的方法或属性【重复性非常高的体力活】
- 通过对所有模块对象的统一管理
- 组件的统一设置
- 事件的统一调配
- 本地化语言问题【中文/英文】
- 消息机制
管理UI窗口与模态处理
- 定义:什么是窗口?
- 开发者自定义,可以是一个Panel管理或者是一个空对象管理
- 游戏的外观模式
- 游戏开始时,创建中只有几个基础的游戏对象
- 所有的内容,都是外观模式作为入口动态生成的
- 窗口的动态生成
- 所有窗口都是一个资源【预设体】
- 如何加载资源?
Resource.Load();
【本地】AssetsBundle()
【服务器】
- 所有资源都放在Resource文件夹下,通过动态的
- 资源缓存机制
- 第一次从Resource文件夹中加载资源
- 从第二次开始,从缓存中加载资源
- 资源缓存机制
- 如何加载资源?
- 关于所有资源的路径配置
- 不同的窗口,资源的路径时不一样的
- 就需要一个配置文件去统一管理所有窗口的资源路径
- 配置文件选择 XML/JSON
- Json也是一个文件,也需要加载
- 配置文件的路径,可以使用系统常数类来管理
- Resource加载的类型【TextAssets】
- Json文件的解析
- LitJson/UnityJson库
- 解析后存储到内存
- 最终目的–>对外接口,通过一个名字返回该名字所对应的窗口的预设体
- 所有窗口都是一个资源【预设体】
实现UI的模态处理
- 非当前模块不能进行UI操作
- Canvas Group组件
- Blocks Raycasts
- True: 检测射线,从而触发事件,可以操作UI
- False:不检测射线,不能触发事件,不可以操作UI
- Blocks Raycasts
- Canvas Group组件
实现UI模块的状态管理
OnEnter
进入状态
OnParse
暂停状态
OnResume
恢复状态
OnExit
离开状态
整体UI模块栈管理
UIStack<UIModuleBase>
PushUI(string panelName)
PopUI()
对模块中需要访问的对象,组件,组件的属性/方法进行封装
-
通过UIManager管理所有模块
Module
以及模块中的元件Widget
-
UIManger通过模块名称找到相应名称找到相应的模块
-
模块可以通过元件的名称找到相应的元件
-
管理示例
MainModule TaskModule SystemModule TaskButton_F GetRewardButton_F ShutDownVoiceButton_F SystemButton_F
-
-
所有可操作元件上自动添加脚本组件
UIWidgetBase
-
这样的管理结构为:
Dictionary<string,Dictionary<string,UIWidgetBase>>
-
每个模块去遍历所有有用的子对象【元件】
- 给每个元件添加脚本组件
UIWidgetBase
- 每个元件生成后,会自动注册到
UIManager
- 给每个元件添加脚本组件
-
这样,就可以通过UIManager找到任意一个已经生成了的模块元件
-
每个UIWidget都可以实现UI的所有功能
- 创建各个组件的接口
- IText,IImage,IButton
- 创建各个组件的接口
-
拿到任意一个UIWidget都可以使用里面封装好的方法
-
最终每个UIModule对应一个控制器,基类
UIControllerBase
- 每个控制器处理当前模块的业务逻辑【真正的框架使用】
XML图
本地化语言
-
语言管理类
LocalizationManager
- 简体中文,繁体中文,英文,日文,法文…
- 添加委托注册和取消委托注册方法的接口
- 更换语言方法
ChangeLanguage
,根据设置的语言,调用所有注册的SetText
方法- 设置生成后,将语言
ID
存储在本地,持久存在
- 设置生成后,将语言
-
给支持本地化的Text,绑定组件
LocalizationText
- 针对该Text的不同语言版本
- 从Json配置文件中读取该文件的多语言内容
string[]
- 在
LocalizationManager
中注册自己的SetText(语言ID)
方法
相关文章
- 关于通过ruby互联网同步时间的几个思路
- 【技术思路】极客时间-左耳听风-程序员攻略开篇
- python多线程扫描爆破网站服务器思路【笔记】
- 腾讯资深Android架构师写下的面试学习路线以及答题思路,我看完28天直接拿下字节offer
- ML之Clustering之LPA:LPA算法主要思路、输出结果、代码实现等相关配图之详细攻略
- 力扣——880. 索引处的解码字符串(Java、C、python3百分百击败含解题思路)
- 2022天府杯国际赛数学建模题目和思路
- 2022华东杯B题中证红利指数投资问题思路讲解
- 局部加权回归-新的回归思路,为每个样本订制个性化的模型
- 多线程设置线程超时思路
- 11. 几点基于Web日志的Webshell检测思路
- 【ORACLE性能分析和优化思路学习笔记02:什么时候需要对性能进行干预】
- 程序员的算法趣题Q56: 鬼脚图中的横线(思路2)
- K8S集群中Pod资源数据丢包排查思路
- K8S集群中Pod资源常见的异常状态以及排查思路