Scene 作为场景单元,可以方便的进行实体树管理,尤其是大型游戏场景。如: scene1 和 scene2 作为两个不同的场景,可以各自独立管理其拥有的 Entity 树,因此场景下的光照组件、渲染组件和物理组件之间也互相隔离,互不影响。我们可以同时渲染一个或多个 Scene,也可以在特定时机下根据项目逻辑动态切换当前 Scene。
从结构上每个 Engine 下可以包含一个和多个激活的场景(目前编辑器还不支持多个)。每个 Scene 可以有多个根实体。
在 资产面板 右键(或资产面板右上角 + 号)创建场景,双击场景可以切换过去:
详情请参照背景教程。
详情请参照阴影教程。
详情请参照后处理教程。
可以给整个场景增加 线性、指数、指数平方 3 种雾化:
属性名称 | 解释 |
---|---|
scenes | 场景列表 |
方法名称 | 解释 |
---|---|
addScene | 添加场景 |
removeScene | 移除场景 |
mergeScenes | 合并场景 |
loadScene | 加载场景 |
如果想要加载 Scene 资产作为应用中的一个场景,可以使用 engine.resourceManager.load
传入 url 即可。
const sceneUrl = "...";
engine.resourceManager
.load({ type: AssetType.Scene, url: "..." })
.then((scene) => {
engine.sceneManager.addScene(scene);
});
通过调用 engine.sceneManager.scenes
可以获取当前引擎运行时激活的全部场景,也可以通过 entity.scene
获取对应 entity
从属的 scene
。
// 获取当前所有激活的场景
const scenes = engine.sceneManager.scenes;
// 获取节点属于的场景
const scene = entity.scene;
engine.sceneManager.scenes
是只读的,若需要添加和移除 Scene ,需要调用 engine.sceneManager.addScene()
或 engine.sceneManager.removeScene()
,引擎支持同时渲染多个场景。
// 假设已经有两个场景
const scene1, scene2;
// 添加 场景1
engine.sceneManager.addScene(scene1);
// 添加 场景2
engine.sceneManager.addScene(scene1);
// 移除 场景2
engine.sceneManager.removeScene(scene2);
多场景渲染示例如下:
可以使用 engine.sceneManager.mergeScenes
将 2 个场景进行合并为 1 个场景。
// 假设已经有两个未激活的场景
const sourceScene, destScene;
// 将 sourceScene 合并到 destScene
engine.sceneManager.mergeScenes(sourceScene, destScene);
// 激活 destScene
engine.sceneManager.addScene(destScene);
调用 scene.destroy()
即可销毁场景,被销毁的场景也会自动从激活场景列表中移除。
方法名称 | 解释 |
---|---|
createRootEntity | 新创建的 scene 默认没有根实体,需要手动创建 |
addRootEntity | 可以直接新建实体,或者添加已经存在的实体 |
removeRootEntity | 删除根实体 |
getRootEntity | 查找根实体,可以拿到全部根实体,或者单独的某个实体对象。注意,全部实体是只读数组,不能改变长度和顺序 |
const engine = await WebGLEngine.create({ canvas: "demo" });
const scene = engine.sceneManager.scenes[0];
// 创建根实体
const rootEntity = scene.createRootEntity();
// 添加实体到场景
scene.addRootEntity(rootEntity);
// 删除根实体
scene.removeRootEntity(rootEntity);
// 查找根实体
const allEntities: Readonly<Entity[]> = scene.rootEntities;
const entity2 = scene.getRootEntity(2);
需要注意的是,当我们熟悉了 Engine 和 Scene 之后,如果想要将渲染画面输出到屏幕上或者进行离屏渲染,我们还得确保当前 scene 的实体树上挂载了 Camera,挂载相机的方法如下:
const cameraEntity = rootEntity.createChild("camera");
cameraEntity.addComponent(Camera);