Partilhar via


Estrutura temática e de vinculação de dados — MRTK3

Bem-vindo à estrutura MRTK3 Data Binding and Theming. Essa estrutura foi projetada para facilitar a criação de elementos visuais que podem ser preenchidos e atualizados dinamicamente em tempo de execução por dados fornecidos de uma ou mais fontes de dados.

O que é a vinculação de dados

A vinculação de dados é o processo que estabelece uma conexão entre a experiência do usuário (visualização) de um aplicativo e os dados que estão sendo apresentados (modelo). Suponha que a vinculação tenha as configurações corretas e os dados forneçam as notificações adequadas; Quando os dados mudam de valor, os elementos vinculados aos dados refletem as alterações automaticamente.

Estruturas de vinculação de dados populares:

  • Delphi
  • Estrutura de apresentação do Windows (WPF .NET)
  • Windows Forms
  • Angular
  • Backbond
  • Ligações JavaFX

Diagrama de blocos de vinculação de dados do Windows Presentation Framework

Databinding Windows Presentation Framework (WPF) Para obter mais informações, consulte Visão geral da vinculação de dados - WPF.NET


Diagrama de blocos equivalente MRTK

Diagrama de blocos equivalente MRTK


Objetivos do projeto

  • Plataforma cruzada - implante em qualquer lugar
  • Suporte a qualquer estrutura organizacional e origem de fontes de dados
  • Fácil de integrar em bases de código existentes ou greenfield
  • Designer e desenvolvedor amigável
  • Pode ser ativado/desativado a qualquer momento durante o ciclo de vida do aplicativo
  • Ofereça suporte a cenários corporativos reais - DBs de back-end, modelos pré-fabricados de UX complexos
  • Fácil de aplicar a componentes UX não MRTK existentes e novos elementos visuais
  • Vincular qualquer tipo de dados, incluindo sprites, imagens, materiais, animações e clipes de áudio
  • Recursos fáceis de aprimorar sem tocar na base de código existente
  • Uso eficiente de CPU, RAM, GC e frame-time
  • Integre-se facilmente com uma ampla variedade de fontes de dados locais ou back-end
  • Qualquer combinação simultânea de fontes de dados incorporadas, de estado em tempo de execução e de back-end
  • Lide eficientemente com coleções de qualquer tamanho para apresentação de lista
  • Combinação de temas e vinculação de dados para elementos de dados dinâmicos temíveis
  • Valide e manipule dados variáveis de forma aberta antes de apresentar
  • Dependências mínimas em outras funcionalidades do MRTK
  • Compatível com MRTK v2 e MRTK3
  • Fácil de white label e/ou aplicar a marca aos ativos de estoque com o mínimo de esforço

Principais Funcionalidades    

  • As fontes de dados abertas suportam qualquer estratégia de dados persistentes, remotos ou RAM.
  • Os consumidores de dados abertos suportam qualquer necessidade de vinculação e temática de UX.
  • A descoberta automática entre fontes de dados e consumidores simplifica a conexão.
  • Configuração automática opcional a partir de um perfil de ligação
  • O modelo de dados dissociado e a visualização suportam padrões MVC e MVVM.
  • Coleções virtualizadas com navegação via paginação e rolagem.
  • Pré-busca preditiva de itens de coleção para navegação suave na lista.
  • Os objetos de coleção podem ser agrupados e reutilizados para reduzir o GC.
  • Pode mapear entre diferenças nos dados e exibir namespaces de keypath.

Funcionalidade atual

1. Visualize dados variáveis através de consumidores de dados

Atualmente suportado:

  • Texto TextMeshPro e TextMesh
  • Folhas de estilo de texto (para temas e acessibilidade)
  • Textura de Sprite
  • Gatilho booleano
  • Textura quádrupla
  • Ícones de fonte
  • Coleções: listas de tamanho arbitrário contendo pré-fabricados preenchidos com dados variáveis
  • Qualquer outro consumidor que suporte a interface IDataConsumer (diretamente ou por meio de derivações de classes base)

2. Fornecer dados variáveis utilizando uma variedade de fontes de dados:

  • Texto JSON (diretamente ou por meio de busca de URL)
  • Dicionário de elementos de dados variáveis
  • Objeto - Dados estruturados baseados em nós
  • Reflexão de qualquer objeto C#
  • Dados programaticamente alterados
  • Qualquer outro método que suporte a interface IDataSource

3. Listar o marcador de item para gerenciar a manifestação visual de uma lista

4. Listar paginação, rolagem e virtualização

  • Os dados só são buscados quando visíveis ou em processo
  • Suporta conjuntos de dados back-end arbitrariamente grandes
  • A obtenção é balanceada de carga em vários quadros

5. Listar pool pré-fabricado

  • Os pré-fabricados são reutilizados e repreenchidos para reduzir o GC e o tempo de instanciação.

