数据绑定和主题框架 - MRTK3

欢迎使用 MRTK3 数据绑定和主题框架。 此框架旨在方便创建视觉元素,在运行时,一个或多个数据源提供的数据可以动态填充和更新这些元素。

什么是数据绑定

数据绑定是在应用程序的 UX(视图)和呈现的数据(模型)之间建立连接的过程。 假设绑定具有正确的设置,并且数据提供适当的通知,则在数据更改其值时,绑定到该数据的元素会自动反映更改。

常用的数据绑定框架:

  • Delphi
  • Windows Presentation Framework (WPF .NET)
  • Windows 窗体
  • Angular
  • Backbond
  • JavaFX 绑定

Windows Presentation Framework 数据绑定框图

Databinding Windows Presentation Framework (WPF) 有关详细信息,请参阅数据绑定概述 - WPF.NET


MRTK 等效框图

MRTK equivalent block diagram


设计目标

  • 跨平台 - 随地部署
  • 支持任何组织结构和数据来源
  • 易于集成到现有或新的代码库
  • 对设计师和开发员友好
  • 在应用程序生命周期内可随时启用/禁用
  • 支持现实企业方案 - 后端数据库、复杂的 UX 预制件模板
  • 方便应用于现有的非 MRTK UX 组件和新颖的视觉元素
  • 绑定任何数据类型,包括子画面、图像、材料、动画和音频剪辑
  • 无需改动现有代码库即可轻松增强功能
  • 有效使用 CPU、RAM、GC 和帧时间
  • 与各种本地或后端数据源轻松集成
  • 嵌入式、运行时状态和后端数据源的任意同步组合
  • 有效处理任意大小的列表呈现集合
  • 可设置主题的动态数据元素的组合主题和数据绑定
  • 在呈现之前以开放方式验证和操作变量数据
  • 对其他 MRTK 功能的依赖极小
  • 与 MRTK v2 和 MRTK3 兼容
  • 毫不费力地贴牌和/或将品牌应用于库存资产

关键功能

  • 开放式数据源支持任何永久性、远程或 RAM 数据策略。
  • 开放式数据使用者支持任何 UX 绑定和主题需求。
  • 数据源和使用者之间的自动发现简化了挂接。
  • 从绑定配置文件进行可选的自动配置
  • 解耦的数据模型和视图支持 MVC 和 MVVM 模式。
  • 虚拟化集合,可通过分页和滚动进行导航。
  • 集合项的预测性预提取可实现流畅的列表导航。
  • 可为集合对象组建池并重用它们来减少 GC。
  • 可以在数据和视图键路径命名空间的差异之间映射。

当前功能

1. 通过数据使用者可视化变量数据

当前支持:

  • TextMeshPro 和 TextMesh 文本
  • 文本样式表(用于主题和辅助功能)
  • 子画面纹理
  • 布尔触发器
  • 四面体纹理
  • 字体图标
  • 集合:任意大小的列表,包含填充了变量数据的预制件
  • 任何其他支持 IDataConsumer 接口(直接或通过基类派生支持)的使用者

2. 使用各种数据源提供变量数据:

  • JSON 文本(直接或通过 URL 提取提供)
  • 变量数据元素的字典
  • 对象 - 基于 Node 的结构化数据
  • 任何 C# 对象的反射
  • 以编程方式更改的数据
  • 任何其他支持 IDataSource 接口的方法

3. 列表项放置器,用于管理列表的视觉呈现形式

4. 列表分页、滚动和虚拟化

  • 仅提取可见或正在处理的数据
  • 支持任意大型后端数据集
  • 在多个帧之间对提取操作进行负载均衡

5. 列出预制件池

  • 重用和重新填充预制件以减少 GC 和实例化时间。

6. 在运行时将主题动态应用于元素


路线图上的功能

除了已推出的功能外,其他优先规划的功能包括:

1. 数据操作器管道

  • 数据端和视图端值之间的转换
  • 本地化(与 Unity 本地化无缝集成)
  • 格式化
  • 验证

2. 预测性列表项预提取,可实现更快且更流畅的滚动/分页

3. 更多的数据使用者

  • 在组件上设置任何公共属性
  • 设置复选框的开/关状态
  • 设置滑块值
  • 在组中设置单选按钮
  • 单独的材料属性,例如设置颜色

