<pc-wasm>
<pc-wasm> 在应用启动前加载所需模块,例如物理 Ammo、纹理转码 Basis 和网格解压 DracoDecoderModule。
- 必须直接位于
<pc-app>下。
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fallback | String(字符串) | - | 不支持 WebAssembly 时的 asm.js 路径,Draco 忽略 |
glue | String(字符串) | - | JavaScript 胶水代码路径 |
name | String(字符串) | - | 脚本中引用的模块名称 |
wasm | String(字符串) | - | WASM 二进制路径 |
name 区分大小写,必须为 Ammo、Basis 或 DracoDecoderModule 等精确名称。大小写错误是元素无法报告的特殊失败:例如 ammo 会在胶水加载时抛 TypeError,无 error 事件,元素与所属应用都不会就绪。
属性仅在模块开始加载时读取一次,即首次连接文档时, 或所属 pc-app 更早启动并收集该元素时。 之后修改不生效。通过代码创建时, 应先设置属性,再追加到文档。
就绪
模块成功或失败后异步初始化结束, 触发标准 ready,可通过 whenReady 等待,详见 代码访问。Basis 例外, 转码器开始加载时即就绪。就绪仅表示加载已结束,不保证成功; 失败还触发 error。通常无需单独等待模块, 因为 pc-app 在创建图形设备前会等待全部直接子模块, 应用就绪时,它们已成功或报告失败。 更深层 pc-wasm 仍加载,但应用不会等待。
就绪状态会保留,因为 WebAssembly 配置引擎全局状态, 不会卸载。移除元素不会回到等待状态, 再次插入也不会重复加载。
缺少 name 时会警告且始终未就绪, 但不阻止所属 pc-app 启动。
Ammo 应预先在标记中声明,不要稍后添加。 引擎启动时只检查一次,未找到则不会启用物理。
事件
通过 addEventListener() 或 oneventname property 监听:
| 事件 | 说明 |
|---|---|
error | URL 错误或服务器拒绝等加载失败时触发 ErrorEvent,message 包含引擎错误。每元素仅触发一次,仍会就绪。Basis 不触发 |
事件不冒泡,应直接监听元素, 或在 pc-app 上使用捕获阶段监听器。
模块失败不会阻止应用启动。控制台会记录
pc-wasm failed to load module '<name>' - <error>,
应用在无此模块的情况下启动,例如 Ammo 失败后没有物理。
引擎不会再次尝试失败模块,因此所有同名元素都失败,
包括原本正在等待的元素,以及稍后在另一应用中
添加的元素,后者会立即失败。
示例
加载 Ammo 后盒体才会下落,应用在启动前等待,因此场景开始时物理已就绪。可以删除标签再运行比较:
<pc-app>
<!-- Load the ammo.js WebAssembly module -->
<pc-wasm name="Ammo" glue="https://developer.playcanvas.com/assets/modules/ammo/ammo.wasm.js" wasm="https://developer.playcanvas.com/assets/modules/ammo/ammo.wasm.wasm" fallback="https://developer.playcanvas.com/assets/modules/ammo/ammo.js"></pc-wasm>
<pc-scene>
<pc-entity name="camera" position="0 2 6">
<pc-camera clear-color="#1d1f2b"></pc-camera>
</pc-entity>
<pc-entity name="light" rotation="45 30 0">
<pc-light cast-shadows normal-offset-bias="0.05" shadow-bias="0.2"></pc-light>
</pc-entity>
<pc-entity name="crate" position="0 4 0" rotation="25 15 35">
<pc-render type="box"></pc-render>
<pc-collision></pc-collision>
<pc-rigid-body type="dynamic"></pc-rigid-body>
</pc-entity>
<pc-entity name="ground" position="0 -0.5 0" scale="10 1 10">
<pc-render type="box"></pc-render>
<pc-collision half-extents="5 0.5 5"></pc-collision>
<pc-rigid-body type="static"></pc-rigid-body>
</pc-entity>
</pc-scene>
</pc-app>
JavaScript 接口
可以通过 WasmElement API创建和操作元素。
元素不直接暴露引擎对象。模块由 WasmModule 按 name 实例化,Basis 使用专用初始化器。Ammo 胶水定义全局 Ammo,可直接使用;其他模块可通过 WasmModule.getInstance(name, callback)。必须处理失败,因为就绪不保证成功:失败后 Ammo 未定义,getInstance 不会回调。应监听 error,并按无模块情况继续,例如关闭物理,而不是无限等待。
另请参阅
<pc-rigid-body>:需要 Ammo 的物理。<pc-collision>:碰撞形状。<pc-app>:启动前等待模块。