6. Aplique temas dinamicamente a elementos em tempo de execução


Funcionalidade no roteiro

Além do que já está disponível, as principais prioridades para mais recursos incluem:

1. Pipelines do manipulador de dados

  • Conversão entre valores do lado dos dados e do lado da visualização
  • Localização (integração perfeita com a localização Unity)
  • Formatação
  • Validação

2. Pré-busca de itens de lista preditiva para rolagem/paginação mais rápida/suave

3. Mais consumidores de dados

  • Definir qualquer propriedade pública em um componente
  • Definir estado de ativação/desativação da caixa de seleção
  • Definir valor do controle deslizante
  • Definir um botão de opção em um grupo
  • Propriedades individuais do material, como definir a cor

4. Temática

  • Veja temas aplicados no Editor mesmo quando o aplicativo não está em execução
  • Atualize os pré-fabricados para refletir um tema aplicado para que ele se torne o tema padrão
  • Herança de tema/estilo

Terminologia

  • Fonte de dados - Qualquer provedor de dados, seja o estado de tempo de execução, persistido localmente ou buscado em um servidor.
  • Provedor de fonte de dados - Um MonoBehaviour simples que fornece acesso a uma fonte de dados que não pode ser exposta no gráfico de cena Unity.
  • Tipo de Fonte de Dados - Um nome exclusivo atribuído à Fonte de Dados para que os Consumidores de Dados possam especificar a(s) fonte(s) de dados desejada(s) pelo nome.
  • Consumidor de dados - Qualquer consumidor de dados que deseje agir sobre alterações de dados, normalmente um elemento visual, mas não obrigatório. Como exemplo, sua finalidade pode ser acionar ações com base em alterações de valor de dados.
  • Controlador de dados - Um mecanismo para invocar uma ação com o valor associado a dados atualmente fornecido como um parâmetro.
  • Keypath - Um seletor de dados que faz referência a um objeto específico em uma fonte de dados. Conforme implementado atualmente, o formato keypath é modelado de acordo com acessadores de dados JSON para decifrar qualquer combinação aninhada de mapas, listas e elementos atômicos.
  • Caminho-chave local - Um caminho-chave do lado do consumidor de dados que pode ser incorporado permanentemente em um pré-fabricado reutilizável. Através da resolução de entidades de coleção e mapeadores de Keypath, isso será convertido automaticamente em um keypath totalmente resolvido para um item específico em uma coleção. Quando não estão associados a uma coleção, eles podem ser mapeados diretamente para um dado na fonte de dados ou podem ser modificados primeiro por meio de um Mapeador de Keypath.
  • Keypath totalmente resolvido - Um keypath completo e absoluto que mapeia para um objeto específico em uma fonte de dados. Para itens em uma coleção, essa é uma combinação do caminho de chave totalmente resolvido para uma entidade de coleta e um caminho de chave relativo (local) para um elemento de dados dessa entidade de coleta.

  • Mapeador de Keypath - Mapeador de namespace opcional entre keypaths locais e nomes de campos de Fonte de Dados (por exemplo, "link" <-> "URL").

  • Tema - Uma fonte de dados que fornece um conjunto de vários recursos e estilos necessários para alcançar uma estética visual específica.

  • Item Placer - Um complemento DataConsumerCollection responsável por colocar itens visíveis em uma cena.

  • Data Object Pool - Pré-fabricados em espera instanciados, prontos para serem preenchidos com dados para navegação em listas de baixa GC.

  • Virtualização de listas - Capacidade de preencher, apresentar e navegar em listas de tamanho arbitrariamente grande.

  • Pré-busca preditiva - Pré-busca de dados e preenchimento de pré-fabricados de coleção para itens que podem ser vistos em breve por meio de rolagem/paginação.

  • Pré-busca preditiva - Pré-busca de dados e preenchimento de pré-fabricados de coleção para itens que podem ser vistos em breve por meio de rolagem/paginação.

Conceitos-chave

Origem de Dados

Uma fonte de dados é qualquer conjunto gerenciado de dados de tipo(s) arbitrário(s) e complexidade que pode ser usado para preencher exibições de dados por meio de consumidores de dados. Os dados gerenciados por uma fonte de dados podem ser estáticos ou dinâmicos. Quaisquer alterações aos itens de dados serão comunicadas a quaisquer consumidores de dados que se tenham registado para receber notificações de alteração.

Provedor de fonte de dados

Uma interface simples que tem um único método para recuperar uma fonte de dados. Isso foi projetado para permitir que um componente de script MonoBehavior seja descoberto automaticamente na hierarquia de objetos do jogo pelos componentes do consumidor de dados. Não há necessidade de implementar uma fonte de dados diretamente no próprio objeto do jogo. Isso é útil quando um MonoBehaviour existente deve derivar de outra classe e a herança múltipla impede a derivação de DataSourceGOBase. Ele também permite que mais código não tenha dependências Unity.

