zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

实现UI模块的状态管理

OnEnter进入状态

OnParse暂停状态

OnResume恢复状态

OnExit离开状态

整体UI模块栈管理

UIStack<UIModuleBase>

PushUI(string panelName)

PopUI()

对模块中需要访问的对象,组件,组件的属性/方法进行封装

  • 通过UIManager管理所有模块Module以及模块中的元件Widget

    • UIManger通过模块名称找到相应名称找到相应的模块

    • 模块可以通过元件的名称找到相应的元件

    • 管理示例

      MainModuleTaskModuleSystemModule
      TaskButton_FGetRewardButton_FShutDownVoiceButton_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的不同语言版本
    1. 从Json配置文件中读取该文件的多语言内容string[]
    2. LocalizationManager中注册自己的SetText(语言ID)方法

在这里插入图片描述