# 組件數(shù)據(jù)解析
在組件一章我們知道需要有一個(gè)解析器將xml中組件對(duì)應(yīng)屬性的字符串轉(zhuǎn)換為組件需要的數(shù)據(jù)類型,對(duì)此,框架提供了一套機(jī)制來處理。
# 數(shù)據(jù)解析器
數(shù)據(jù)解析器IDataValueHandler就是用來將屬性字符串轉(zhuǎn)換成特定類型的數(shù)據(jù)的,其具體定義如下:
interface IDataValueHandler<TDataValue> {
create(value: string, defaultValue: any, scene: Scene): TDataValue;
}
可見主要是一個(gè)create方法,其接受一個(gè)字符串的value,一個(gè)組件schema中定義的默認(rèn)值defaultValue和場(chǎng)景引用scene,返回解析后的值。一般我們會(huì)如此注冊(cè)一個(gè)解析器:
registerDataValue('number', {create: (value: string, defaultValue: any, scene: Scene) => {
return value === undefined ? defaultValue : parseFloat(value));
}});
這里注冊(cè)了number類型的解析器,可以看到如果沒有傳入值則返回默認(rèn)值,否則用parseFloat轉(zhuǎn)換。
除了registerDataValue方式注冊(cè)的數(shù)據(jù)類型外,還有一類特殊類型的數(shù)據(jù),它們就是資源。
# 特殊類型-資源
資源數(shù)據(jù)和number這樣的普通數(shù)據(jù)有些不同,其注冊(cè)一般不使用registerDataValue,而是在registerAssetLoader時(shí)定義的。如何定義可以參考資源加載器的內(nèi)容,一般來講資源數(shù)據(jù)使用時(shí)填寫的值都是資源ID,比如你要使用紋理資源:
<xr-asset-load type="texture" asset-id="waifu" src="/assets/textures/waifu.jpg" />
<xr-asset-material asset-id="simple-mat" uniforms="u_baseColorMap: waifu" />
我們先加載了一張id為waifu的紋理,然后在下面材質(zhì)的uniform的u_baseColorMap屬性使用了它。
資源類型的數(shù)據(jù)在
schema中描述時(shí),默認(rèn)值是資源的id。 注意資源類型的數(shù)據(jù)還會(huì)影響到組件的onAdd和onUpdate生命周期,框架會(huì)在每一次資源數(shù)據(jù)更新后,先等待引用的資源加載完成,才會(huì)進(jìn)入這兩個(gè)生命周期。
# 內(nèi)置數(shù)據(jù)類型
框架內(nèi)置了一些數(shù)據(jù)類型:
# 非資源數(shù)據(jù)
| 類型 | 例子 | 轉(zhuǎn)換 | 說明 |
|---|---|---|---|
| string | henshin: KuugaAgitoRyuki FaziBladeHibikiKabutoDenOkiva DecadeWOOOFourzeWizardGaim DriveGhostExaidbuildGrandZio | 'KuugaAgitoRyuki FaziBladeHibikiKabutoDenOkiva DecadeWOOOFourzeWizardGaim DriveGhostExaidbuildGrandZio' | 字符串,不作任何處理 |
| number | truth:42 | 42 | 數(shù)字,會(huì)轉(zhuǎn)成float,支持其他進(jìn)制如0xff、0b11 |
| boolean | yiyandingzhen:false | false | 布爾,當(dāng)寫'false'時(shí)為false,否則均為true(包括不寫值) |
| array | producer:wowaka neru kurogaki | ['wowaka','neru','kurogaki'] | 字符串?dāng)?shù)組,用空格分割 |
| number-array | idolOffice:7 6 5 | [7,6,5] | 數(shù)字?jǐn)?shù)組,用空格分割 |
| color | rem:0.57 0.75 1 1 | [0.57,0.75,1,1] | 顏色,rgba,也可以使用#fff這種方式 |
| map | cat:10,dog:8,fox:6 | [['cat',10],['dog',8],['fox',6]] | 映射形式是key:value,用,分割 |
| dict | camp:瞬光:混亂善良,roam:中立善良,xinyi:絕對(duì)中立 | {瞬光:'混亂善良',roam:'中立善良',xinyi:'絕對(duì)中立'} | 字典,和map類型寫起來一樣,轉(zhuǎn)換結(jié)果不同 |
| transform | target:homo | nodeId為homo的Transform組件引用 | 變換,可以用于索引標(biāo)記過nodeId的變換組件 |
# 資源數(shù)據(jù)
資源數(shù)據(jù)可見內(nèi)置的各種資源:效果,圖片,紋理,材質(zhì),幾何數(shù)據(jù),模型,渲染目標(biāo),幀動(dòng)畫。