Provedor de fonte de dados Singleton

O DataSourceProviderSingleton MonoBehaviour torna possível especificar uma fonte de dados que pode ser descoberta automaticamente mesmo que não esteja na mesma hierarquia GameObject que os DataConsumers que desejam ouvi-la. Basta colocar em DataSourceProviderSingletonqualquer lugar da cena e preencher a Data Sources propriedade com quaisquer fontes de dados que devem ser descobertas pelos consumidores de dados. Como alternativa, os consumidores de dados orientarão seus pais a encontrar uma fonte de dados apropriada, o que implica que você pode colocar uma fonte de dados que forneça os dados desejados em qualquer lugar da cadeia pai desses consumidores de dados.

Caminho da chave (string)

Um caminho chave é o mecanismo para identificar exclusivamente qualquer informação em uma fonte de dados.

Embora um caminho de chave possa ser qualquer identificador exclusivo por item de dados, as implementações atuais usam um especificador lógico legível pelo usuário que indica a posição de navegação dos dados de interesse em relação a todo o conjunto de dados estruturados. É modelado no conceito de listas, dicionários e primitivos do Javascript. Os caminhos principais são instruções Javascript sintaticamente corretas para acessar dados que podem ser representados em JSON. A vantagem dessa abordagem é que ela se correlaciona bem com JSON e XML. Esses são os dois meios mais prevalentes de transferir informações de serviços de back-end.

Exemplos de caminhos-chave:

  • temperatura
  • contatos[10].firstName
  • contatos
  • contatos[10].endereços[3].cidade
  • [10].título
  • kingdom.animal.mammal.aardvark.diet.foodtypes.cupins

Dado que um caminho de chave é uma cadeia de caracteres arbitrária sem taxonomia necessária, os especificadores de dados reais podem ser qualquer método de descrever quais dados recuperar. XPath do XML é um exemplo de um esquema de caminho de chave viável que funcionaria com fontes de dados. Desde que os principais caminhos fornecidos pelo consumidor de dados sejam consistentes com os caminhos-chave esperados pela fonte de dados, tudo funcionará. Além disso, os mapeadores de caminho chave podem ser implementados para traduzir entre diferentes esquemas.

Resolvendo um caminho chave

Resolver um caminho de chave significa combinar dois caminhos-chave:

  1. Um caminho de chave absoluto que descreve como acessar um subconjunto específico de um conjunto de dados maior, como uma entrada em uma lista de muitas entradas.
  2. Um caminho de chave parcial (relativo) que representa um dado específico dentro dessa lista ou entrada de mapa.

Isso torna possível tratar um subconjunto dos dados de tal forma que não importa onde em uma hierarquia de conjunto de dados maior ele realmente existe. O uso mais crítico dessa capacidade é descrever os dados de uma única entrada em uma lista sem se preocupar com qual entrada nessa lista a instância atual está se referindo.

Como um caminho de chave "totalmente resolvido" é sempre gerado e consumido por um DataSource e raramente ou nunca deve ser modificado por um DataConsumer ou outro componente externo, ele pode ter qualquer estrutura que faça sentido para o DataSource. Por exemplo, se houver um pré-fabricado para mostrar uma entrada de lista para uma foto e seu título, data de captura e outros atributos, o caminho da chave local no pré-fabricado poderá ter esta aparência:

  • "photo_url"
  • "título"
  • "date_taken"
  • "descrição"

Os caminhos principais totalmente resolvidos para uma entrada pré-fabricada em uma lista podem ter esta aparência:

  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/photo_url"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/título"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/date_taken"
  • "f3cb1906-d8b3-489d-9f74-725e5542b55d/descrição"

Mapeador de caminho de chave (IDataKeyPathMapper)

Um Mapeador de Caminho de Chave permite que fontes de dados e consumidores de dados usem namespaces e convenções diferentes para caminhos principais e ainda trabalhem juntos.

Um pré-fabricado para um elemento comumente usado, como uma ardósia para mostrar as informações de contato de uma pessoa, pode conter campos variáveis gerenciados por consumidores de dados. Para tornar isso possível, o identificador usado para qualquer aspeto variável do pré-fabricado precisa de uma maneira de mapear para o identificador para o dado correto na fonte de dados que, em cada uso do pré-fabricado, determinará o conteúdo desse elemento variável. O Key Path Mapper torna isso possível.

O pré-fabricado pode ser usado com diferentes fontes de dados onde os dados são armazenados em uma estrutura organizacional diferente e usa nomes de campo. Para usar um modelo pré-fabricado com cada fonte de dados, um Mapeador de Caminho de Chave pode resolver quaisquer diferenças na forma como os dados são organizados.

