訓練
學習路徑
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
歡迎使用 MRTK3 資料系結和主題架構。 此架構的設計目的是讓您輕鬆地建立可視化元素,以動態方式在運行時間由一或多個數據源提供的數據填入和更新。
數據系結是建立應用程式 UX(檢視)與所呈現數據之間連線的程式。。 假設系結具有正確的設定,且數據會提供適當的通知;當數據變更其值時,系結至數據的專案會自動反映變更。
熱門的數據系結架構:
如需詳細資訊,請參閱 數據系結概觀 - WPF.NET
目前支援:
除了可用的功能之外,更多功能的最高優先順序包括:
完全解析的 Keypath - 對應至數據源中一個特定物件的完整絕對索引鍵路徑。 對於集合中的專案,這是一個集合實體的完整解析索引鍵路徑,以及該集合實體之一個數據元素的相對 (local) 索引鍵路徑的組合。
Keypath Mapper - 本機 keypaths 與數據源域名之間的選擇性命名空間對應程式(例如“link” <-> “URL” )。
主題 - 數據源,提供一組達成特定視覺美學所需的各種資產和樣式。
專案放置器 - 負責將可見專案放入場景中的DataConsumerCollection 隨附。
數據物件集 區 - 具現化、待命預製專案,可供填入低 GC 清單瀏覽的數據。
List Virtualization - 能夠填入、呈現和巡覽任意大小的清單。
預測性預先擷取 - 預先擷取 數據和填入可能很快就會透過捲動/分頁方式看到之專案的收集預製專案。
數據源是任意類型的任何受控數據集,以及可用來透過數據取用者填入數據檢視的複雜度。 數據源所管理的數據可以是靜態或動態。 任何對數據項的變更都會回報給已註冊以接收變更通知的任何數據取用者。
具有單一方法來擷取數據源的簡單介面。 這是設計來允許數據取用者元件在遊戲物件階層中自動探索MonoBehavior腳本元件。 不需要直接在遊戲物件本身上實作數據源。 當現有的MonoBehaviour必須衍生自另一個類別,且多重繼承可防止衍生自DataSourceGOBase時,這會很有用。 它也允許更多程式代碼沒有 Unity 相依性。
DataSourceProviderSingleton
MonoBehaviour 可讓您指定數據源,即使數據源不在想要接聽它的 DataConsumers 中,仍可自動探索。 只要將任何位置放在 DataSourceProviderSingleton
場景中,並以數據取用者所要探索的任何數據源填 Data Sources
入 屬性。 或者,數據取用者會逐步引導其父系尋找適當的數據源,這表示您可以將數據源放在這些數據取用者父鏈中的任何位置提供所需數據的數據源。
索引鍵路徑是用來唯一識別數據源中任何資訊片段的機制。
雖然索引鍵路徑可以是每個數據項的任何唯一標識符,但目前的實作會使用邏輯用戶可讀取規範,指出相對於整個結構化數據集相關數據的流覽位置。 它是以 Javascript 的清單、字典和基本概念為模型。 索引鍵路徑是語法正確的 Javascript 語句,可用來存取可以用 JSON 表示的數據。 這種方法的優點是,它與 JSON 和 XML 相互關聯。 這是從後端服務傳輸資訊的兩種最普遍方式。
範例索引鍵路徑:
假設索引鍵路徑是任意字串,且不需要分類法,實際的數據規範可以是描述要擷取之數據的任何方法。 XML XPath 是可使用資料來源的可行索引鍵路徑架構範例。 只要數據取用者所提供的密鑰路徑與數據源預期的索引鍵路徑一致,所有專案都會運作。 此外,可以實作索引鍵路徑對應器,以在不同的架構之間進行轉譯。
剖析金鑰路徑表示結合兩個索引鍵路徑:
如此一來,就不可能以在較大的數據集階層中實際存在的位置來處理數據子集。 這項功能的最重要用法是描述清單中單一項目的數據,而不必擔心目前實例所參考的專案。
由於 DataSource 一律會產生並取用「完全解析」密鑰路徑,而且很少或永遠不會由 DataConsumer 或其他外部元件修改,因此它可以具有任何對 DataSource 有意義的結構。 例如,如果有預製項目顯示相片的清單專案及其標題、拍攝日期和其他屬性,預製專案中的本機索引鍵路徑可能如下所示:
清單中一個預製專案的完整解析索引鍵路徑可能如下所示:
索引鍵路徑對應程式可讓數據源和數據取用者針對金鑰路徑使用不同的命名空間和慣例,並且仍然一起運作。
常用元素的預製專案,例如顯示人員連絡資訊的石板,可以包含數據取用者所管理的變數字段。 若要使這個可行,預製專案之任何變數層面所使用的標識碼需要一種方法,才能對應至數據源中正確日期的標識符,而該標識元會在每次使用預製專案時,判斷該變數元素的內容。 索引鍵路徑對應程式可讓此作業成為可能。
預製專案可以搭配不同的數據源使用,其中數據會儲存在不同的組織結構中,並使用功能變數名稱。 若要搭配每個數據源使用範本預製專案,金鑰路徑對應程式可以解決數據組織方式的任何差異。
物件,知道如何取用數據源所管理的資訊,並使用該數據填入數據檢視。
數據取用者可以向數據源註冊,以收到數據集中指定索引鍵路徑之數據項之任何變更的通知。 每當指定的數據已變更(或懷疑已變更),數據取用者就會收到通知。
「資料取用者集合」已新增管理類似專案清單的功能。 此清單可以是數據源所管理的整個數據集,或只由子集管理。 一般而言,清單中每個項目的數據都包含類似的資訊類型,但這並非必要專案。 數據源和數據取用者可以支援巢狀清單,例如在聯繫人清單中與每位人員相關聯的相片清單中,與每個相片相關聯的關鍵詞清單。 關鍵詞的索引鍵路徑會相對於相片,而相片的索引鍵路徑會相對於人員,而該人員的索引鍵路徑會相對於最接近的父清單或數據集的根目錄。
處理集合時,集合中特定項目的正確解析索引鍵路徑會指派給針對每個集合專案具現化的預製物件中找到的每個數據取用者。 然後,用來完整解析該預製專案內任何相對(本機)檢視數據的索引鍵路徑。
集合數據取用者需要一種方法,以重複的視覺元素清單填入用戶體驗,例如可在可捲動的產品、相片或聯繫人清單中找到的內容。 這可藉由將專案放置器指派給集合數據取用者來完成。 此專案置放器是邏輯 tha 知道如何要求列表專案、接受已填入變數數據的預製專案,然後將它們呈現給使用者,通常是將這些專案插入由清單的 UX 配置元件所管理的清單。
主題會使用數據源和數據取用者的所有管道。 不論其為靜態或動態數據系結至其他數據源,都有可能將 GameObject 的任何階層設定為主題。 這可同時套用數據系結和主題。 甚至可以將來自另一個數據源的數據設為主題。
主題是一次變更許多UX元素視覺美學的能力。 一般而言,指定主題所需的所有數據都是由單一數據源提供,例如 Scriptable 物件。 您也可以視需要提供數據主題,或根據其用途分割成邏輯群組。
單一 UX 元素的數據系結和主題可以共存。 任何個別的UX元素都可以同時主題和數據系結。 在此案例中,一般流程是使用來自 DataSource 的 datum 來衍生正確的主題索引鍵路徑。 接著,這個索引鍵路徑會用來從主題數據源擷取物件,通常是 ScriptableObject 配置檔,但可能是任何可以解析索引鍵路徑的數據源。
為了簡化主題和數據系結的設定,您可以在具現化時建立 BindingConfigurator 處理的系結配置檔。
BindingConfigurator
處理系 結配置檔 ,以判斷要設定主題之預製專案內的資產,並將系結的數據元素和可主題元素與 Keypaths 產生關聯。 然後,它會新增適當的 DataConsumers
方法,將這些視覺元素系結至正確的Keypaths選取器,這些選取器將用來參考一或多個 DataSources
中的特定數據,這些數據通常位於預製專案本身外部。DataSource
其中包含系結配置檔中所識別之每個 Keypath 的數據。ThemeProvider
協助程式腳本可讓您輕鬆地使用 ScriptableObject 做為DataSource
主題。MRTK_UX_ThemeProfile
系結至 DataSourceReflection
中 ThemeProvider
之 的 ScriptableObject 所提供。內嵌資料源適用於兩種情況:
這可以使用反映將索引鍵路徑對應至欄位、屬性、巢狀類別、陣列、清單或字典,將任何 C# 結構或類別 DataSource
轉換成 。 它可以與 Unity ScriptableObject 或任何其他 C# 結構或主題數據所在的類別相關聯。 包含數據的具現化物件可以在運行時間插入相依性並變更。
如果數據以文字的形式 json
存在,則這會管理與 DOM 的 json
對應索引鍵路徑。 二進位資產可以從 Unity 的資源、 StreamingAssets 或甚至是擷取的 URL 擷取。
當純一般清單足以滿足需求,以及快速原型設計時,這是一個簡單的選項。 支援所有主題資產,包括文字、Unity 資產(例如材質、Sprite 和影像)、 資源、 StreamingAssets,甚至是透過 URL 從外部擷取。
任何實作簡單 IDataSource
介面或衍生自 DataSourceBase
DataSourceGOBase
或的自定義數據源,都可以用來符合自定義需求。
UXComponents 套件中提供的標準 UXComponents 控件全都設定為支持主題。 默認會關閉,但很容易啟用。
每個控件通常位於根預製專案最上層的 GameObject 上,都有一個名為 UXBindingConfigurator 的腳本。 如果已啟用,此腳本將會提取所需的數據系結腳本來開啟主題。 請務必匯入數據系結和主題套件。
TextMeshPro StyleSheets 上的附注:目前無法使用 StyleSheets 來設定 TextMeshPro Normal 樣式的樣式。 您可以使用 TextMeshPro 的預設樣式表單 中包含的任何其他樣式。 這些範例會使用 Body 來解決此問題。
DataSourceThemeProvider
MonoBehaviour 可用來輕鬆地建立 ScriptableObject,其中包含所有主題資產函式做為數據源的所有參考。 這會在UXThemingExample場景中示範。
ThemeSelector
MonoBehaviour 可讓您指定並輕鬆地在多個 ScriptableObject 配置檔之間交換。 其中一個範例是讓您輕鬆地在「深色」和「淺色」主題之間切換。 將 ScriptableObjects 新增至 Theme Profiles
,通常是在設計時間。 然後,在運行時間變更 Current Theme
屬性以變更主題。
主題是由數據取用者完成,特別是繼承自 DataConsumerThemeBase<T>、DataConsumerTextStyle 和自定義 DataConsumer 類別的自定義 DataConsumer 類別,任何開發人員都可以實作這些類別來增強主題支援。
DataConsumerThemeBase<T> 基類提供邏輯,以使用來自主要數據源的整數或索引鍵數據,從次要主題資料庫查閱所需的最終值。 這可藉由將輸入數據對應至主題索引鍵路徑,然後使用該主題索引鍵路徑來擷取最終值來完成。 這可讓任何項目同時同時系結數據及主題。 例如,想像資料庫中的狀態欄位,其狀態為 [新增]、[已啟動] 和 [完成],以值 0、1 和 2 表示。 每一個都可以由Sprite圖示來表示。 對於數據系結,會使用 0 到 2 的值來查閱所需的 Sprite。 使用主題和數據系結時,主題配置檔會指向主題配置檔中三個 Sprite 的正確清單,然後使用 0 到 2 的值從該列表中選取正確的 Sprite。 這可讓這些圖示的樣式因主題而異。
當運行時間主題和動態數據系結同時使用時,可以在任何 DataConsumerThemeBase 衍生類別中指定 DataConsumerThemeBase 衍生類別,以在主題變更時通知。
在運行時間交換主題可藉由以相同數據物件模型拓撲中配置的新數據集取代主題數據源中的數據來完成。 DataSourceReflection 可以搭配 ScriptableObjects 使用,其中每個配置檔都代表主題。 針對所有 MRTK Core UX 控制件,主題配置檔是名為 MRTK_UXComponents_ThemeProfile 的 ScriptableObject。 ThemeProvider.cs協助程式腳本可讓您輕鬆地使用此或任何 ScriptableObject 設定檔作為數據源。
在大部分情況下,可以自動偵測主題至動態數據的方法,也可以明確指定。
當 datum 用來從主題數據源中選取正確的專案時,程式為:
用來擷取所需物件之 datum 的預期數據類型可以是下列其中一項:
資料類型 | 描述 |
---|---|
自動偵測... | 會分析 datum,並自動偵測到正確的解譯。 如需詳細資訊,請參閱下面的。 |
DirectValue | datum 必須是所需的 T 類型(例如,Material、Sprite、Image)並直接使用。 |
DirectLookup | 整數索引或字串索引鍵,用來查閱本機查閱表格中所需的值。 |
StaticThemedValue | 從指定之主題索引鍵路徑的主題數據源擷取正確類型的靜態主題物件。 |
ThemeKeypathLookup | 整數索引或字串索引鍵可用來查閱所需的主題索引鍵路徑。 |
ThemeKeypathProperty | 字串屬性名稱,將會附加至 Theme 中提供的主題基底索引鍵路徑。 |
ResourcePath | 從 Unity 資源擷取值的資源路徑(可能以 “resource://” 開頭)。 |
FilePath | 擷取 Unity 串流資產的檔案路徑(可能以「file://」開頭)。 |
自動偵測會分析收到的數據,並自動決定擷取方法。 在下表中,T 代表所需的類型,例如 Material、Sprite、Image。 自動偵測可能會發生在程式中的兩個位置:
Datum 類型 | 考量 | 具有主題協助程式 | 行為 |
---|---|---|---|
T | n/a | Y/N | 直接搭配無主題使用 |
int | 任何整數基本類型或 Int32 可剖析字串 | No | 當做索引傳遞至衍生的 GetObjectByIndex(n) 以擷取 T 類型的第 N 個物件。 |
int | 任何整數基本類型或 Int32 可剖析字串 | Yes | 從本機查閱擷取第 N 個主題索引鍵路徑,然後透過自動偵測擷取主題物件。 |
字串 | 格式:“resource://{resourcePath}” | Y/N | resourcePath 用來擷取 Unity 資源 |
字串 | 格式:“file://{filePath} | Y/N | filePath 用來擷取串流資產 |
字串 | 其他 | No | 當做密鑰傳遞至衍生的 GetObjectByKey() 以擷取 T 類型的相符物件。 |
字串 | 其他 | Yes | 從本機查閱擷取相符主題索引鍵路徑的索引鍵,然後透過自動偵測擷取主題物件。 |
從包含數值狀態值的資料庫中擷取主題狀態圖示的範例:
主題可以啟用TMPro樣式表單。 “TMP 設定” ScriptableObject 會指定樣式表單預期在 Resources 中的位置。 這是 「預設字型資產 => 路徑」屬性。
請務必將任何應用程式特定的 StyleSheet 放在 [資源] 的相同子路徑中。 如果您想要以不同的方式加以組織,請務必更新 「TMP 設定」以符合。
如果您正在開發新的UX控制件,則讓這些控件變得相當容易。 就控件使用其他 UX 控制件已使用材質、Sprite 和其他資產的程度而言,通常以可探索的方式命名各種遊戲物件。
您可以繼承自 MRTK_UXCore_ThemeProfile
,並新增更多可主題欄位,或將控件指向您自己的 ScriptableObject。 提供的人沒有什麼神奇的:ScriptableObject 的組織會透過 C# 反映來判斷存取個別數據項所需的索引鍵路徑。
藉由將BindingConfigurator.cs腳本新增至新控件的最上層,您就可以指定自己的串行化 BindingProfile ScriptableObject。 這會將必要的 GameObject 名稱提供給 KeyPath 對應,以便將可主題元素與主題配置檔中提供的數據產生關聯。 此腳本會自動在運行時間新增任何必要的 DataConsumerXXX 元件,以支援您想要使用主題。
在第一個步驟中,請仔細查看 MRTK 範例套件中的各種數據系結範例場景,並查看各種數據源 MonoBehaviours 的設定方式。 一般而言,數據系結腳本只需要放在預製專案或一組相關 UX 元素的最高層級 GameObject 上。
此外,針對大部分的使用案例,預設值會「現成」運作,但公開的屬性為更進階的案例提供了許多彈性。
備註
若要啟用標準 MRTK UX 元件的主題, MRTK_UX_DATABINDING_THEMING_ENABLED
符號必須在播放機設定中定義。 此符號可確保不需要主題時,對效能造成零影響。
此場景示範各種變數數據案例。 只要載入場景並播放即可。 請注意下列幾點事項:
TextMeshPro 元件的 [文字輸入] 字段包含如下所示的變數: {{ firstName }}。 這些標記會直接作為本機索引鍵路徑使用。
Sprite 和文字的遊戲物件具有某種形式的數據取用者元件,可管理接收數據和更新檢視。
單一數據取用者可以由相同類型的多個元件共用,方法是放在 GO 階層中較高的位置。
只要數據取用者位於 GO 階層中的相同遊戲物件或更高層級,就可以找到自己的數據源。
父遊戲物件具有數據源元件,可為呈現一組相關變數資訊的所有子遊戲物件提供數據。
「數據取用者」集合會指定預製專案,其本身包含數據取用者,這些取用者將用來填入該預製專案與變數數據。
這個範例會使用主題,在一組適用於 Piano 和 Xylophone 的一個之間切換 AudioClips。
本範例結合主題和數據系結,將電池電量同時顯示為數值和圖示。 主題可用來在「收費」和「不收費」主題之間選取。 其設計目的是要符合下列目標:
ScriptableObject
一做為主題配置檔中。ScriptableObject
一做為主題配置檔中。備註
此示範的結構不是結合主題和數據系結的良好範例。 在用於適當區隔模型和檢視的生產應用程式中,實際電池狀態(層級和充電)會以與Sprite本身的資源定位器不同的數據源提供。
此範例示範變更整個應用程式的主題,並示範如何使用 DataSourceGODictionary
做為數據源來管理要顯示在UX中的各種文字內容。 在更全面的案例中,其他更有彈性的數據來源類型可能會提供所需的彈性,例如 DataSourceReflection
或 DataSourceGOJson
。
以下是協助您快速開始使用的簡單範例:
{{ activity }}. It's {{ type }}.
恭喜! 您已使用 MRTK 建立第一個數據系結專案!
數據源會將數據提供給一或多個數據取用者。 其數據可以是任何專案:以演算法方式產生、RAM、磁碟上或從中央資料庫擷取。
所有數據源都必須提供 IDataSource 介面。 一些基本功能是在稱為 DataSourceBase
的基類中提供。 您最可能想要衍生自此類別,以新增您所需的特定數據管理功能。
若要將數據源當做元件卸除到遊戲物件上,另一個基底對象稱為 DataSourceGOBase
GO 代表 GameObject。 這是MonoBehavior,可卸除至GameObject做為元件。 它是精簡 Proxy,其設計目的是將工作委派給非 Unity 特定的核心數據源。
數據源可能會公開在 Unity 編輯器內操作數據的能力。 如果是這種情況,衍生類別可以包含所有數據源邏輯,也可以利用「庫存」數據源,但也新增 Inspector 字段或其他設定數據的方法。
數據取用者會在數據變更時取得通知,然後更新用戶體驗的某些層面,例如 TextMeshPro 元件中顯示的文字。
所有數據取用者都必須提供 IDataConsumer 介面。 某些基本功能是在稱為 DataConsumerGOBase
的基類中提供,其中 GO 代表 GameObject。
數據取用者的大部分工作是接受新的數據,然後準備呈現。 這可能就像選取正確的預製項目一樣簡單,也可能表示從內容管理系統等雲端服務擷取更多數據。
數據收集專案放置器負責管理目前可見的集合哪些部分,以及如何呈現該可見的集合,無論是小型靜態清單還是巨大的百萬筆記錄資料庫。
所有專案放置器都必須提供 IDataCollectionItemPlacer 介面。 一些基本功能是在稱為 DataColletionItemPlacerGOBase
的基類中提供。 所有專案放置器都應該衍生自這個類別。
DataSource
設定狀態。IDataNode
作介面,以便與 DataSourceObjects 互通。訓練
學習路徑
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization