Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Welkom bij het MRTK3-framework voor gegevensbinding en -thema's. Dit framework is ontworpen om het eenvoudig te maken om visuele elementen te maken die tijdens runtime dynamisch kunnen worden ingevuld en bijgewerkt door gegevens die afkomstig zijn van een of meer gegevensbronnen.
Wat is gegevensbinding?
Gegevensbinding is het proces dat een verbinding tot stand brengt tussen de UX van een toepassing (weergave) en de gegevens die worden gepresenteerd (model). Stel dat de binding de juiste instellingen heeft en de gegevens de juiste meldingen bieden; wanneer de waarde van de gegevens wordt gewijzigd, worden wijzigingen automatisch weergegeven in de elementen die aan de gegevens zijn gebonden.
Populaire frameworks voor gegevensbinding:
- Delphi
- Windows Presentation Framework (WPF .NET)
- Windows Forms
- Angular
- Backbond
- JavaFX-bindingen
Windows Presentation Framework-blokdiagram voor gegevensbinding
Zie Overzicht van gegevensbinding - WPF.NET voor meer informatie
MRTK-equivalent blokdiagram
Ontwerpdoelstellingen
- Platformoverschrijdend: overal implementeren
- Ondersteuning voor elke organisatiestructuur en oorsprong van gegevensbronnen
- Eenvoudig te integreren in bestaande of greenfield-codebases
- Designer en ontwikkelaarsvriendelijk
- Kan op elk moment tijdens de levenscyclus van de toepassing worden ingeschakeld/uitgeschakeld
- Ondersteuning voor zakelijke scenario's in de praktijk: back-end-DB's, complexe UX-prefabsjablonen
- Eenvoudig toe te passen op bestaande niet-MRTK UX-onderdelen en nieuwe visuele elementen
- Elk gegevenstype binden, inclusief sprites, afbeeldingen, materialen, animaties en audioclips
- Eenvoudig om mogelijkheden te verbeteren zonder de bestaande codebasis aan te raken
- Efficiënt gebruik van CPU, RAM, GC en frame-time
- Eenvoudig integreren met een groot aantal lokale of back-endgegevensbronnen
- Elke gelijktijdige combinatie van ingesloten, runtimestatus en back-endgegevensbronnen
- Verzamelingen van elke grootte efficiënt verwerken voor een lijstpresentatie
- Gecombineerde thema's en gegevensbinding voor themabare dynamische gegevenselementen
- Variabele gegevens op een open manier valideren en bewerken voordat u deze presenteert
- Minimale afhankelijkheden van andere MRTK-functionaliteit
- Compatibel met MRTK v2 en MRTK3
- Eenvoudig te white labelen en/of huisstijl toepassen op voorraadassets met minimale inspanning
Belangrijkste functies
- Open-ended gegevensbronnen ondersteunen elke persistente, externe of RAM-gegevensstrategie.
- Gebruikers van open-eindegegevens ondersteunen UX-bindingen en thema's.
- Automatische detectie tussen gegevensbronnen en consumenten vereenvoudigt het koppelen.
- Optionele automatische configuratie vanuit een bindingsprofiel
- Losgekoppeld gegevensmodel en weergave ondersteunen MVC- en MVVM-patronen.
- Gevirtualiseerde verzamelingen met navigatie via paging en scrollen.
- Voorspellende prefetch van verzamelingsitems voor soepele lijstnavigatie.
- Verzamelingsobjecten kunnen worden gegroepeerd en opnieuw worden gebruikt om GC te verminderen.
- Kan verschillen in gegevens toewijzen en keypath-naamruimten weergeven.
Huidige functionaliteit
1. Variabele gegevens visualiseren via gegevensgebruikers
Momenteel ondersteund:
- TextMeshPro en TextMesh text
- Opmaakmodellen voor tekst (voor thema's en toegankelijkheid)
- Sprite-patroon
- Booleaanse trigger
- Quad-textuur
- Lettertypepictogrammen
- Verzamelingen: lijsten met willekeurige grootten die prefabs bevatten die zijn gevuld met variabele gegevens
- Elke andere consument die de IDataConsumer-interface ondersteunt (rechtstreeks of via afleidingen van basisklassen)
2. Geef variabele gegevens op met behulp van verschillende gegevensbronnen:
- JSON-tekst (rechtstreeks of via URL ophalen)
- Woordenlijst met variabele gegevenselementen
- Object - Gestructureerde gegevens op basis van knooppunten
- Weerspiegeling van een C#-object
- Programmatisch gewijzigde gegevens
- Elke andere methode die ondersteuning biedt voor de IDataSource-interface
3. Placer voor lijstitem om de visuele manifestatie van een lijst te beheren
4. Paging, scrolling en virtualisatie weergeven
- Gegevens worden alleen opgehaald wanneer ze zichtbaar zijn of in verwerking zijn
- Ondersteunt willekeurig grote back-endgegevenssets
- Ophalen is taakverdeling over meerdere frames
5. Prefab-pooling weergeven
- Prefabs worden hergebruikt en opnieuw ingevuld om de GC- en instantiatietijd te verkorten.
6. Thema's dynamisch toepassen op elementen tijdens runtime
Functionaliteit in de roadmap
Naast wat er al beschikbaar is, zijn de belangrijkste prioriteiten voor meer mogelijkheden:
1. Pijplijnen voor gegevensmanipulator
- Conversie tussen waarden aan gegevenszijde en weergavezijde
- Lokalisatie (naadloze integratie met Unity-lokalisatie)
- Opmaak
- Validatie
2. Voorspellende lijstitem prefetch voor sneller/soepeler schuiven/pagieren
3. Meer gegevensgebruikers
- Een openbare eigenschap instellen voor een onderdeel
- In-/uit-status van selectievakje instellen
- Schuifregelaarwaarde instellen
- Een keuzerondje instellen in een groep
- Afzonderlijke materiaaleigenschappen, zoals kleur instellen
4. Thema's
- Thema's bekijken die in de editor zijn toegepast, zelfs wanneer de toepassing niet wordt uitgevoerd
- Prefabs bijwerken om een toegepast thema weer te geven, zodat dit het standaardthema wordt
- Overname van thema/stijl
Terminologie
- Gegevensbron : elke provider van gegevens, of het nu gaat om runtimestatus, lokaal behouden of opgehaald van een server.
- Gegevensbronprovider : een eenvoudige MonoBehaviour die toegang biedt tot een gegevensbron die mogelijk niet wordt weergegeven in de Unity-scènegrafiek.
- Gegevensbrontype : een unieke naam die is toegewezen aan gegevensbron, zodat gegevensgebruikers hun gewenste gegevensbron(en) kunnen opgeven op naam.
- Data Consumer : elke gebruiker van gegevens die wil reageren op gegevenswijzigingen, meestal een visueel element, maar niet vereist. Het doel ervan kan bijvoorbeeld zijn om acties te activeren op basis van wijzigingen in de gegevenswaarde.
- Gegevenscontroller : een mechanisme voor het aanroepen van een actie met de momenteel gekoppelde gegevensgebonden waarde als parameter.
- Keypath : een gegevenskiezer die verwijst naar een specifiek object in een gegevensbron. Zoals momenteel geïmplementeerd, wordt de indeling keypath gemodelleerd naar JSON-gegevenstoegangsors voor het ontcijferen van geneste combinaties van kaarten, lijsten en atomische elementen.
- Lokaal sleutelpad : een sleutelpad aan de zijde van de gegevensverbruiker dat permanent kan worden ingesloten in een herbruikbare prefab. Door verzamelingsentiteiten en Keypath Mappers om te zetten, worden automatisch geconverteerd naar een volledig opgelost sleutelpad voor een specifiek item in een verzameling. Wanneer deze niet zijn gekoppeld aan een verzameling, kunnen deze rechtstreeks worden toegewezen aan een datum in de gegevensbron of via een Keypath Mapper.
Volledig opgelost sleutelpad : een volledig, absoluut sleutelpad dat wordt toegewezen aan één specifiek object in een gegevensbron. Voor items in een verzameling is een combinatie van het volledig opgeloste sleutelpad voor één verzamelingsentiteit en een relatief (lokaal) sleutelpad voor één gegevenselement van die verzamelingsentiteit.
Keypath Mapper - Optionele naamruimtetoewijzing tussen lokale sleutelpaden en veldnamen van gegevensbron (bijvoorbeeld 'koppeling' <-> 'URL').
Thema : een gegevensbron die een reeks verschillende assets en stijlen biedt die nodig zijn om een specifieke visuele esthetiek te bereiken.
Item Placer : een DataConsumerCollection-companion die verantwoordelijk is voor het plaatsen van zichtbare items in een scène.
Data Object Pool - Geïnstantieerde, stand-by prefabs die klaar zijn om te vullen met gegevens voor lijstnavigatie met lage GC.
Lijstvirtualisatie : de mogelijkheid om lijsten van willekeurige grote grootte in te vullen, te presenteren en te navigeren.
Predictive Prefetch : gegevens prefetching en het vullen van prefabs voor verzamelingen voor items die binnenkort kunnen worden weergegeven door te schuiven/pageren.
- Predictive Prefetch : prefetching van gegevens en het invullen van verzamelingsprefabs voor items die binnenkort kunnen worden weergegeven via schuiven/pageren.
Sleutelbegrippen
Gegevensbron
Een gegevensbron is een beheerde set gegevens van willekeurig type(en) en complexiteit die kan worden gebruikt om gegevensweergaven te vullen via gegevensgebruikers. De gegevens die door een gegevensbron worden beheerd, kunnen statisch of dynamisch zijn. Alle wijzigingen in gegevensitems worden gerapporteerd aan gegevensgebruikers die zich hebben geregistreerd om wijzigingsmeldingen te ontvangen.
Gegevensbronprovider
Een eenvoudige interface met één methode voor het ophalen van een gegevensbron is ontworpen om een MonoBehavior-scriptonderdeel automatisch te kunnen opsporen in de gameobjecthiërarchie door onderdelen van gegevensconsumer. Het is niet nodig om een gegevensbron rechtstreeks op het gameobject zelf te implementeren. Dit is handig wanneer een bestaande MonoBehaviour moet zijn afgeleid van een andere klasse en meerdere overnames voorkomen dat deze afkomstig zijn van DataSourceGOBase. Het staat ook toe dat meer code geen Unity-afhankelijkheden heeft.
Singleton van gegevensbronprovider
Met DataSourceProviderSingleton MonoBehaviour kunt u een gegevensbron opgeven die automatisch kan worden gedetecteerd, zelfs als deze zich niet in dezelfde GameObject-hiërarchie bevindt als de DataConsumers die ernaar willen luisteren. Plaats de DataSourceProviderSingletonergens in de scène en vul de Data Sources eigenschap in met gegevensbronnen die zijn gedetecteerd door gegevensgebruikers. Als alternatief kunnen gegevensgebruikers hun ouders begeleiden om een geschikte gegevensbron te vinden, wat betekent dat u een gegevensbron kunt plaatsen die de gewenste gegevens levert overal in de bovenliggende keten van die gegevensgebruikers.
Sleutelpad (tekenreeks)
Een belangrijk pad is het mechanisme om informatie in een gegevensbron op unieke wijze te identificeren.
Hoewel een sleutelpad elke unieke id per gegevensitem kan zijn, gebruiken huidige implementaties een logische door de gebruiker leesbare aanduiding die de navigatiepositie aangeeft van de gegevens die van belang zijn ten opzichte van de hele gestructureerde gegevensset. Het is gemodelleerd naar het javascript-concept van lijsten, woordenlijsten en primitieven. Sleutelpaden zijn syntactisch correcte JavaScript-instructies voor toegang tot gegevens die kunnen worden weergegeven in JSON. Het voordeel van deze benadering is dat deze goed correleert met zowel JSON als XML. Dit zijn de twee meest voorkomende manieren om informatie van back-endservices over te dragen.
Voorbeeld van sleutelpaden:
- Temperatuur
- contacts[10].firstName
- Contactpersonen
- contacts[10].addresses[3].city
- [10].titel
- kingdom.animal.mammal.aardvark.diet.foodtypes.termites
Aangezien een sleutelpad een willekeurige tekenreeks zonder vereiste taxonomie is, kunnen de werkelijke gegevensaanduidingen elke methode zijn om te beschrijven welke gegevens moeten worden opgehaald. XPath van XML is een voorbeeld van een levensvatbaar sleutelpadschema dat werkt met gegevensbronnen. Zolang sleutelpaden die door de gegevensgebruiker worden geleverd, consistent zijn met de sleutelpaden die door de gegevensbron worden verwacht, werkt alles. Bovendien kunnen key path mappers worden geïmplementeerd om te vertalen tussen verschillende schema's.
Een sleutelpad oplossen
Als u een sleutelpad wilt omzetten, moet u twee sleutelpaden combineren:
- Een absoluut sleutelpad dat beschrijft hoe u toegang krijgt tot een specifieke subset van een grotere gegevensset, zoals één vermelding in een lijst met veel vermeldingen.
- Een gedeeltelijk (relatief) sleutelpad dat een specifieke datum in die lijst of kaartvermelding vertegenwoordigt.
Dit maakt het mogelijk om een subset van de gegevens zo te behandelen dat het niet uitmaakt waar deze zich in een grotere gegevenssethiërarchie bevindt. Het meest kritieke gebruik van deze mogelijkheid is om de gegevens van één vermelding in een lijst te beschrijven zonder dat u zich zorgen hoeft te maken over de vermelding in die lijst waarnaar het huidige exemplaar verwijst.
Omdat een 'volledig opgelost' sleutelpad wordt gegenereerd en verbruikt door een datasource en zelden wordt gewijzigd door een DataConsumer of een ander extern onderdeel, kan het elke structuur hebben die zinvol is voor de gegevensbron. Als er bijvoorbeeld een prefab is om een lijstvermelding weer te geven voor een foto en de bijbehorende titel, datum en andere kenmerken, kan het pad naar de lokale sleutel in de prefab er als volgt uitzien:
- "photo_url"
- "titel"
- "date_taken"
- "beschrijving"
De volledig opgeloste sleutelpaden voor één prefab-vermelding in een lijst kunnen er als volgt uitzien:
- "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"
Sleutelpadtoewijzing (IDataKeyPathMapper)
Met een sleutelpadtoewijzing kunnen gegevensbronnen en gegevensgebruikers verschillende naamruimten en conventies voor belangrijke paden gebruiken en toch samenwerken.
Een prefab voor een veelgebruikt element, zoals een leisteen om de contactgegevens van een persoon weer te geven, kan variabele velden bevatten die worden beheerd door gegevensgebruikers. Om te gebruiken, moet de id die wordt gebruikt voor een variabel aspect van de prefab een manier nodig om toe te wijzen aan de id voor de juiste datum in de gegevensbron die, bij elk gebruik van de prefab, de inhoud van dat variabele element bepaalt. De Mapper sleutelpad maakt dit mogelijk.
De prefab kan worden gebruikt met verschillende gegevensbronnen, waarbij de gegevens worden opgeslagen in een andere organisatiestructuur en veldnamen gebruiken. Als u een sjabloonprefab wilt gebruiken voor elke gegevensbron, kan een sleutelpadtoewijzing eventuele verschillen in de indeling van de gegevens oplossen.
Gegevensconsumer (IDataConsumer)
Een object dat weet hoe informatie moet worden gebruikt die wordt beheerd door een gegevensbron en die gegevens gebruikt om gegevensweergaven te vullen.
Gegevensgebruikers kunnen zich registreren bij een gegevensbron om op de hoogte te worden gesteld van wijzigingen in een gegevensitem dat bestaat op een opgegeven sleutelpad in een gegevensset. Wanneer de opgegeven gegevens veranderen (of worden verdacht van wijziging), worden de gegevensconsumer(s) op de hoogte gesteld.
Gegevens verzamelen door consumenten
Een Data Consumer Collection heeft de extra mogelijkheid om een lijst met vergelijkbare items te beheren. Deze lijst kan de volledige gegevensset zijn die wordt beheerd door een gegevensbron of alleen een subset. Normaal gesproken bevatten de gegevens voor elk item in de lijst vergelijkbare typen informatie, maar dit is geen vereiste. Gegevensbronnen en gegevensgebruikers kunnen geneste lijsten ondersteunen, zoals een lijst met trefwoorden die aan elke foto zijn gekoppeld in een lijst met foto's die zijn gekoppeld aan elke persoon in een lijst met contactpersonen. Het sleutelpad voor de trefwoorden zou relatief zijn ten opzichte van de foto en het sleutelpad voor de foto's zou relatief zijn ten opzichte van de persoon en het sleutelpad van de persoon zou relatief zijn ten opzichte van de dichtstbijzijnde bovenliggende lijst of de hoofdmap van de gegevensset.
Bij het verwerken van verzamelingen wordt het juiste opgeloste sleutelpad voor de specifieke vermelding in de verzameling toegewezen aan elke gegevensgebruiker in de prefab die voor elk verzamelingsitem wordt geïnstantieerd. Het wordt gebruikt om het sleutelpad voor alle relatieve (lokale) weergavegegevens in die prefab volledig op te lossen.
Placer voor item voor gegevensverzameling
Een gebruiker van gegevensverzameling heeft een middel nodig om gebruikerservaringen te vullen met lijsten met herhalende visuele elementen, zoals wat kan worden gevonden in een schuifbare lijst met producten, foto's of contactpersonen. Dit wordt bereikt door een item-placer toe te wijzen aan de gebruiker van de gegevensverzameling. Deze itemplaatser is de logica die weet hoe u lijstitems aanvraagt, prefabs accepteert die zijn gevuld met variabele gegevens en deze vervolgens aan de gebruiker presenteert, meestal door ze in te voegen in een lijst die wordt beheerd door een UX-indelingsonderdeel voor lijsten.
Thema 's
Thema's maken gebruik van alle sanitair van gegevensbronnen en gegevensgebruikers. Het is mogelijk om elke hiërarchie van GameObjects te thema's, ongeacht of ze statisch zijn of dynamisch zijn gebonden aan andere gegevensbronnen. Het resultaat maakt het mogelijk om gegevensbinding en thema's in combinatie toe te passen. Het is zelfs mogelijk om de gegevens die afkomstig zijn van een andere gegevensbron te thema's.
Diagram en gegevensstroom blokkeren
MRTK-thema's
Thema's zijn de mogelijkheid om de visuele esthetiek van veel UX-elementen tegelijk te wijzigen. Normaal gesproken worden alle gegevens die nodig zijn om een thema op te geven, geleverd door één gegevensbron, zoals een scriptbaar object. Het is ook mogelijk om themagegevens zo nodig te verstrekken of te verdelen in logische groepen op basis van het doel ervan.
MRTK3-thema's gecombineerd met gegevensbinding
Gegevensbinding en thema's kunnen naast elkaar bestaan voor één UX-element. Elk afzonderlijk UX-element kan tegelijkertijd worden gethemateerd en aan gegevens worden gebonden. In dit scenario is de typische stroom dat de datum die afkomstig is van een gegevensbron wordt gebruikt om het juiste themasleutelpad af te leiden. Dit sleutelpad wordt vervolgens gebruikt om een object op te halen uit het thema Gegevensbron, meestal een ScriptableObject-profiel, maar mogelijk een gegevensbron die een sleutelpad kan oplossen.
Om de configuratie van thema's en gegevensbinding te vereenvoudigen, is het mogelijk om bindingsprofielen te maken die tijdens de instantiatie door een BindingConfigurator worden verwerkt.
- Een
BindingConfiguratorverwerkt een bindingsprofiel om de assets binnen een prefab te bepalen die moeten worden gethemateerd en koppelt zowel gebonden gegevenselementen als thema-elementen aan Keypaths. Vervolgens wordt het juiste toegevoegdDataConsumersom deze visuele elementen te binden aan de juiste Keypaths-selectors die worden gebruikt om te verwijzen naar specifieke gegevens in een of meerDataSources, die meestal buiten de prefab zelf staan. - Themagegevens worden geleverd door een
DataSourcedie gegevens bevat voor elk keypath dat is geïdentificeerd in het bindingsprofiel. - Met
ThemeProvidereen helperscript kunt u eenvoudig een ScriptableObject als themaDataSourcegebruiken. - Het standaard UX-thema wordt geleverd door het
MRTK_UX_ThemeProfileScriptableObject dat is gebonden aan eenDataSourceReflectionin deThemeProvider.
Ingesloten gegevensbron
Een ingesloten gegevensbron is geschikt in twee situaties:
- Wanneer elk exemplaar van de prefab verschillende thema-instellingen kan hebben en een eigen afzonderlijke gegevensbron vereist.
- Wanneer alle exemplaren van deze prefab worden beheerd door één gemeenschappelijk persistent themaprofiel (bijvoorbeeld ScriptableObject) en kunnen worden opgegeven via de ingesloten gegevensbron, zodat er geen externe afhankelijkheden tot stand moeten worden gebracht.
DataSourceReflection
Dit kan elke C#-struct of -klasse veranderen in een DataSource door reflectie te gebruiken om sleutelpaden toe te wijzen aan velden, eigenschappen, geneste klassen, matrices, lijsten of woordenlijsten. Het kan worden gekoppeld aan een Unity ScriptableObject of een andere C#-struct of -klasse waar themagegevens aanwezig zijn. Het geïnstantieerde object dat de gegevens bevat, kan tijdens runtime worden geïnjecteerd en gewijzigd.
- Scriptbaar object: handig voor statische thema's die in veel prefabs worden gedeeld.
- Niet-gepersisteerde C#-struct of -klasse: handig voor dynamische runtime-wijzigingen van het thema.
DataSourceJson
Als de gegevens bestaan als json tekst, worden deze beheerd door sleutelpaden toe te kennen aan de json DOM. Binaire assets kunnen worden opgehaald uit Resources van Unity, StreamingAssets of zelfs een opgehaalde URL.
DataSourceDictionary
Dit is een eenvoudige optie wanneer een volledig platte lijst goed genoeg is om te voldoen aan de behoefte en voor snelle prototypen. Alle themaassets worden ondersteund, waaronder tekst, Unity-assets (bijvoorbeeld Materialen, Sprites en Afbeeldingen), Resources, StreamingAssets of zelfs extern kunnen worden opgehaald via een URL.
Aangepast
Elke aangepaste gegevensbron die de eenvoudige IDataSource interface implementeert of die is afgeleid van DataSourceBase of DataSourceGOBase kan worden gebruikt om te voldoen aan aangepaste behoeften.
Thema UXComponents
De standaard UXComponents-besturingselementen in het UXComponents-pakket zijn allemaal geconfigureerd om thema's te ondersteunen. Deze is standaard UITGESCHAKELD, maar is eenvoudig in te schakelen.
Elk besturingselement, meestal op het bovenste GameObject van de basisprefab, heeft een script met de naam UXBindingConfigurator. Als dit script is ingeschakeld, worden de benodigde scripts voor gegevensbinding opgehaald om thema's in te schakelen. Zorg ervoor dat u ook het pakket Gegevensbinding en Thema importeert.
Opmerking over TextMeshPro StyleSheets: Het is momenteel niet mogelijk om StyleSheets te gebruiken om de stijl TextMeshPro Normal op te maken. Elke andere stijl in het standaardstijlmodel van TextMeshPro kan worden gebruikt. In de voorbeelden wordt hoofdtekst gebruikt om deze beperking te omzeilen.
DataSourceThemeProvider
De DataSourceThemeProvider MonoBehaviour kan worden gebruikt om eenvoudig een ScriptableObject te maken met alle verwijzingen naar alle themaassets als een gegevensbron. Dit wordt gedemonstreerd in de UXThemingExample-scène.
ThemeSelector
De ThemeSelector MonoBehaviour maakt het mogelijk om meerdere ScriptableObject-profielen op te geven en eenvoudig te wisselen. Een voorbeeld hiervan is om het eenvoudig te maken om te schakelen tussen een 'Donker' en een 'Licht'-thema. Voeg de ScriptableObjects toe aan de , meestal tijdens het Theme Profilesontwerp. Wijzig vervolgens tijdens runtime de Current Theme eigenschap om het thema te wijzigen.
Data Consumer-thema's
Thema's worden uitgevoerd door gegevensconsumenten, met name die van DataConsumerThemeBase<T>, DataConsumerTextStyle en aangepaste DataConsumer-klassen die elke ontwikkelaar kan implementeren om de ondersteuning voor thema's te verbeteren.
De T-basisklasse DataConsumerThemeBase<biedt> logica voor het gebruik van een geheel getal of sleuteldatum uit een primaire gegevensbron om de gewenste eindwaarde uit een secundaire themadatabase op te zoeken. Dit wordt bereikt door de invoergegevens toe te kennen aan een themasleutelpad en vervolgens dat themasleutelpad te gebruiken om de uiteindelijke waarde op te halen. Hierdoor kan elk element tegelijkertijd zowel gegevensgebonden als thema's hebben. Stel bijvoorbeeld een statusveld in een database voor met de statussen Nieuw, Gestart en Gereed, vertegenwoordigd door de waarden 0, 1 en 2, waarbij elk veld wordt vertegenwoordigd door een Sprite-pictogram. Voor gegevensbinding wordt een waarde van 0 tot 2 gebruikt om de gewenste sprite op te zoeken. Met thema- en gegevensbinding verwijst het themaprofiel naar de juiste lijst met drie sprites in het themaprofiel en wordt vervolgens de waarde van 0 tot 2 gebruikt om de juiste sprite uit die lijst te selecteren. Hierdoor kan de stijl van deze pictogrammen per thema verschillen.
Wanneer zowel runtimethema's als dynamische gegevensbinding samen worden gebruikt, kan een DataConsumerThemeHelper-klasse worden opgegeven in elke dataconsumerThemeBase-afgeleide klasse om te melden wanneer een thema verandert.
Het wisselen van thema's tijdens runtime wordt bereikt door de gegevens in de themagegevensbron te vervangen door een nieuwe gegevensset die is ingedeeld in dezelfde topologie van het gegevensobjectmodel. DataSourceReflection kan worden gebruikt met ScriptableObjects waarbij elk profiel een thema vertegenwoordigt. Voor alle MRTK Core UX-besturingselementen is het themaprofiel een ScriptableObject met de naam MRTK_UXComponents_ThemeProfile. Het ThemeProvider.cs helperscript maakt het eenvoudig om dit of een ScriptableObject-profiel te gebruiken als een gegevensbron.
De methode voor het toepassen van een thema op dynamische gegevens kan in de meeste gevallen automatisch worden gedetecteerd of kan expliciet worden opgegeven.
Wanneer de datum wordt gebruikt om het juiste item uit de themagegevensbron te selecteren, is het proces:
- een datum uit de primaire gegevensbron wordt gebruikt om het juiste themasleutelpad te selecteren of samen te stellen
- het themasleutelpad wordt gebruikt om een waarde op te halen uit de themagegevensbron die is opgegeven op de DataConsumerThemeHelper
- de opgehaalde themawaarde wordt geanalyseerd om automatisch de juiste ophaalmethode te detecteren
- het laatste gegevensitem van het juiste type (bijvoorbeeld Materiaal, Sprite of Afbeelding) wordt vervolgens opgehaald met behulp van de methode automatisch gedetecteerd.
Gegevenstypen
Het verwachte gegevenstype van de datum die wordt gebruikt om het gewenste object op te halen, kan een van de volgende zijn:
| Gegevenstype | Beschrijving |
|---|---|
| Automatisch detecteren | De datum wordt geanalyseerd en de juiste interpretatie wordt automatisch gedetecteerd. Zie 'Gegevenstype automatisch detecteren' voor meer informatie. |
| DirectValue | De datum is naar verwachting van het gewenste type T (bijvoorbeeld Materiaal, Sprite, Afbeelding) en wordt rechtstreeks gebruikt. |
| DirectLookup | Een integrale index of tekenreekssleutel die wordt gebruikt om de gewenste waarde op te zoeken in een lokale opzoektabel. |
| StaticThemedValue | Statisch themaobject van het juiste type wordt opgehaald uit de themagegevensbron op het opgegeven themasleutelpad. |
| ThemeKeypathLookup | Een integrale index of tekenreekssleutel wordt gebruikt om het gewenste themasleutelpad op te zoeken. |
| ThemeKeypathProperty | Een tekenreekseigenschapsnaam die is toegevoegd aan het basissleutelpad van het thema dat is opgegeven in het thema. |
| ResourcePath | Een resourcepad voor het ophalen van de waarde uit een Unity-resource (kan beginnen met 'resource://'). |
| Filepath | Een bestandspad voor het ophalen van een Streaming-asset van Unity (kan beginnen met 'file://'). |
Gegevenstype automatisch detecteren
Automatisch detecteren analyseert de ontvangen gegevens en bepaalt automatisch de ophaalmethode. In de tabel vertegenwoordigt T het gewenste type, zoals Materiaal, Sprite, Afbeelding. Automatische detectie kan op twee plaatsen in het proces plaatsvinden:
- Op de primaire datumwaarde zelf.
- Op de themawaarde die is opgehaald via de primaire datum.
| Datumtype | Overwegingen | Heeft ThemaHelper | Gedrag |
|---|---|---|---|
| T | n.v.t. | Y/N | Rechtstreeks zonder thema's worden gebruikt |
| int | een integrale primitieve of Int32-tekenreeks | Nee | Als index doorgegeven aan afgeleide GetObjectByIndex(n) om Nth-object van het type T op te halen. |
| int | een integrale primitieve of Int32-tekenreeks | Ja | Indexeer om het Nth-themasleutelpad op te halen uit de lokale zoekactie en vervolgens het themaobject op te halen via automatische detectie. |
| tekenreeks | Indeling: "resource://{resourcePath}" | Y/N | resourcePath wordt gebruikt om Unity-resource op te halen |
| reeks | Indeling: "file://{filePath} | Y/N | filePath wordt gebruikt om een streaming-asset op te halen |
| tekenreeks | Overige | Nee | Doorgegeven als sleutel aan afgeleide GetObjectByKey() om overeenkomend object van het type T op te halen. |
| tekenreeks | Overige | Ja | Sleutel om het overeenkomende themasleutelpad op te halen uit de lokale zoekopdracht en vervolgens het themaobject op te halen via automatische detectie. |
Een voorbeeld van het ophalen van een themastatuspictogram uit een database met een numerieke statuswaarde:
- Het sleutelpad voor een statuspictogram in de database is status.sprite_index.
- De opgehaalde waarde voor status.sprite_index is 2, wat de status 'geannuleerd' betekent.
- De vermelding N=2 (met andere woorden, derde) in de zoekopdracht DataConsumerSprite is ingesteld op 'Status.Icons.Cancelled'.
- Het sleutelpad dat wordt gebruikt om een waarde op te halen uit de gegevensbron 'thema'.
- De waarde voor het sleutelpad 'Status.Icons.Cancelled' is 'resource://Sprites/sprite_cancelled'.
- Automatisch detecteren bepaalt dat het pictogram moet worden opgehaald via een resource op 'Resources/Sprites/sprite_cancelled'
TextMeshPro StyleSheets
Met thema's kunt u TMPro-opmaakmodellen activeren. 'TMP-instellingen' ScriptableObject bepaalt waar opmaakmodellen worden verwacht in de resources. Dit is de eigenschap Default Font Asset => Path.
Zorg ervoor dat u app-specifieke StyleSheets in hetzelfde subpad van Resources plaatst. Als u ze anders wilt organiseren, moet u 'TMP-instellingen' bijwerken zodat deze overeenkomen.
Nieuwe UX-besturingselementen themabaar maken
Als u nieuwe UX-besturingselementen ontwikkelt, kunt u deze relatief eenvoudig thema's maken. Voor zover het besturingselement gebruikmaakt van Materialen, Sprites en andere assets die al worden gebruikt door andere UX-besturingselementen, is het over het algemeen een kwestie van het benoemen van de verschillende gameobjecten op een detecteerbare manier.
Het is mogelijk om meer themavelden over te nemen MRTK_UXCore_ThemeProfile en toe te voegen, of uw besturingselementen te verwijzen naar uw eigen ScriptableObject. Er is niets magisch aan degenen die worden verstrekt; de organisatie van het ScriptableObject bepaalt de sleutelpaden die nodig zijn voor toegang tot afzonderlijke gegevensitems via C# Reflection.
Door een BindingConfigurator.cs-script toe te voegen aan het hoogste niveau van het nieuwe besturingselement, kunt u vervolgens uw eigen geserialiseerde BindingProfile ScriptableObject opgeven. Dit biedt de benodigde GameObject-naam voor KeyPath-toewijzingen die nodig zijn om uw thema-elementen te koppelen aan de gegevens in het themaprofiel. Met dit script worden alle benodigde DataConsumerXXX-onderdelen tijdens runtime automatisch toegevoegd ter ondersteuning van de thema's die u wilt gebruiken.
Aan de slag
Vereisten
- Unity 2020.3 LTS of hoger
- TextMeshPro 2.1.4 of hoger
Voorbeeldscènes
Als eerste stap bekijkt u de verschillende voorbeeldscènes voor gegevensbindingen in het PAKKET MRTK-voorbeelden en bekijkt u hoe de verschillende gegevensbronnen MonoBehaviours zijn geconfigureerd. In het algemeen hoeven scripts voor gegevensbinding alleen op het hoogste niveau GameObject van een prefab of een gerelateerde set UX-elementen te worden geplaatst.
Voor de meeste use cases werken de standaardwaarden ook 'out of the box', maar bieden de blootgestelde eigenschappen flexibiliteit voor de meer geavanceerde cases.
Opmerking
Als u thema's wilt inschakelen voor de standaard MRTK UX-onderdelen, moet het MRTK_UX_DATABINDING_THEMING_ENABLED symbool worden gedefinieerd in Spelerinstellingen. Dit symbool zorgt ervoor dat er geen invloed is op de prestaties wanneer thema's niet nodig zijn.
Assets/DataBinding Example/Scenes/DataBindingExamples.scene
Deze scène toont verschillende scenario's met variabele gegevens. Laad de scène en speel af. Een paar dingen om op te merken:
Het veld Tekstinvoer van TextMeshPro-onderdelen bevat variabelen die er als volgt uitzien: {{ firstName }}. Deze markeringen worden rechtstreeks gebruikt als lokale sleutelpaden.
Gameobjecten voor sprites en tekst hebben een soort data consumer-onderdeel waarmee het ontvangen van gegevens en het bijwerken van weergaven wordt beheerd.
Eén gegevensgebruiker kan worden gedeeld door meerdere onderdelen van hetzelfde type door hoger te worden geplaatst in de GO-hiërarchie.
Een gegevensgebruiker kan een eigen gegevensbron vinden zolang deze zich op hetzelfde gameobject of hoger in de GO-hiërarchie bevindt.
Een bovenliggend gameobject heeft een gegevensbrononderdeel dat gegevens levert voor alle onderliggende gameobjecten die een gerelateerde set variabele informatie bevatten.
Een gegevensconsumer voor verzamelingen geeft een prefab op, die zelf gegevensgebruikers bevat die worden gebruikt om die prefab te vullen met variabele gegevens.
Assets/UX-themavoorbeeld/scènes/audiotheming
In dit voorbeeld wordt gebruikgemaakt van thema's om audioclips te schakelen tussen een set voor Piano en een set voor Xylofoon.
Assets/UX-themavoorbeeld/scènes/BatteryLevelExample
In dit voorbeeld worden thema's en gegevensbinding gecombineerd om een batterijniveau weer te geven als numerieke waarde en als pictogram. Thema's worden gebruikt om te kiezen tussen een 'ze opladen' en een 'niet opladen'-thema. Het is ontworpen om te voldoen aan de volgende doelstellingen:
- Alle visuele assets kunnen bestaan in één
ScriptableObjectthemaprofiel. - Het aantal sprites voor 'oplaadstatussen' kan verschillen van het aantal voor de status 'niet opladen'.
- Het algoritme voor het toewijzen van het gerapporteerde batterijniveau aan een bepaalde sprite kan niet-lineair zijn en verschillen tussen de status 'opladen' en 'niet opladen'.
- Alle visuele assets kunnen bestaan in één
ScriptableObjectthemaprofiel. - Het aantal sprites voor laadstatussen kan verschillen van het aantal voor het niet opladen van de status.
- Het algoritme voor toewijzing heeft gerapporteerd dat het batterijniveau waarop sprite niet-lineair kan zijn en kan verschillen tussen laadstatussen en niet-oplaadstatussen.
Opmerking
De structuur van deze demo is geen goed voorbeeld van het combineren van thema's en gegevensbinding. In een productietoepassing voor een juiste scheiding van model en weergave zou de werkelijke batterijstatus (niveau en opladen) worden opgegeven in een afzonderlijke gegevensbron dan de resourcezoekers voor de sprites zelf.
Assets/UX-themavoorbeeld/scènes/UXThemingExample
In dit voorbeeld wordt het wijzigen van het thema van een hele toepassing gedemonstreerd en ook het gebruik van een DataSourceGODictionary als gegevensbron voor het beheren van een verscheidenheid aan tekstuele inhoud die in de UX moet worden weergegeven. In een uitgebreider scenario bieden de andere flexibelere gegevensbrontypen waarschijnlijk de benodigde flexibiliteit, zoals DataSourceReflection of DataSourceGOJson.
Eerste gegevensbindingsproject
Hier volgt een eenvoudig voorbeeld om u snel aan de slag te helpen:
- Maak een nieuwe scène.
- Selecteer in het menu Mixed Reality Toolkit de optie Toevoegen aan scène en Configureren.
- Maak een leeg gameobject en wijzig de naam 'Gegevensbinding'. Voeg een DataSourceJsonTest-onderdeel toe.
- Wijzig in de inspector de URL naar een website die een gegevenszoekactie biedt.
- Voeg een UI -> Text - TextMeshPro-object toe aan het gameobject Gegevensbinding. Er wordt een canvas en vervolgens een TMP-object (Text) toegevoegd.
- Selecteer het object Text (TMP) en wijzig in inspector de tekstinvoer in:
{{ activity }}. It's {{ type }}.
- Selecteer het Canvas-object en voeg er een onderdeel Data Consumer Text aan toe.
- Voer het project uit. Elke 15 seconden wordt een andere activiteit weergegeven.
Gefeliciteerd. U hebt uw eerste gegevensbindingsproject gemaakt met MRTK!
Een nieuwe gegevensbron schrijven
Een gegevensbron levert gegevens aan een of meer gegevensgebruikers. De gegevens kunnen van alles zijn: algoritmisch gegenereerd, in RAM-geheugen, op schijf of opgehaald uit een centrale database.
Alle gegevensbronnen moeten de IDataSource-interface bieden. Een deel van de basisfunctionaliteit wordt aangeboden in een basisklasse met de naam DataSourceBase. Waarschijnlijk wilt u deze klasse afleiden om de specifieke functionaliteit voor gegevensbeheer toe te voegen die specifiek is voor uw behoeften.
Om het mogelijk te maken een gegevensbron als onderdeel op een gameobject te plaatsen, bestaat er een ander basisobject met de naam DataSourceGOBase GO voor GameObject. Dit is een MonoBehavior die als onderdeel op een GameObject kan worden geplaatst. Het is een thin proxy die is ontworpen om werk te delegeren naar een niet-Unity-specifieke kerngegevensbron.
Een gegevensbron kan de mogelijkheid bieden om gegevens te manipuleren in Unity Editor. Als dat het zo is, kan de afgeleide klasse de logica van de gegevensbron bevatten of een 'stock'-gegevensbron gebruiken, maar ook Inspector-velden of een andere methode voor het configureren van de gegevens toevoegen.
Een nieuwe gegevensgebruiker schrijven
Een gegevensgebruiker ontvangt meldingen wanneer gegevens worden gewijzigd en werkt vervolgens een bepaald aspect van de gebruikerservaring bij, zoals de tekst die wordt weergegeven in een TextMeshPro-onderdeel.
Alle gegevensgebruikers moeten de interface IDataConsumer opgeven. Een deel van de basisfunctionaliteit wordt aangeboden in een basisklasse met de naam DataConsumerGOBase, waarbij GO staat voor GameObject.
Het grootste deel van het werk van een gegevensgebruiker is om nieuwe gegevens te accepteren en deze vervolgens voor te bereiden voor presentatie. Dit kan zo eenvoudig zijn als het selecteren van de juiste prefab, of het kan betekenen dat u meer gegevens moet ophalen uit een cloudservice, zoals een inhoudsbeheersysteem.
Een placer voor een gegevensverzamelingsitem schrijven
Een placer voor gegevensverzamelingsitems is verantwoordelijk voor het beheren van welke delen van een verzameling momenteel zichtbaar zijn en hoe die zichtbare verzameling moet worden weergegeven, of de verzameling nu een kleine statische lijst of een gigantische miljoen recorddatabase is.
Alle item-placers moeten de interface IDataCollectionItemPlacer bieden. Een deel van de basisfunctionaliteit wordt aangeboden in een basisklasse met de naam DataColletionItemPlacerGOBase. Alle placers voor items moeten afkomstig zijn van deze klasse.
Bekende beperkingen en ontbrekende functies
- Nog niet geïntegreerd met de op Canvas gebaseerde besturingselementen en schuiflijsten van Unity.
- Integratie van .NET INotifyPropertyChanged is nog niet geïmplementeerd.
- Voorbeeldscène die afbeeldingen van Flickr en trymrtk.com werkt niet op HoloLens vanwege een HTTPS SSL-bug in latere versies van Unity.
- Aanvullende prestaties afstemmen.
- Deze release is gericht op de presentatie van gegevens, niet op het vastleggen van gegevens. MRTK UX-besturingselementen zijn nog niet bekabeld voor het instellen van de status in een
DataSource. - Dynamische wijzigingen in lijstgegevens vernieuwen de hele lijst volledig in plaats van incrementeel bij te werken.
- Pijplijn voor gegevensmanipulatie niet geïmplementeerd
- Het invullen van alle UX-onderdelen op een slate wordt nog niet volledig ondersteund.
- DataSourceJson-knooppunten moeten de interface implementeren
IDataNodeom interoperabel te zijn met DataSourceObjects.