Consumidor de dados (IDataConsumer)

Um objeto que sabe como consumir informações que estão sendo gerenciadas por uma fonte de dados e usar esses dados para preencher exibições de dados.

Os consumidores de dados podem se registrar em uma fonte de dados para serem notificados de quaisquer alterações em um item de dados que existe em um caminho de chave especificado em um conjunto de dados. Sempre que os dados especificados tenham sido alterados (ou se suspeite que tenham sido alterados), o(s) Consumidor(es) dos Dados será(ão) notificado(s).

Recolha de Dados do Consumidor

Uma Coleção de Consumidores de Dados tem a capacidade adicional de gerenciar uma lista de itens semelhantes. Essa lista pode ser todo o conjunto de dados gerenciado por uma fonte de dados ou apenas um subconjunto. Normalmente, os dados para cada item na lista contêm tipos semelhantes de informações, mas isso não é um requisito. Fontes de dados e consumidores de dados podem oferecer suporte a listas aninhadas, como uma lista de palavras-chave associadas a cada foto em uma lista de fotos associadas a cada pessoa em uma lista de contatos. O caminho-chave para as palavras-chave seria relativo à foto, e o caminho-chave para as fotos seria relativo à pessoa, e o caminho-chave da pessoa seria relativo à lista pai mais próxima ou à raiz do conjunto de dados.

Ao processar coleções, o caminho de chave resolvido correto para a entrada específica na coleção é atribuído a cada consumidor de dados encontrado no pré-fabricado que é instanciado para cada item de coleção. Isso é usado para resolver completamente o caminho da chave para qualquer dado de exibição relativo (local) dentro desse pré-fabricado.

Placer de item de coleta de dados

Um consumidor de dados de coleta precisa de um meio de preencher as experiências do usuário com listas de elementos visuais repetidos, como o que pode ser encontrado em uma lista rolável de produtos, fotos ou contatos. Isso é feito atribuindo um marcador de item ao consumidor de dados de coleta. Este placer de item é a lógica que sabe como solicitar itens de lista, aceitar pré-fabricados que foram preenchidos com dados variáveis e, em seguida, apresentá-los ao usuário, normalmente inserindo-os em uma lista gerenciada por um componente de layout UX para listas.

Temas

A temática usa todo o encanamento de fontes de dados e consumidores de dados. É possível tematizar qualquer hierarquia de GameObjects, sejam eles estáticos ou dinamicamente ligados a outras fontes de dados. Isso permite que tanto a vinculação de dados quanto a temática sejam aplicadas em combinação. É até possível tematizar os dados provenientes de outra fonte de dados.

Diagrama de blocos e fluxo de dados

Fluxo de dados temáticos MRTK

Tema MRTK

Theming é a capacidade de mudar a estética visual de muitos elementos de UX ao mesmo tempo. Normalmente, todos os dados necessários para especificar um tema são fornecidos por uma única fonte de dados, como um objeto programável. Também é possível que os dados temáticos sejam fornecidos conforme necessário ou divididos em grupos lógicos com base em sua finalidade.

Tema MRTK3

Tema MRTK3 combinado com vinculação de dados

A vinculação de dados e a temática podem coexistir para um único elemento UX. Qualquer elemento UX individual pode ser simultaneamente temático e vinculado a dados. Nesse cenário, o fluxo típico é que o dado proveniente de um DataSource é usado para derivar o keypath de tema correto. Esse caminho de chave é usado para recuperar um objeto da fonte de dados do tema, normalmente um perfil ScriptableObject, mas potencialmente qualquer fonte de dados que possa resolver um caminho de chave.

Para simplificar a configuração de temas e vinculação de dados, é possível criar perfis de vinculação que são processados por um BindingConfigurator no momento da instanciação.

  • Um BindingConfigurator processa um Perfil de Vinculação para determinar os ativos dentro de um pré-fabricado que devem ser temáticos e associa elementos de dados vinculados e elementos temáticos a Keypaths. Em seguida, adiciona apropriado DataConsumers para vincular esses elementos visuais aos seletores de Keypaths corretos que serão usados para fazer referência a dados específicos em um ou mais DataSources, que normalmente são externos ao próprio pré-fabricado.
  • Os dados do tema são fornecidos por um DataSource que contém dados para cada caminho de chave identificado no Perfil de Vinculação.
  • Um ThemeProvider script auxiliar facilita o uso de um ScriptableObject como tema DataSource .
  • O tema UX padrão é fornecido pelo MRTK_UX_ThemeProfile ScriptableObject que está vinculado a um DataSourceReflection no ThemeProvider.

Diagrama de fluxo de Fonte de Dados de Perfil de Tema

Fonte de dados incorporada

