Files
engine/docs/zh/core/entity.mdx
luzhuang 234d6b7b46 Add sweep and overlap doc (#2823)
* docs: add sweep and overlap doc
2025-09-19 16:15:05 +08:00

189 lines
6.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
order: 3
title: 实体
type: 核心
label: Core
---
## 实体的管理
### 新增实体
你可以点击层级树面板中的「+」按钮新增实体。需要注意的是,若您此时正选中了某个实体,那么添加的实体将会成为**选中实体的子实体**,否则将默认为场景的子实体:
<Image
src="https://gw.alipayobjects.com/zos/OasisHub/3d808a9c-429c-4c45-91c4-5d7cb12a2fee/image-20250515120040706.png" style={{zoom:"50%"}} />
也可以右键点击某个实体,为它添加子实体:
<Image
src="https://gw.alipayobjects.com/zos/OasisHub/f4bfef7e-cff3-4fe7-a4d5-2dc253501206/image-20250515120159840.png" style={{zoom:"50%"}} />
你既可以添加空实体,也可以快速添加挂载相应功能组件的实体,如挂载相机组件的实体,挂载光源组件实体,以及挂载 3D/2D 基础渲染组件的实体。
添加完毕后,你可以在 **[检查器面板](/docs/interface/inspector)** 中对新实体的属性进行编辑。
### 删除实体
想要删除实体,可以通过以下几种方式:
1. 选中待删实体 -> 点击删除按钮,快捷键是 <Kbd>Delete</Kbd>
2. 右键某个实体 -> Delete
<Image
src="https://gw.alipayobjects.com/zos/OasisHub/1e46a6d6-3591-4e16-88b6-e1adbaa38712/image-20250515113606200.png" style={{zoom:"50%"}} />
<Callout type="warning">
删除实体会删除实体及其所有的子实体。所以在删除实体时,你需要注意所删除的实体是否会影响场景中其他实体。
</Callout>
### 拷贝实体
拷贝实体会拷贝选中实体及其所有的子实体,实体所带的组件都会被拷贝。
1. 选中某实体后,通过 `Duplicated` 在同层级下快速克隆该实体,通过快捷键 <Kbd>⌘ + D</Kbd> 快速复制选中的实体。
2. 也可以分别选择 `copy` 与 `paste` ,从而实现跨层级拷贝。
<Image
src="https://gw.alipayobjects.com/zos/OasisHub/7be3ac6a-2b4e-44c5-b8cc-fbeba7794830/image-20250515113457918.png" style={{zoom:"50%"}} />
### 实体排序
为了更好的组织实体,你可以通过拖拽的方式来排序实体。选中一个实体后,可以通过鼠标左键拖拽来改变实体在层级树中的位置。
### 搜索
层级面板上方有一个搜索框,用户可以输入实体的名称来搜索场景中的实体。搜索框支持模糊搜索,你可以输入实体名称的部分字符来查找实体。
### 隐藏实体
每个实体右侧都有一个眼睛按钮,点击可以切换实体在场景中的显示/隐藏状态。
<Callout type="info">
需要注意的是, 此处对实体显示状态的调整仅是工作区的修改, 而非在 **[检查器面板](/docs/interface/inspector)** 中的 `isActive` 的属性。
</Callout>
### 快捷键
以下操作在选中实体后方可生效。
| 操作 | 快捷键 |
| :--------------- | :---------------------------------------- |
| `删除实体` | <Kbd>Backspace</Kbd> 或 <Kbd>Delete</Kbd> |
| `复制实体` | <Kbd>⌘ + D</Kbd> |
| `选中上一个实体` | <Kbd>↑</Kbd> |
| `选中下一个实体` | <Kbd>↓</Kbd> |
| `展开实体` | <Kbd>→</Kbd> |
| `折叠实体` | <Kbd>←</Kbd> |
## 实体的编辑
点击实体,你就可以对它进行编辑,在右侧的 **[检查器面板](/docs/interface/inspector)** 中你可以编辑它的以下内容:
### 基本信息
<Image
src="https://gw.alipayobjects.com/zos/OasisHub/12d4148a-f670-443b-8eb2-12c9a837eaea/image-20250515114745494.png" style={{zoom:"50%"}} />
| 编号 | 名称 | 说明 |
| ---- | -------- | ------------------------------------------------------------ |
| 1 | 名字 | 实体的名称,脚本可以通过 `scene.findEntityByName("entityName")` 获取实体 |
| 2 | 是否激活 | 实体在场景中是否被激活 |
| 3 | 所属层 | 分层管理实体,它可以用于 [裁剪遮罩](/docs/graphics/camera/component/#裁剪遮罩)(用于控制哪些层在渲染过程中被剔除)、 [射线检测](docs/physics/query/raycast)(用于控制哪些层的实体可以被射线检测到)等场景。支持多选。 |
### 组件管理
实体的组件通过平铺的方式展示在检查器面板中,比如最常见的 **Transform** 组件,详细使用请查看[组件](/docs/core/component)文档。
<Image
src="https://gw.alipayobjects.com/zos/OasisHub/2a670e89-a8de-44b9-b978-5a25e9689fd0/image-20250515153549864.png"
style={{zoom:"50%"}}
/>
## 脚本使用
### 创建新实体
在[场景](/docs/core/scene)中已经介绍了如何获取激活场景。在新场景中,我们通常会先添加根实体:
```typescript
const scene = engine.sceneManager.activeScene;
const rootEntity = scene.createRootEntity();
```
一般以添加子实体的方式创建新实体:
```typescript
const newEntity = rootEntity.createChild("firstEntity");
```
当然,也可以直接创建实体。但这种实体是游离的,在关联层级树上的实体之前不显示在场景中。
```typescript
const newEntity = new Entity(engine, "firstEntity");
rootEntity.addChild(newEntity);
```
### 删除实体
某个实体在场景中不再需要时,我们可以删除它:
```typescript
rootEntity.removeChild(newEntity);
```
值得注意的是,这种方式仅仅是将物体从层级树上释放出来,不在场景中显示。如果彻底销毁还需要:
```typescript
newEntity.destroy();
```
### 场景中查找实体
#### 根据名字查找实体
```typescript
const entity = scene.findEntityByName("entityName");
```
#### 根据路径查找实体
```typescript
const entity = scene.findEntityByPath("parent/child/grandson");
```
### 查找子实体
在已知父实体的情况下,通常我们通过父实体来获得子实体:
```typescript
const childrenEntity = newEntity.children;
```
如果明确知道子实体在父实体中的 _index_ 可以直接使用 [getChild](/apis/core/#Entity-getChild)
```typescript
newEntity.getChild(0);
```
如果不清楚子实体的 index可以使用 [findByName](/apis/core/#Entity-findByName) 通过名字查找。`findByName` 不仅会查找子实体,还会查找孙子实体。
```typescript
newEntity.findByName("model");
```
如果有同名的实体可以使用 [findByPath](/apis/core/#Entity-findByPath) 传入路径进行逐级查找,使用此 API 也会一定程度上提高查找效率。
```typescript
newEntity.findByPath("parent/child/grandson");
```
### 状态
暂时不使用某实体时,可以通过调用实体的 [isActive](/apis/core/#Entity-isActive) 停止激活,同时该实体下的所有组件都会被**禁用**。
```typescript
newEntity.isActive = false;
```