Cave:入门指南
理解实体
Lesson 9 of 19 • 25 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
理解实体
现在让我们理解在 Cave 中的 实体 概念。实体是 Cave 场景中的基本对象。
如果场景是一个关卡、菜单或测试空间,那么实体就是存在于该空间中的事物。例如,玩家、敌人、门、灯光、相机、触发器、UI 按钮、声音源和文件夹都可以是实体。
在本课中,您将学习:
- 名称。
- ID。
- 活动状态。
- 亲子关系。
- 文件夹。
- 层级顺序。
- 标签和属性。
- 模板实例。
这些细节听起来微不足道,但当场景从少量对象成长为真实关卡时,它们却会产生重大影响。
什么是实体?
一个 Entity 是场景中的一个对象。
一个实体可以代表:
- 可见的 3D 对象。
- 不可见的助手。
- 游戏触发器。
- UI 元素。
- 声音源。
- 或仅仅是用于组织的文件夹。

例如,一个箱子是一个可见的实体。一个生成点在游戏中可能是不可见的,但它仍然是一个实体,因为它标记了某事应该发生的地方。
Cave 保持这个概念简单:场景是由实体构建的。
实体是组件容器
实体单独并没有太多作用,它们的功能来自于组件。例如:
| 实体 | 可能拥有的组件 |
|---|---|
| 箱子 | 变换、网格、刚体。 |
| 玩家 | 变换、角色、相机、Python、音频。 |
| 门 | 变换、网格、刚体、逻辑砖。 |
| 火把 | 变换、网格、灯光、音频。 |
| 按钮 | 变换、UI 元素、逻辑砖或 Python。 |
| --- |
这就是为什么实体是灵活的。门不是一个完全独立的硬编码对象类型。它是由多个部分组成的实体:一个用于可视化的网格、一个用于阻挡玩家的碰撞、以及用于打开或关闭的逻辑。
当您理解这一点时,构建对象变得更加实用。您不再问“我需要哪种对象类型?”而开始问“这个实体需要哪些组件?”
实体名称
每个实体都有一个名称。您可以从 Scene Graph 的快速编辑菜单或 Properties 选项卡中重命名实体。
值得一提的是,名称首先是为了人类:
- 它们使 Scene Graph 更易于扫描。
- 它们使调试更容易。
- 它们使与团队成员讨论对象变得更加容易。
- 它们帮助您稍后理解自己的场景。
Cave 不要求每个实体的名称唯一。多个实体可以共享相同的名称,这对于重复的对象如石块、金币、箱子或敌人非常有用。
但是,不要将名称视为实体的唯一可靠标识符。
好的名称简单且描述性:
| 弱名称 | 更好的名称 |
|---|---|
Mesh |
木箱 |
Empty |
玩家起始 |
Light |
洞口灯光 |
Folder |
敌人组 |
目标不是让名称华丽。目标是使场景可读。
实体名称还可以在代码中用于将特定实体从场景中提取出来,但由于您已经知道多个实体可以具有相同的名称,因此您还应该意识到,如果通过名称提取实体,如果有多个实体共享该名称,可能会导致一些未定义的行为,因为您无法保证场景会返回哪个实体。它将返回在搜索查询时找到的第一个实体。因此,如果您希望通过代码获取特定对象,比如玩家,请确保您给予其唯一名称。
实体 ID
Cave 通过唯一 ID 内部跟踪实体。
通常,您不需要编辑或担心这些 ID。它们存在的目的是为了使引擎能够可靠地识别实体,即使名称被重复。实际上,唯一 ID 是不可变的,这意味着 您无法更改它们。它们由引擎自动分配。
记住这一点:
| 事物 | 目的 |
|---|---|
| 名称 | 帮助您读取场景。 |
| ID | 帮助 Cave 在内部跟踪对象。 |
如果两个敌人都名为 Enemy,Cave 依然可以在后台区分它们。
实体活动状态
实体可以是活动的或非活动的。