Uma fonte de dados incorporada é apropriada em duas situações:

  1. Quando cada instância do pré-fabricado pode ter configurações de tema diferentes e requer sua própria fonte de dados separada.
  2. Quando todas as instâncias desse pré-fabricado são governadas por um perfil de tema persistente comum (por exemplo, ScriptableObject) e podem ser fornecidas por meio da fonte de dados incorporada para que não haja dependências externas a serem estabelecidas.

DataSourceReflection

Isso pode transformar qualquer struct ou classe C# em um DataSource usando reflexão para mapear caminhos de chave para campos, propriedades, classes aninhadas, matrizes, listas ou dicionários. Ele pode ser associado a um Unity ScriptableObject ou a qualquer outra struct ou classe C# onde existam dados de tema. O objeto instanciado que contém os dados pode ser injetado por dependência e alterado em tempo de execução.

  1. Objeto programável: útil para temas estáticos compartilhados em muitos pré-fabricados.
  2. Struct ou classe C# não persistente: útil para modificações dinâmicas em tempo de execução do tema.

DataSourceJson

Se os dados existirem como json texto, isso gerenciará o mapeamento de caminhos de chave para o json DOM. Os ativos binários podem ser recuperados dos Recursos do Unity, StreamingAssets ou até mesmo de uma URL buscada.

DataSourceDictionary

Esta é uma opção simples quando uma lista puramente plana é boa o suficiente para atender à necessidade e para prototipagem rápida. Todos os ativos temáticos são suportados, incluindo texto, ativos Unity (por exemplo, Materiais, Sprites e Imagens), Recursos, StreamingAssets ou até mesmo observáveis externamente por meio de uma URL.

Personalizado

Qualquer fonte de dados personalizada que implemente a interface simples IDataSource ou derive de DataSourceBase ou DataSourceGOBase possa ser usada para atender às necessidades personalizadas.

Temática UXComponents

Os controles UXComponents padrão fornecidos no pacote UXComponents são todos configurados para suportar temas. Ele está desativado por padrão, mas é fácil de ativar.

Cada controle, normalmente no GameObject mais alto do pré-fabricado raiz, tem um script chamado UXBindingConfigurator. Esse script, se habilitado, receberá os scripts de vinculação de dados necessários para ativar o tema. Certifique-se de importar o pacote Data Binding and Theming também.

Nota sobre TextMeshPro StyleSheets: Atualmente, não é possível usar StyleSheets para definir o estilo TextMeshPro Normal . Qualquer outro estilo incluído na folha de estilos padrão do TextMeshPro pode ser usado. Os exemplos usam Body para contornar essa limitação.

DataSourceThemeProvider

O DataSourceThemeProvider MonoBehaviour pode ser usado para facilmente fazer com que um ScriptableObject contendo todas as referências a todos os ativos temáticos funcione como uma fonte de dados. Isso é demonstrado na cena UXThemingExample.

ThemeSelector

O ThemeSelector MonoBehaviour torna possível especificar e trocar facilmente entre vários perfis ScriptableObject. Um exemplo disso seria facilitar a alternância entre um tema "Escuro" e um tema "Claro". Adicione o ScriptableObjects ao Theme Profiles, normalmente em tempo de design. Em seguida, em tempo de execução, altere a Current Theme propriedade para alterar o tema.

Temática do consumidor de dados

A temática é realizada por consumidores de dados, particularmente aqueles que herdam de DataConsumerThemeBase<T>, DataConsumerTextStyle e classes DataConsumer personalizadas que qualquer desenvolvedor pode implementar para aprimorar o suporte a temas.

A classe base DataConsumerThemeBase<T> fornece lógica para usar um inteiro ou dado de chave de uma fonte de dados primária para procurar o valor final desejado de um banco de dados de tema secundário. Isso é feito mapeando os dados de entrada para um keypath de tema e, em seguida, usando esse keypath de tema para recuperar o valor final. Isso permite que qualquer elemento seja vinculado a dados e temático ao mesmo tempo. Como exemplo, imagine um campo de status em um banco de dados com os status de Novo, Iniciado e Concluído representados pelos valores 0, 1 e 2. Cada um deles pode ser representado por um ícone Sprite. Para a vinculação de dados, um valor de 0 a 2 é usado para procurar o sprite desejado. Com a vinculação de temas e dados, o perfil do tema aponta para a lista correta de três sprites no perfil do tema e, em seguida, o valor de 0 a 2 é usado para selecionar o sprite correto dessa lista. Isso permite que o estilo desses ícones seja diferente por tema.

Quando o tema de tempo de execução e a vinculação de dados dinâmicos são usados juntos, uma classe DataConsumerThemeHelper pode ser especificada em qualquer classe derivada de DataConsumerThemeBase para notificar quando um tema for alterado.

