组合文件
在运行时从组合文件生成一棵实体和组件树
一个 组合体 是一个描述……树结构的文件 实体和组件。与其逐个编写代码来创建每个实体,不如将该结构存储在组合体文件中,并通过一次调用生成整个结构。
你可能已经在不知不觉中使用过组合体:
每个场景都有一个
main.composite文件。它保存了你在 场景编辑器中以可视化方式添加和配置的所有内容。这个文件会在场景启动时自动加载。自定义项目 会保存为
composite.json文件。每个自定义物品都是一个可在各场景间复用的组合体。
本页介绍如何在运行时通过代码生成一个组合体,例如在场景逻辑中动态生成一个自定义物品。
生成一个组合体
生成一个组合体需要两步: 加载 该组合体文件,然后 生成 它。加载是异步的,生成是同步的,因此模式始终是先加载后生成:
import { engine, Composite, getCompositeProvider } from "@dcl/sdk/ecs";
export async function spawnBarrel() {
const src = "barrel.composite";
const provider = getCompositeProvider();
if (!provider || !provider.loadComposite) return;
// 1. 从文件中加载组合体
const resource = await provider.loadComposite(src);
// 2. 生成它:创建其所有实体和组件
const barrel = Composite.instance(engine, resource, provider);
return barrel;
}provider.loadComposite(src) 读取组合体文件并将其加载到内存中。在一个使用 @dcl/sdk构建的普通场景中,系统已为你配置好组合体提供器,你可以通过 getCompositeProvider() 函数从 @dcl/sdk/ecs.
Composite.instance() 随后创建组合体中描述的所有实体及其所有组件,并返回 根实体 所生成树的根实体。之后可使用该返回的实体读取或修改组件,例如重新定位或移除生成的物品。
生成到现有实体上
默认情况下 Composite.instance() 会创建一个新实体来承载生成的树。传入一个 rootEntity 选项中的参数,即可生成到你已有的实体上:
定位已生成的组合体
要将已生成的组合体放置在特定的位置、旋转或缩放,请在 Transform 由……返回的根实体上设置一个 Composite.instance().
当前限制:嵌套组合体
生成适用于自包含的组合体和自定义物品。一个组合体可以从其某个实体引用另一个组合体,但 loadComposite() 不会 不是 递归处理这些嵌套引用:它只会加载你传入的文件。
在生成时, Composite.instance() 会递归处理已在内存中的嵌套引用。如果某个嵌套组合体尚未加载(除 main.composite外,你的场景中唯一捆绑的组合体),则该分支会记录警告并跳过。要生成带有嵌套引用的组合体,请先对 loadComposite() 每个被引用的文件调用该操作——或者更简单些,保持你要生成的组合体为自包含。
相关页面
最后更新于