Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

在本课中,我们将使用之前创建的可收集物品逻辑来触发游戏中的一个动作。

作为示例,我们将制作一扇阻挡玩家路径的门,只有在地图上的所有物品都被收集后,该门才会从场景中移除。

这是一个非常常见的游戏结构:玩家完成一个目标,游戏随后通过解锁某样东西来作出反应。它可以是一扇门,一个平台,一个电梯,一个桥,一段过场动画,一个boss战,或任何其他的进度事件。

在本课中,您将学习如何从一个实体的逻辑中访问和操作另一个实体。在这种情况下,玩家将检查收集进度,然后从场景中移除门。

1. 创建移除门的逻辑

让我们首先为我们的门创建一个新的实体模板

配置用于其视觉表现的网格,并添加一个物理组件,这样门就可以阻挡玩家的通过。

由于门应该阻止角色穿过它,请不要在物理组件中启用幽灵选项

幽灵物理体能够检测碰撞,但不会物理阻挡移动。对于可收集物品,这正是我们想要的。但对门来说,我们想要的是相反的:玩家在条件满足之前不应能够通过。

通过按下3键,您可以可视化实体的碰撞预览。这有助于确认物理形状是否与门正确匹配。

Cave提供了多种配置物理形状的方法。您可以使用对象自身的网格作为碰撞,导入仅用于物理的不同优化模型,甚至可以使用项目中的任何其他网格作为碰撞形状。

选择最符合您游戏需求和性能的选项。

image.png

我们之前创建的系统已经为我们提供了控制门何时应被移除的确切信息。

它自动计算场景中存在的可收集物品的总数,无论地图上存在多少物品,同时它也跟踪玩家已经收集了多少个。

这使得逻辑非常灵活。我们不需要在每次添加或移除关卡中的物品时手动更改一个数字。计数器将继续正常工作,自动适应场景中可收集物品的数量。

image.png

有了这两条信息——收集的物品和总物品——我们可以简单地比较这两个值。

当收集的物品数量等于地图上的总物品数量时,这意味着玩家找到了所有可收集物品,完成了打开路径所需的目标。

根据这个条件,我们将执行负责从场景中移除门的逻辑,允许玩家向前移动到游戏的下一个区域。

在更新TextCollect后,我们将检查地图上的所有物品是否已经被收集。

要做到这一点,获取已收集物品最大物品属性,并使用一个比较节点来验证这两个值是否相等。

如果条件为真,这意味着玩家在场景中收集了每个可用物品,并完成了解锁进度所需的要求。

image.png

根据此验证,我们可以执行负责移除门的逻辑,并允许访问下一个区域。

为此,我们将访问并操作来自玩家逻辑的实体

首先,获取场景并使用根据名称获取实体节点,传入门实体的名称。在这种情况下,名称是Door

该节点返回一列找到的实体。

然后使用一个获取节点来检索索引0处的元素,该元素对应于找到的第一个实体。

最后,将该实体连接到杀死节点。

当这段逻辑执行时,门将被移除出场景。

image.png

理解这里发生的事情是很重要的。

玩家并不是直接与门作为子实体或父实体相连。而是,玩家获取当前场景,搜索名称为Door的实体,从结果列表中检索它,然后将其移除。

这意味着您可以创建逻辑,使一个对象影响场景中的另一个对象,这对于创建游戏交互是必不可少的。

需要记住的一件事是,根据名称获取实体返回一个列表,因为可能有多个名称相同的实体。在本示例中,我们获取的是索引0,意味着我们使用的是找到的第一个结果。对于这个简单的案例,这是可以的。但在较大的项目中,最好将重要实体名称组织好,或者根据情况使用标签和其他引用。

此逻辑可以以多种不同方式扩展。

在本示例中,我们使用所有物品的集合来移除一扇门,但同样的原则可以应用于您游戏中的几乎所有事件。

除了解除一扇门,您还可以:

  • 移动一个平台
  • 激活一个电梯
  • 播放一个过场动画
  • 启用一个杠杆
  • 开始一个boss战
  • 解锁一个新区域
  • 生成敌人
  • 更改关卡目标

最重要的是理解,您现在具备了使用Cave的可视化逻辑创建目标和奖励所需的工具。

因此,进行一次很好的练习是尝试将这个系统改编成与本课中所示示例不同的内容。您可以创建自己的条件、自己的奖励,并使用到目前为止所学到的一切来探索新的可能性。

image.png