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)
方法