组件数据解析
组件数据解析
在组件一章我们知道需要有一个解析器将xml中组件对应属性的字符串转换为组件需要的数据类型,对此,框架提供了一套机制来处理。
数据解析器
数据解析器IDataValueHandler就是用来将属性字符串转换成特定类型的数据的,其具体定义如下:
interface IDataValueHandler<TDataValue> {
create(value: string, defaultValue: any, scene: Scene): TDataValue;
}
可见主要是一个create方法,其接受一个字符串的value,一个组件schema中定义的默认值defaultValue和场景引用scene,返回解析后的值。一般我们会如此注册一个解析器:
registerDataValue('number', {create: (value: string, defaultValue: any, scene: Scene) => {
return value === undefined ? defaultValue : parseFloat(value));
}});
这里注册了number类型的解析器,可以看到如果没有传入值则返回默认值,否则用parseFloat转换。
除了registerDataValue方式注册的数据类型外,还有一类特殊类型的数据,它们就是资源。
特殊类型-资源
资源数据和number这样的普通数据有些不同,其注册一般不使用registerDataValue,而是在registerAssetLoader时定义的。如何定义可以参考资源加载器的内容,一般来讲资源数据使用时填写的值都是资源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的纹理,然后在下面材质的uniform的u_baseColorMap属性使用了它。
资源类型的数据在
schema中描述时,默认值是资源的id。 注意资源类型的数据还会影响到组件的onAdd和onUpdate生命周期,框架会在每一次资源数据更新后,先等待引用的资源加载完成,才会进入这两个生命周期。
内置数据类型
框架内置了一些数据类型:
非资源数据
| 类型 | 例子 | 转换 | 说明 |
|---|---|---|---|
| string | henshin: KuugaAgitoRyuki FaziBladeHibikiKabutoDenOkiva DecadeWOOOFourzeWizardGaim DriveGhostExaidbuildGrandZio | 'KuugaAgitoRyuki FaziBladeHibikiKabutoDenOkiva DecadeWOOOFourzeWizardGaim DriveGhostExaidbuildGrandZio' | 字符串,不作任何处理 |
| number | truth:42 | 42 | 数字,会转成float,支持其他进制如0xff、0b11 |
| boolean | yiyandingzhen:false | false | 布尔,当写'false'时为false,否则均为true(包括不写值) |
| array | producer:wowaka neru kurogaki | ['wowaka','neru','kurogaki'] | 字符串数组,用空格``分割 |
| number-array | idolOffice:7 6 5 | [7,6,5] | 数字数组,用空格``分割 |
| 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:绝对中立 | 字典,和map类型写起来一样,转换结果不同 |
|
| transform | target:homo | nodeId为homo的Transform组件引用 |
变换,可以用于索引标记过nodeId的变换组件 |
浙公网安备 33010602011771号