4. 主题

  • 即使未运行应用程序,也可以在编辑器中查看应用的主题
  • 更新预制件以反映应用的主题,将其设为默认主题
  • 主题/样式继承

术语

  • 数据源 - 任何数据提供者,无论其运行时状态如何,是本地保存的还是从服务器提取的。
  • 数据源提供者 - 一个简单的 MonoBehaviour,提供对无法在 Unity 场景图中公开的数据源的访问。
  • 数据源类型 - 分配给数据源的唯一名称,使数据使用者可按名称指定所需的数据源。
  • 数据使用者 - 希望对数据更改采取操作的任何数据使用者,通常是视觉元素,但不是必需的。 例如,其用途是基于数据值的更改触发操作。
  • 数据控制器 - 一种使用当前关联的数据绑定值(作为参数提供)调用操作的机制。
  • 键路径 - 引用数据源中特定对象的数据选择器。 根据当前的实现方式,键路径格式是在 JSON 数据访问器之后建模的,用于破译映射、列表和原子元素的任意嵌套组合。
  • 本地键路径 - 可以永久嵌入在可重用预制件中的数据使用者端键路径。 通过解析集合实体和键路径映射器,本地键路径将自动转换为集合中特定项的完全解析键路径。 不与集合关联时,它们可以直接映射到数据源中的数据,也可以首先通过键路径映射器对其进行修改。
  • 完全解析的键路径 - 映射到数据源中一个特定对象的完整绝对键路径。 对于集合中的项,这是一个集合实体的完全解析键路径和该集合实体的一个数据元素的相对(本地)键路径的组合。

  • 键路径映射器 - 本地键路径与数据源字段名称之间的可选命名空间映射器(例如 "link" <-> "URL")。

  • 主题 - 一个数据源,提供所需的各种资产和样式来实现特定的视觉美感。

  • 项放置器 - 一个 DataConsumerCollection 伴随对象,负责将可见项放入场景。

  • 数据对象池 - 已实例化的备用预制件,随时可用于填充数据以实现低 GC 的列表导航。

  • 列表虚拟化 - 能够填充、呈现和导航任意大小的列表。

  • 预测性预提取 - 为可以快速通过滚动/分页查看的项预提取数据和填充集合预制件。

  • 预测性预提取 - 为可以快速通过滚动/分页查看的项预提取数据和填充集合预制件。

关键概念

数据源

数据源是任意类型和复杂性的任何托管数据集,可用于通过数据使用者填充数据视图。 数据源管理的数据可以是静态或动态数据。 对数据项所做的任何更改将报告给已注册接收更改通知的任何数据使用者。

数据源提供者

一个简单的接口,它提供单个方法用于检索数据源。 它的用途是使数据使用者组件能够在游戏对象层次结构中自动发现 MonoBehavior 脚本组件。 无需直接在游戏对象本身上实现数据源。 当现有的 MonoBehaviour 必须从另一个类派生并且多重继承阻止从 DataSourceGOBase 派生时,此接口很有用。 它还允许其他代码没有 Unity 依赖项。

数据源提供者单一实例

使用 DataSourceProviderSingleton MonoBehaviour 能够指定可自动发现的数据源,即使该数据源与希望侦听它的 DataConsumer 不在同一个 GameObject 层次结构中。 只需将 DataSourceProviderSingleton 放在场景中的任何位置,并使用数据使用者要发现的任何数据源填充 Data Sources 属性即可。 或者,数据使用者将遍历其父级以查找适当的数据源,这意味着可以将提供所需数据的数据源放在这些数据使用者的父链中的任何位置。

键路径(字符串)

键路径是唯一标识数据源中任何信息片段的机制。

尽管键路径可以是每个数据项的任何唯一标识符,但当前实现使用逻辑用户可读说明符,该说明符指示相关数据的导航位置相对于整个结构化数据集。 它基于 Javascript 的列表、字典和基元概念建模。 键路径是语法正确的 Javascript 语句,用于访问可以用 JSON 表示的数据。 此方法的一个优点是它可以很好地与 JSON 和 XML 关联。 这是从后端服务传输信息的两种最普遍方式。

键路径示例:

  • 温度
  • contacts[10].firstName
  • 联系人
  • contacts[10].addresses[3].city
  • [10].title
  • kingdom.animal.mammal.aardvark.diet.foodtypes.termites