A troca de temas em tempo de execução é realizada substituindo os dados na fonte de dados do tema por um novo conjunto de dados disposto na mesma topologia de modelo de objeto de dados. DataSourceReflection pode ser usado com ScriptableObjects onde cada perfil representa um tema. Para todos os controles MRTK Core UX, o perfil do tema é um ScriptableObject chamado MRTK_UXComponents_ThemeProfile. O script auxiliar ThemeProvider.cs facilita o uso deste ou de qualquer perfil ScriptableObject como uma fonte de dados.

O método de aplicação de um tema a dados dinâmicos pode ser detetado automaticamente na maioria dos casos, ou pode ser explicitamente especificado.

Quando o dado é usado para selecionar o item correto da fonte de dados do tema, o processo é:

  • Um dado da fonte de dados primária é usado para selecionar ou construir o keypath de tema correto
  • o keypath do tema é usado para recuperar um valor da fonte de dados do tema especificada no DataConsumerThemeHelper
  • O valor do tema recuperado é analisado para detetar automaticamente o método de recuperação correto
  • o item de dados final do tipo correto (por exemplo, Material, Sprite ou Image) é então recuperado usando o método auto-detectado.

Tipos de Dados

O tipo de dados esperado do dado usado para recuperar o objeto desejado pode ser um dos seguintes:

Tipo de Dados Description
Deteção automática… O dado é analisado e a interpretação correta é automaticamente detetada. Consulte "Auto-detect Data Type" abaixo para obter mais informações.
DirectValue Espera-se que o dado seja do tipo desejado T (por exemplo, Material, Sprite, Imagem) e usado diretamente.
Pesquisa direta Um índice integral ou chave de cadeia de caracteres usada para procurar o valor desejado a partir de uma tabela de pesquisa local.
StaticThemedValue O objeto temático estático do tipo correto é recuperado da fonte de dados do tema no keypath do tema especificado.
ThemeKeypathLookup Um índice integral ou chave de cadeia de caracteres é usado para procurar o caminho de chave de tema desejado.
ThemeKeypathProperty Um nome de propriedade string que será anexado ao keypath base do tema fornecido no Theme.
ResourcePath Um caminho de recurso para recuperar o valor de um recurso Unity (pode começar com "resource://").
FilePath Um caminho de arquivo para recuperar um ativo de streaming Unity (pode começar com "file://").

Deteção automática de tipo de dados

Autodetect analisa os dados recebidos e decide o método de recuperação automaticamente. Na tabela abaixo, T representa o tipo desejado, como Material, Sprite, Imagem. A deteção automática pode ocorrer em dois locais do processo:

  • No próprio valor do dado primário.
  • No valor temático recuperado através do dado primário.
Tipo de Datum Considerações Tem Ajudante de Tema Comportamento
T n/d S/N Usado diretamente sem tema
número inteiro qualquer primitiva integral ou cadeia de caracteres analisável Int32 Não Passado como índice para GetObjectByIndex(n) derivado para recuperar o objeto Nth do tipo T.
número inteiro qualquer primitiva integral ou cadeia de caracteres analisável Int32 Sim Indexe para buscar o caminho de chave do tema Nth da pesquisa local e, em seguida, recupere o objeto temático por meio da deteção automática.
string Formato: "resource://{resourcePath}" S/N resourcePath é usado para recuperar Unity Resource
string Formato: "file://{filePath} S/N filePath é usado para recuperar um ativo de streaming
string Outro Não Passado como chave para GetObjectByKey() derivado para recuperar o objeto correspondente do tipo T.
string Outro Sim Chave para buscar o caminho de chave do tema correspondente da pesquisa local e, em seguida, recuperar o objeto temático por meio da deteção automática.

Um exemplo para recuperar um ícone de status temático de um banco de dados que contém um valor de status numérico:

  1. O caminho de chave para um ícone de status no banco de dados é status.sprite_index.
  2. O valor recuperado para status.sprite_index é 2, o que significa status "cancelado".
  3. A entrada N=2 (em outras palavras, 3ª) na pesquisa DataConsumerSprite é definida como "Status.Icons.Cancelled".
  4. Este é o caminho-chave usado para recuperar um valor da fonte de dados "tema".
  5. O valor para o keypath "Status.Icons.Cancelled" é "resource://Sprites/sprite_cancelled".
  6. A deteção automática determina que ele deve recuperar o ícone por meio de um recurso localizado em "Recursos/Sprites/sprite_cancelled"

Folhas de estilo TextMeshPro

O tema é capaz de ativar as folhas de estilo TMPro. "TMP Settings" ScriptableObject dita onde as folhas de estilo devem estar nos Recursos. É a propriedade "Default Font Asset => Path".

Certifique-se de colocar qualquer Folhas de Estilo específicas do aplicativo no mesmo subcaminho fora de Recursos. Se você deseja organizá-los de forma diferente, certifique-se de atualizar "Configurações TMP" para corresponder.

