核心

实体

实体的管理

新增实体

你可以点击层级树面板中的「+」按钮新增实体。需要注意的是,若您此时正选中了某个实体,那么添加的实体将会成为选中实体的子实体,否则将默认为场景的子实体:

也可以右键点击某个实体,为它添加子实体:

你既可以添加空实体,也可以快速添加挂载相应功能组件的实体,如挂载相机组件的实体,挂载光源组件实体,以及挂载 3D/2D 基础渲染组件的实体。

添加完毕后,你可以在 检查器面板 中对新实体的属性进行编辑。

删除实体

想要删除实体,可以通过以下几种方式:

  1. 选中待删实体 -> 点击删除按钮,快捷键是 Delete

  2. 右键某个实体 -> Delete

删除实体会删除实体及其所有的子实体。所以在删除实体时,你需要注意所删除的实体是否会影响场景中其他实体。

拷贝实体

拷贝实体会拷贝选中实体及其所有的子实体,实体所带的组件都会被拷贝。

  1. 选中某实体后,通过 Duplicated 在同层级下快速克隆该实体,通过快捷键 ⌘ + D 快速复制选中的实体。

  2. 也可以分别选择 copypaste ,从而实现跨层级拷贝。

实体排序

为了更好的组织实体,你可以通过拖拽的方式来排序实体。选中一个实体后,可以通过鼠标左键拖拽来改变实体在层级树中的位置。

搜索

层级面板上方有一个搜索框,用户可以输入实体的名称来搜索场景中的实体。搜索框支持模糊搜索,你可以输入实体名称的部分字符来查找实体。

隐藏实体

每个实体右侧都有一个眼睛按钮,点击可以切换实体在场景中的显示/隐藏状态。

需要注意的是, 此处对实体显示状态的调整仅是工作区的修改, 而非在 检查器面板 中的 isActive 的属性。

快捷键

以下操作在选中实体后方可生效。

操作快捷键
删除实体BackspaceDelete
复制实体⌘ + D
选中上一个实体
选中下一个实体
展开实体
折叠实体

实体的编辑

点击实体,你就可以对它进行编辑,在右侧的 检查器面板 中你可以编辑它的以下内容:

基本信息

编号名称说明
1名字实体的名称,脚本可以通过 scene.findEntityByName("entityName") 获取实体
2是否激活实体在场景中是否被激活
3所属层分层管理实体,它可以用于 裁剪遮罩(用于控制哪些层在渲染过程中被剔除)、 射线检测(用于控制哪些层的实体可以被射线检测到)等场景。支持多选。

组件管理

实体的组件通过平铺的方式展示在检查器面板中,比如最常见的 Transform 组件,详细使用请查看组件文档。

脚本使用

创建新实体

场景中已经介绍了如何获取激活场景。在新场景中,我们通常会先添加根实体:

const scene = engine.sceneManager.activeScene;
const rootEntity = scene.createRootEntity();

一般以添加子实体的方式创建新实体:

const newEntity = rootEntity.createChild("firstEntity");

当然,也可以直接创建实体。但这种实体是游离的,在关联层级树上的实体之前不显示在场景中。

const newEntity = new Entity(engine, "firstEntity");
rootEntity.addChild(newEntity);

删除实体

某个实体在场景中不再需要时,我们可以删除它:

rootEntity.removeChild(newEntity);

值得注意的是,这种方式仅仅是将物体从层级树上释放出来,不在场景中显示。如果彻底销毁还需要:

newEntity.destroy();

场景中查找实体

根据名字查找实体

const entity = scene.findEntityByName("entityName");

根据路径查找实体

const entity = scene.findEntityByPath("parent/child/grandson");

查找子实体

在已知父实体的情况下,通常我们通过父实体来获得子实体:

const childrenEntity = newEntity.children;

如果明确知道子实体在父实体中的 index 可以直接使用 getChild

newEntity.getChild(0);

如果不清楚子实体的 index,可以使用 findByName 通过名字查找。findByName 不仅会查找子实体,还会查找孙子实体。

newEntity.findByName("model");

如果有同名的实体可以使用 findByPath 传入路径进行逐级查找,使用此 API 也会一定程度上提高查找效率。

newEntity.findByPath("parent/child/grandson");

状态

暂时不使用某实体时,可以通过调用实体的 isActive 停止激活,同时该实体下的所有组件都会被禁用

newEntity.isActive = false;

这篇文档对您有帮助吗?