由于键路径是一个不需要分类的任意字符串,实际数据说明符可以是描述要检索的数据的任何方法。 XML 的 XPath 是处理数据源的可行键路径架构的示例。 只要数据使用者提供的键路径与数据源预期的键路径一致,一切就会正常进行。 此外,可以实现键路径映射器以在不同架构之间进行转换。

解析键路径

解析键路径表示组合以下两个键路径:

  1. 描述如何访问较大数据集的特定子集的绝对键路径,例如包含许多条目的列表中的一个条目。
  2. 表示该列表或映射条目中特定数据的部分(相对)键路径。

这样,就能够以一种不考虑数据子集实际存在于较大数据集层次结构中的哪个位置的方式来处理该数据子集。 此功能的最关键用途是描述列表中单个条目的数据,而不用考虑当前实例正在引用该列表中的哪个条目。

由于“完全解析的”键路径始终由 DataSource 生成和使用,并且极少或不应由 DataConsumer 或其他外部组件修改,因此它可以采用对 DataSource 有意义的任何结构。 例如,如果某个预制件显示照片的列表条目及其标题、拍摄日期和其他属性,则该预制件中的本地键路径可能如下所示:

  • "photo_url"
  • "title"
  • "date_taken"
  • "description"

列表中一个预制件条目的完全解析键路径可能如下所示:

  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/photo_url"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/title"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/date_taken"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/description"

键路径映射器 (IDataKeyPathMapper)

键路径映射器允许数据源和数据使用者为键路径使用不同的命名空间和约定,同时仍可使这些键路径配合工作。

常用元素的预制件(例如用于显示人员联系信息的磁板)可以包含数据使用者管理的变量字段。 为实现此目的,用于预制件的任何变量方面的标识符需要通过一种方式映射到数据源中正确数据的标识符,每次使用预制件时,该标识符将确定该变量元素的内容。 键路径映射器可以实现此目的。

预制件可与不同的数据源配合使用,这些数据源中的数据存储在不同的组织结构中并使用字段名称。 若要对每个数据源使用模板预制件,键路径映射器可以解析数据组织方式的任何差异。

数据使用者 (IDataConsumer)

一个知道如何使用数据源管理的信息并使用该数据填充数据视图的对象。

数据使用者可以向数据源注册,以便在数据集中的指定键路径处存在的数据项发生任何更改时收到通知。 每当指定的数据发生更改(或怀疑已更改)时,都会通知数据使用者。

数据使用者集合

数据使用者集合拥有管理类似项列表的附加能力。 此列表可以是数据源管理的整个数据集,也可以只是一个子集。 通常,列表中每个项的数据包含类似的信息类型,但这不是必需的。 数据源和数据使用者支持嵌套列表,例如与联系人列表中每个人员关联的照片列表中的每张照片关联的关键字列表。 关键字的键路径相对于照片,照片的键路径相对于人员,人员的键路径相对于最近的父列表或相对于数据集的根。

在处理集合时,会将集合中特定条目的正确解析键路径分配到在为每个集合项实例化的预制件中找到的每个数据使用者。 然后使用它来完全解析该预制件中任何相对(本地)视图数据的键路径。

数据集合项放置器

集合数据使用者需要通过一种方式来使用重复视觉元素列表(例如产品、照片或联系人的可滚动列表)来填充用户体验。 这是通过将项放置器分配到集合数据使用者来实现的。 此项放置器是一个逻辑,它知道如何请求列表项,接受已填充了变量数据的预制件,然后将其呈现给用户(通常是通过将其插入到由列表的 UX 布局组件管理的列表中)。

主题设置

主题使用数据源和数据使用者的所有管道。 可为 GameObject 的任何层次结构设置主题,无论它们是静态数据,还是绑定到其他数据源的动态数据。 这样就可以组合应用数据绑定和主题。 甚至可为来自另一个数据源的数据设置主题。

框图和数据流

MRTK theming data flow

MRTK 主题

主题是一次性改变许多 UX 元素的视觉美感的能力。 通常,指定主题所需的所有数据由单个数据源提供,例如某个可编写脚本的对象。 还可以根据需要提供主题数据,或者根据主题数据的用途将其划分为逻辑组。

MRTK3 Theming

MRTK3 主题与数据绑定相组合