Tornando os novos controles de UX temáticas

Se você estiver desenvolvendo novos controles UX, é relativamente fácil torná-los tematizados. Na medida em que o controle usa Materiais, Sprites e outros ativos já em uso por outros controles UX, geralmente é uma questão de nomear os vários objetos do jogo de uma maneira detetável.

É possível herdar e MRTK_UXCore_ThemeProfile adicionar mais campos temáticos ou apontar seus controles para seu próprio ScriptableObject. Não há nada de mágico nos fornecidos; a organização do ScriptableObject determinará os caminhos de chave necessários para acessar itens de dados individuais por meio de via C# Reflection.

Ao adicionar um script BindingConfigurator.cs ao nível superior do novo controle, você pode especificar seu próprio BindingProfile ScriptableObject serializado. Isso fornecerá o nome GameObject necessário para mapeamentos KeyPath necessários para associar seus elementos temáticos aos dados fornecidos no perfil do tema. Este script adicionará automaticamente todos os componentes DataConsumerXXX necessários em tempo de execução para suportar o tema que você deseja usar.

Introdução

Requisitos

  • Unity 2020.3 LTS ou posterior
  • TextMeshPro 2.1.4 ou posterior

Exemplos de cenas

Para uma primeira etapa, dê uma olhada nas várias cenas de exemplo de vinculação de dados no pacote MRTK Examples e veja como as várias fontes de dados MonoBehaviours são configuradas. Em geral, os scripts de vinculação de dados só precisam ser colocados no GameObject de nível mais alto de um pré-fabricado ou de um conjunto relacionado de elementos UX.

Além disso, para a maioria dos casos de uso, os valores padrão funcionam "fora da caixa", mas as propriedades expostas fornecem muita flexibilidade para os casos mais avançados.

Nota

Para habilitar o tema para os componentes MRTK UX padrão, o MRTK_UX_DATABINDING_THEMING_ENABLED símbolo deve ser definido nas Configurações do Player. Este símbolo garante zero impacto no desempenho quando a temática não é necessária.

Ativos/DataBinding Exemplo/Cenas/DataBindingExamples.scene

Esta cena que demonstra uma variedade de cenários de dados variáveis. Basta carregar a cena e jogar. Algumas coisas a notar:

  • O campo Entrada de texto dos componentes do TextMeshPro contém variáveis com esta aparência: {{ firstName }}. Esses marcadores são usados diretamente como keypaths locais.

  • Os objetos de jogo para sprites e texto têm algum tipo de componente Data Consumer que gerencia o recebimento de dados e a atualização de visualizações.

  • Um único consumidor de dados pode ser compartilhado por vários componentes do mesmo tipo, sendo colocado mais alto na hierarquia GO.

  • Um consumidor de dados pode encontrar sua própria fonte de dados, desde que esteja no mesmo objeto de jogo ou superior na hierarquia GO.

  • Um objeto de jogo pai tem um componente Fonte de Dados que fornece dados para todos os objetos de jogo filho que apresentam um conjunto relacionado de informações variáveis.

  • Uma coleção Data Consumer especifica um pré-fabricado que contém consumidores de dados que serão usados para preencher esse pré-fabricado com dados variáveis.

Exemplo de tema de ativos/UX/cenas/AudioTheming

Este exemplo usa temas para alternar AudioClips entre um conjunto para Piano e um para Xilofone.

Exemplo de tema de ativos/UX/Cenas/BatteryLevelExample

Este exemplo combina temas e vinculação de dados para mostrar um nível de bateria como um valor numérico e como um ícone. O tema é usado para selecionar entre um tema "carregá-los" e um tema "não carregar". Foi concebido para cumprir os seguintes objetivos:

  • Todos os recursos visuais podem existir em um único ScriptableObject perfil de tema.
  • O número de sprites para estados de "carregamento" pode diferir do número para o estado de "não carregamento".
  • O algoritmo para mapear o nível de bateria relatado para um sprite específico pode ser não-linear e diferir entre os estados "carregar" e "não carregar".
  • Todos os recursos visuais podem existir em um único ScriptableObject perfil de tema.
  • O número de sprites para estados de carregamento pode diferir do número de estados de não carregamento.
  • O algoritmo para mapear relatou o nível da bateria para o qual o sprite pode ser não-linear e diferir entre os estados de carregamento e não carregamento.

Nota

A estrutura desta demonstração não é um bom exemplo de combinação de temas e vinculação de dados. Em um aplicativo de produção para separação adequada de modelo e visualização, o estado real da bateria (nível e carregamento) seria fornecido em uma fonte de dados separada dos localizadores de recursos para os próprios sprites.

Exemplo de tema de ativos/UX/cenas/UXThemingExample