在 Scene Graph 和 Properties 选项卡中,这通过一个眼睛图标的活动控制显示。
| 状态 | 意义 |
|---|---|
| 活动 | 实体正常参与场景。 |
| 非活动 | 实体留在场景中,但被禁用。 |
根据实体及其组件,禁用可能会影响:
- 渲染。
- 物理。
- 逻辑。
- 运行时更新。
- 组件行为。
禁用的实体将不会在任何时候调用其组件更新,而当您禁用一个实体时,它还会调用组件的结束方法,而当您重新启用它时,它将调用组件的开始方法。
您可以安全地假设,禁用的实体将不参与场景的物理计算、逻辑、触发器等。当然,除非您手动查询那些来自场景并忽略它们被禁用的事实。
实用的想法很简单:非活动意味着“保持在这里,但目前不参与。”
禁用与删除
禁用和删除不是同一回事。
| 操作 | 结果 |
|---|---|
| 禁用 | 将实体保留在场景中,但关闭它。 |
| 删除 | 从场景中移除实体。 |
禁用一个实体当您可能想要稍后再次使用它时。 删除一个实体当您确认它应该被移除时。
在测试中,禁用通常更安全。如果一个敌人遭遇感觉太难,可以先禁用几个敌人并测试关卡。如果改变感觉对,就可以稍后清理场景。
实体的父子关系
实体可以被附加到其他实体。
当一个实体有父级时,它成为该父级层级的一部分。如果您移动父级,子级也会随之移动。
亲子关系对于以下情况非常有用:
- 连接到角色的剑。
- 连接到火把的灯光。
- 连接到车辆的相机。
- 在文件夹下组织的一组道具。
- 在父面板下分组的 UI 元素。
亲子关系还会影响变换。子实体的变换是相对于父级层级进行评估的。
这是保持相关对象在一起的最简单方式之一。
文件夹实体
文件夹实体用于组织。当您的场景开始包含许多对象时,它们尤其有用。
根据定义,使实体成为文件夹的关键是它缺少组件,特别是变换和 UI 元素组件,因为如果实体在世界中没有变换且没有 UI 元素,它很可能被用作文件夹。但这主要是一种命名约定,所以请记住。
常见的文件夹组包括:
- 环境。
- 游戏触发器。
- 敌人。
- 道具。
- 灯光。
- UI。
- 音频。
- 调试辅助工具。
文件夹不仅关乎整洁。一个干净的 Scene Graph 可以帮助您更快工作,因为您可以在不搜索数百个松散实体的情况下找到所需对象。
实体的层级顺序
Scene Graph 中实体的顺序对于组织很重要,在某些情况下,它可能还会影响事务的处理或显示。
如果您打开文件夹并看到以下结构,这样较难扫描:
箱子
玩家
灯光
敌人
相机
石头
触发器
但这更容易:
玩家
相机
灯光
敌人
环境
游戏触发器
目标不是让层级华丽,而是让它有用。
如果您可以在离开一周后打开一个场景并立即理解重要对象的位置,您的层级结构就是在发挥作用。
这里的一个重要说明:由于引擎优化其内部场景图的方式,顶级实体,即没有任何父级的实体的顺序将是随机的,但子实体的顺序是可以特定设置的,您可以通过右键单击编辑器中的每个单个实体并将其向上或向下、或到最顶部或最底部移动来进行组织。
实体属性和标签
实体可以存储自定义属性和标签。
| 特性 | 目的 |
|---|---|
| 属性 | 存储一个可编辑的值。 |
| 标签 | 添加用于识别或分组的标签。 |
例如,一个敌人可以具有:
- 一个
Damageable标签。 - 一个
health属性。 - 一个
team属性。 - 一个
patrolRadius属性。
脚本和逻辑可以使用这些数据来做出决策。
一个伤害系统可能会查找具有 Damageable 标签的实体。一个敌人脚本可能会读取 patrolRadius 来决定敌人可以游荡的距离。
属性和标签允许您向实体附加游戏含义,而不需要为每小块数据配备一个特殊组件。
标签的查询速度比属性快,因此它们更适合例如识别可接收伤害或是敌人的实体等。但是它们不携带任何值。属性查询较慢,但您可以添加一个值。在编码方面,实体属性实际上就是 Python 字典。
实体模板预览
一些实体是实体模板的实例。例如,您将在默认新 Cave 项目中找到的玩家就是这个模板的一个实例:

模板实例在 Scene Graph 中以不同方式显示,使用 Cave 的模板颜色。这帮助您识别实体来自可重用的模板资产。
当一个实体是模板实例:
- 其内部子项属于模板。
- 放置的实例属于场景。
- 通过打开模板资产可以编辑模板结构。
- 曝露为属性的本地值仍可以调整。
下一课将更详细地解释实体模板。
实体心智模型
将实体视为一个小容器:
- 名称帮助您理解它。
- ID 帮助 Cave 跟踪它。
- 活动状态控制它是否参与。
- 父级控制它属于哪里。
- 组件定义它的功能。
- 属性和标签描述额外的游戏数据。
这就是在 Cave 中构建场景的核心。
一旦实体变得清晰,场景图就不仅仅是对象的列表。它成为您游戏世界的结构。