单个 UX 元素的数据绑定和主题可以共存。 可为任何一个 UX 元素同时设置主题和数据绑定。 在这种情况下,典型的流是使用来自 DataSource 的数据派生正确的主题键路径。 然后,使用此键路径从主题数据源(通常是 ScriptableObject 配置文件,但也可能是任何可以解析键路径的数据源)中检索对象。

为了简化主题和数据绑定的配置,可以创建在实例化时由 BindingConfigurator 处理的绑定配置文件。

  • BindingConfigurator 处理绑定配置文件,以确定预制件中要设置主题的资产,并将绑定的数据元素和可设置主题的元素与键路径相关联。 然后,它添加相应的 DataConsumers 以将这些视觉元素绑定到正确的键路径选择器,这些选择器将用于引用一个或多个 DataSources 中的、通常位于预制件本身外部的特定数据。
  • 主题数据由 DataSource 提供,其中包含绑定配置文件中标识的每个键路径的数据。
  • 使用 ThemeProvider 帮助器脚本可以轻松将 ScriptableObject 用作主题的 DataSource
  • 标准 UX 主题由绑定到 ThemeProvider 中的 DataSourceReflectionMRTK_UX_ThemeProfile ScriptableObject 提供。

Theme Profile DataSource flow diagram

嵌入式数据源

嵌入式数据源适合用于两种情况:

  1. 当预制件的每个实例具有不同的主题设置并需要其自身的单独数据源时。
  2. 当此预制件的所有实例由一个通用的持久性主题配置文件(例如ScriptableObject)管理,并且可以通过嵌入式数据源提供,因此无需建立外部依赖关系时。

DataSourceReflection

此元素可以将任何 C# 结构或类转换为 DataSource,方法是使用反射将键路径映射到字段、属性、嵌套类、数组、列表或字典。 它可以与 Unity ScriptableObject 或任何其他存在主题数据的 C# 结构或类相关联。 在运行时可为包含数据的实例化对象注入依赖项,以及对该对象进行更改。

  1. 可编写脚本的对象:对于在许多预制件之间共享的静态主题很有用。
  2. 非持久性 C# 结构或类:对于主题的动态运行时修改很有用。

DataSourceJson

如果数据以 json 文本的形式存在,则此元素将管理键路径到 json DOM 的映射。 可以从 Unity 的资源、StreamingAssets 甚至提取的 URL 中检索二进制资产。

DataSourceDictionary

当单纯的平面列表足以满足需求并可用于快速原型制作时,此元素是一个简单的选择。 支持所有主题资产,包括文本、Unity 资产(例如,材料、子画面和图像)、资源、StreamingAssets,甚至是可以通过 URL 从外部提取的资产。

自定义

任何实现简单 IDataSource 接口或者派生自 DataSourceBaseDataSourceGOBase 的自定义数据源都可用于满足自定义需求。

设置 UXComponents 的主题

UXComponents 包中提供的标准 UXComponents 控件都已配置为支持主题设置。 默认已关闭这种配置,但可以轻松启用。

每个控件(通常位于根预制件的最顶层 GameObject 上)都有一个名为 UXBindingConfigurator 的脚本。 如果启用此脚本,它将拉取所需的数据绑定脚本来打开主题设置。 确保同时导入数据绑定和主题包。

有关 TextMeshPro StyleSheets 的说明:目前无法使用 StyleSheets 来设置 TextMeshPro 常规样式。 可以使用 TextMeshPro 的默认样式表中包含的任何其他样式。 示例使用 Body 来解决此限制。

DataSourceThemeProvider

使用 DataSourceThemeProvider MonoBehaviour 可以轻松将包含对所有主题资产的所有引用的 ScriptableObject 设为数据源。 UXThemingExample 场景中演示了此操作。

ThemeSelector

使用 ThemeSelector MonoBehaviour 可以指定多个 ScriptableObject 配置文件并在它们之间轻松交换。 此元素的一个示例用途是轻松在“深色”和“浅色”主题之间切换。 通常在设计时将 ScriptableObject 添加到 Theme Profiles。 然后在运行时更改 Current Theme 属性以更改主题。

数据使用者主题

主题设置由数据使用者完成,具体而言,由继承自 DataConsumerThemeBase<T>、DataConsumerTextStyle 和自定义 DataConsumer 类的数据使用者完成,任何开发人员都可以实现这些类来增强主题支持。