Este exemplo demonstra a alteração do tema de um aplicativo inteiro e também demonstra o uso de um DataSourceGODictionary como fonte de dados para gerenciar uma variedade de conteúdo textual a ser exibido na UX. Em um cenário mais abrangente, os outros tipos de fonte de dados mais flexíveis provavelmente fornecerão a flexibilidade necessária, como DataSourceReflection ou DataSourceGOJson.

Primeiro projeto de vinculação de dados

Aqui está um exemplo simples para ajudá-lo a começar rapidamente:

  1. Crie uma nova cena.
  2. No menu Kit de Ferramentas de Realidade Mista, selecione a opção Adicionar à cena e configurar .
  3. Crie um objeto de jogo vazio e renomeie-o como "Vinculação de dados". Adicione um componente DataSourceJsonTest.
  4. No inspetor, altere a URL para: https://www.boredapi.com/api/activity
  5. Adicione um objeto UI -> Text - TextMeshPro ao objeto do jogo Data Binding. Ele adicionará uma tela e, em seguida, um objeto "Text (TMP)".
  6. Selecione o objeto Text (TMP) e, no Inspetor, altere a Text Input para:

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

  1. Selecione o objeto Canvas e adicione um componente Data Consumer Text a ele.
  2. Execute o projeto. A cada 15 segundos, uma atividade diferente será mostrada.

Parabéns! Você criou seu primeiro projeto de vinculação de dados com MRTK!

Escrevendo uma nova fonte de dados

Uma fonte de dados fornece dados a um ou mais consumidores de dados. Seus dados podem ser qualquer coisa: gerados algoritmicamente, na RAM, em disco ou buscados em um banco de dados central.

Todas as fontes de dados devem fornecer a interface IDataSource. Algumas das funcionalidades básicas são oferecidas em uma classe base chamada DataSourceBase. Você provavelmente deseja derivar dessa classe para adicionar a funcionalidade de gerenciamento de dados específica para sua necessidade.

Para tornar possível soltar uma fonte de dados como um componente em um objeto de jogo, existe outro objeto base chamado DataSourceGOBase onde GO significa GameObject. Este é um MonoBehavior que pode ser deixado em um GameObject como um componente. É um proxy fino projetado para delegar trabalho a uma fonte de dados principal não específica do Unity.

Uma fonte de dados pode expor a capacidade de manipular dados no Unity Editor. Se esse for o caso, a classe derivada pode conter toda a lógica da fonte de dados ou pode aproveitar uma fonte de dados "stock", mas também adicionar campos Inspetor ou outros meios de configurar os dados.

Escrevendo um novo consumidor de dados

Um consumidor de dados recebe notificações quando os dados são alterados e, em seguida, atualiza algum aspeto da experiência do usuário, como o texto mostrado em um componente TextMeshPro.

Todos os consumidores de dados devem fornecer a interface IDataConsumer. Algumas das funcionalidades básicas são oferecidas em uma classe base chamada DataConsumerGOBase, onde GO significa GameObject.

A maior parte do trabalho de um consumidor de dados é aceitar novos dados e, em seguida, prepará-los para apresentação. Isso pode ser tão simples quanto selecionar o pré-fabricado certo, ou pode significar buscar mais dados de um serviço de nuvem, como um sistema de gerenciamento de conteúdo.

Escrevendo um placer de item de coleta de dados

Um placer de item de coleta de dados é responsável por gerenciar quais partes de uma coleção estão visíveis no momento e como apresentar essa coleção visível, seja a coleção uma pequena lista estática ou um banco de dados gigante de milhões de registros.

Todos os placers de item devem fornecer a interface IDataCollectionItemPlacer. Algumas das funcionalidades básicas são oferecidas em uma classe base chamada DataColletionItemPlacerGOBase. Todos os placers de item devem derivar desta classe.

Limitações conhecidas e recursos ausentes

  • Ainda não integrado com os controles baseados em Canvas e listas roláveis do Unity.
  • A integração do .NET INotifyPropertyChanged ainda não está implementada.
  • Exemplo de cena que busca imagens do Flickr e trymrtk.com não funcionam no HoloLens devido a um bug SSL HTTPS em versões posteriores do Unity.
  • Ajuste de desempenho adicional.
  • Esta versão se concentra na apresentação de dados, não na captura de dados. Os controles MRTK UX ainda não estão conectados para definir o estado em um DataSourcearquivo .
  • As alterações dinâmicas nos dados da lista atualizam completamente toda a lista em vez de serem atualizadas incrementalmente.
  • O pipeline de manipulação de dados ainda não foi implementado
  • O preenchimento de todos os componentes de UX em uma ardósia ainda não é totalmente suportado.
  • Os nós DataSourceJson devem implementar IDataNode a interface para serem interoperáveis com DataSourceObjects.