DataConsumerThemeBase<T> 基类提供逻辑来使用主数据源中的整数或键数据,然后在辅助主题数据库中查找所需的最终值。 这是通过将输入数据映射到主题键路径,然后使用该主题键路径检索最终值来实现的。 这样,就可以为任一元素同时设置数据绑定和主题。 例如,假设数据库中某个状态字段的状态为 New、Started 和 Done,分别由值 0、1 和 2 表示。 其中每个状态可以由一个子画面图标表示。 对于数据绑定,可以使用从 0 到 2 的值来查找所需的子画面。 通过主题和数据绑定,主题配置文件将指向主题配置文件中三个子画面的正确列表,然后使用从 0 到 2 的值从该列表中选择正确的子画面。 这样就可以根据主题为这些图标设置不同的样式。

将运行时主题和动态数据绑定一起使用时,可以在任何 DataConsumerThemeBase 派生类中指定 DataConsumerThemeHelper 类,以便在主题发生更改时发出通知。

在运行时交换主题是通过将主题数据源中的数据替换为放置在相同数据对象模型拓扑中的新数据集来实现的。 DataSourceReflection 可与其中每个配置文件代表一个主题的 ScriptableObject 结合使用。 对于所有 MRTK 核心 UX 控件,主题配置文件是名为 MRTK_UXComponents_ThemeProfile 的 ScriptableObject。 使用 ThemeProvider.cs 帮助器脚本可以轻松将此配置文件或任何 ScriptableObject 配置文件用作数据源。

将主题应用于动态数据的方法在大多数情况下可以自动检测,也可以显式指定。

使用数据从主题数据源中选择正确的项时,过程为:

  • 使用主数据源中的数据选择或构造正确的主题键路径
  • 使用主题键路径从 DataConsumerThemeHelper 上指定的主题数据源中检索值
  • 分析检索到的主题值以自动检测正确的检索方法
  • 然后使用自动检测到的方法检索正确类型的最终数据项(例如材料、子画面或图像)。

数据类型

用于检索所需对象的数据的预期数据类型可以是下列其中一项:

数据类型 说明
AutoDetect 分析数据并自动检测正确的解释。 有关详细信息,请参阅下面的“自动检测数据类型”。
DirectValue 数据预期为所需的类型 T(例如材料、子画面、图像)并直接使用。
DirectLookup 用于从本地查找表中查找所需值的整数索引或字符串键。
StaticThemedValue 从指定的主题键路径处的主题数据源中检索正确类型的静态主题对象。
ThemeKeypathLookup 一个用于查找所需主题键路径的整型索引或字符串键。
ThemeKeypathProperty 要追加到主题中提供的主题基础键路径的字符串属性名称。
ResourcePath 用于从 Unity 资源中检索值的资源路径(可能以“resource://”开头)。
文件路径 用于检索 Unity 流式处理资产的文件路径(可能以“file://”开头)。

自动检测数据类型

自动检测功能自动分析收到的数据并确定检索方法。 在下表中,T 代表所需的类型,例如材料、子画面、图像。 自动检测可以发生在过程中的两个位置:

  • 在主要数据值本身上。
  • 在通过主要数据检索的已设置主题的值上。
数据类型 注意事项 有主题帮助器 行为
T 不适用 Y/N 直接使用,不设置主题
int 任何整型基元或 Int32 可分析字符串 作为索引传递给派生的 GetObjectByIndex(n),以检索类型 T 的第 N 个对象。
int 任何整型基元或 Int32 可分析字符串 用于通过本地查找提取第 N 个主题键路径,然后通过自动检测检索已设置主题的对象的索引。
字符串 格式:"resource://{resourcePath}" Y/N resourcePath 用于检索 Unity 资源
字符串 格式:"file://{filePath} Y/N filePath 用于检索流式处理资产
字符串 其他 作为键传递给派生的 GetObjectByKey(),以检索类型 T 的匹配对象。
字符串 其他 用于通过本地查找提取匹配的主题键路径,然后通过自动检测检索已设置主题的对象的键。

从包含数字状态值的数据库中检索已设置主题的状态图标的示例:

  1. 数据库中状态图标的键路径是 status.sprite_index。
  2. 检索到的 status.sprite_index 值为 2,表示“已取消”状态。
  3. DataConsumerSprite 查找中的 N=2(即第 3 个)条目设置为“Status.Icons.Cancelled”。
  4. 这是用于从“主题”数据源检索值的键路径。
  5. “Status.Icons.Cancelled”键路径的值为“resource://Sprites/sprite_cancelled”。
  6. 自动检测功能确定应该通过“Resources/Sprites/ sprite_cancelled”处的资源检索图标

TextMeshPro StyleSheets

主题设置能够激活 TMPro 样式表。 “TMP 设置”ScriptableObject 规定样式表预期出现在资源中的哪个位置。 它是“默认字体资产 => 路径”属性。

确保将任何应用特定的样式表放在与资源相同的子路径中。 如果你希望以不同的方式组织它们,请确保更新“TMP 设置”以保持匹配。

使新的 UX 控件可设置主题

如果你正在开发新的 UX 控件,使这些控件可设置主题会相对轻松一些。 从某种程度上讲,当控件使用材料、子画面及其他 UX 控件已在使用的其他资产时,通常涉及到以可发现的方式命名各种游戏对象。

可以从 MRTK_UXCore_ThemeProfile 继承并添加更多可设置主题的字段,或者将控件指向你自己的 ScriptableObject。 除了 ScriptableObject 的组织方式将通过 C# 反射确定键路径需要访问单个数据项之外,提供的控件没有什么神奇的地方。

通过将 BindingConfigurator.cs 脚本添加到新控件的顶层,你可以指定自己的序列化 BindingProfile ScriptableObject。 这将向键路径映射提供所需的 GameObject 名称,以便将可设置主题的元素与主题配置文件中提供的数据相关联。 在运行时,此脚本将自动添加任何所需的 DataConsumerXXX 组件以支持你要使用的主题。

入门

要求

  • Unity 2020.3 LTS 或更高版本
  • TextMeshPro 2.1.4 或更高版本

示例场景

首先请仔细查看 MRTK 示例包中的各种数据绑定示例场景,并查看如何配置各种数据源 MonoBehaviour。 通常,数据绑定脚本只需放置在预制件的最高级别 GameObject 上,或相关的一组 UX 元素上。

此外,对于大多数用例,默认值现成可用,但公开的属性可为更高级用例提供很大的灵活性。

注意

若要为标准 MRTK UX 组件启用主题,必须在播放器设置中定义 MRTK_UX_DATABINDING_THEMING_ENABLED 符号。 不需要主题时,此符号可确保不会对性能造成任何影响。

Assets/DataBinding Example/Scenes/DataBindingExamples.scene

此场景演示各种变量数据方案。 只需加载场景并播放即可。 在这里需注意一些事项:

  • TextMeshPro 组件的文本输入字段包含如下所示的变量:{{ firstName }}。 这些标记直接用作本地键路径。

  • 用于子画面和文本的游戏对象具有某种形式的数据使用者组件,该组件管理数据接收和视图更新。

  • 可以通过将单个数据使用者放置在 GO 层次结构中的较高位置,让相同类型的多个组件共享它。

  • 只要数据使用者位于同一个游戏对象上或位于 GO 层次结构中的更高位置,它就可以找到自己的数据源。

  • 父游戏对象有一个数据源组件,该组件为呈现一组相关变量信息的所有子游戏对象提供数据。

  • 集合数据使用者指定一个预制件,该预制件本身包含用于使用变量数据填充该预制件的数据使用者。

Assets/UX Theming Example/Scenes/AudioTheming

此示例使用主题在一个 Piano 集和一个 Xylophone 集之间切换 AudioClips。

Assets/UX Theming Example/Scenes/BatteryLevelExample

此示例组合了主题和数据绑定,以将电池电量显示为数值和图标。 主题用于在“充电”主题和“未充电”主题之间进行选择。 它旨在满足以下目标:

  • 所有视觉资产都可以作为主题配置文件存在于单个 ScriptableObject 中。
  • “充电”状态子画面的数量可能与“未充电”状态子画面的数量不同。
  • 有关将报告的电池电量映射到特定子画面的算法可能是非线性的,并根据“充电”状态和“未充电”状态而异。
  • 所有视觉资产都可以作为主题配置文件存在于单个 ScriptableObject 中。
  • 充电状态子画面的数量可能与未充电状态子画面的数量不同。
  • 有关将报告的电池电量映射到哪个子画面的算法可能是非线性的,并根据充电状态和未充电状态而异。

注意

此演示的结构不能很好地示范主题和数据绑定的组合。 在可以正确分离模型和视图的生产应用程序中,实际电池状态(电量和充电状态)将在单独的数据源中提供,而不是在子画面本身的资源定位符中提供。

Assets/UX Theming Example/Scenes/UXThemingExample

此示例演示如何更改整个应用程序的主题,以及如何使用 DataSourceGODictionary 作为数据源来管理要在 UX 中显示的各种文本内容。 在更全面的方案中,其他更灵活的数据源类型有可能会提供所需的灵活性,例如 DataSourceReflectionDataSourceGOJson

第一个数据绑定项目

此处提供了一个可帮助你快速入门的简单示例:

  1. 创建新场景。
  2. 在混合现实工具包菜单中,选择“添加到场景并配置”选项。
  3. 创建一个空的游戏对象并将其重命名为“数据绑定”。添加一个 DataSourceJsonTest 组件。
  4. 在检查器中,将 URL 更改为:https://www.boredapi.com/api/activity
  5. 将一个 UI -> 文本 - TextMeshPro 对象添加到数据绑定游戏对象。 它将依次添加一个画布和一个“文本(TMP)”对象。
  6. 选择该“文本(TMP)”对象,然后在检查器中将“文本输入”更改为:

{{ activity }}. It's {{ type }}.

  1. 选择画布对象并向其添加数据使用者文本组件。
  2. 运行该项目。 每隔 15 秒会显示一个不同的活动。

恭喜。 你已使用 MRTK 创建了第一个数据绑定项目!

编写新的数据源

数据源向一个或多个数据使用者提供数据。 它可以是任何形式的数据:算法生成的数据、RAM 中的数据、磁盘上的数据,或者从中心数据库提取的数据。

所有数据源必须提供 IDataSource 接口。 某些基本功能在名为 DataSourceBase 的基类中提供。 你很可能想要从此类派生,以添加符合特定需求的特定数据管理功能。

可以通过名为 DataSourceGOBase(其中的 GO 表示 GameObject)的另一个基对象将数据源作为组件放到游戏对象上。 这是一个可以作为组件放到 GameObject 上的 MonoBehavior。 它是一个瘦代理,旨在将工作委托给非特定于 Unity 的核心数据源。

数据源可以公开在 Unity 编辑器中操作数据的功能。 如果是这种情况,则派生类可以包含所有数据源逻辑,或者可以利用“库存”数据源,但同时还可以添加检查器字段或其他配置数据的方式。

编写新的数据使用者

当数据发生更改时,数据使用者会收到通知,然后更新用户体验的某些方面,例如 TextMeshPro 组件中显示的文本。

所有数据使用者必须提供 IDataConsumer 接口。 某些基本功能在名为 DataConsumerGOBase(其中 GO 表示 GameObject)的基类中提供。

数据使用者的大部分工作是接受新数据,然后准备好呈现数据。 这种工作有时十分简单,只需选择正确的预制件即可,而有时需要从云服务(例如内容管理系统)提取更多数据。

编写数据集合项放置器

数据集合项放置器负责管理集合的哪些部分当前可见,以及如何呈现该可见集合,不管该集合是小型静态列表,还是包含一百万条记录的巨型数据库。

所有项放置器必须提供 IDataCollectionItemPlacer 接口。 某些基本功能在名为 DataColletionItemPlacerGOBase 的基类中提供。 所有项放置器都应派生自此类。

已知限制和缺少的功能

  • 尚未与 Unity 的基于画布的控件和可滚动列表集成。
  • .NET INotifyPropertyChanged 的集成尚未实现。
  • 由于较高版本的 Unity 中存在 HTTPS SSL bug,从 Flickr 和 trymrtk.com 提取图像的示例场景在 HoloLens 上不起作用。
  • 其他性能优化。
  • 此版本侧重于数据呈现,而不是数据捕获。 MRTK UX 控件尚未连接起来,无法在 DataSource 中设置状态。
  • 对列表数据进行动态更改会完全刷新整个列表,而不是增量更新。
  • 数据操作管道尚未实现
  • 尚不完全支持在磁板上填充所有 UX 组件。
  • DataSourceJson 节点应实现 IDataNode 接口,以便能够与 DataSourceObjects 互操作。