Keep your place in this quest

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

在本课中,我们将使用 Cave Engine 的 Logic Bricks 创建收集物品的逻辑。

你将学习如何检测玩家与可收集物品的碰撞,使用标记识别该物品,从场景中移除它,并更新一个简单的 UI 计数器,显示已收集的物品数量。

这是一个非常常见的游戏系统的开端:物品交互。相同的想法可以扩展创建硬币、钥匙、弹药道具、健康道具、任务物品、增强物品或任何玩家可以收集的其他物体。

1. 创建收集物品的逻辑

在我们 Player 的逻辑中,我们将直接检测与可收集物品的碰撞。

在移动逻辑之后,我们将创建一个负责检测与物品接触并将其从场景中移除的系统。

首先,获取 Entity 并使用 Get Character 访问其 Character Component

从 Character Component,使用 Get Collision With 节点。该节点允许我们基于特定 Tag 检测碰撞。

在这种情况下,我们将使用标签 item,该标签在前一课中分配给我们的可收集物品。

这就是为什么将标签添加到物品是重要的原因。我们可以简单地问玩家是否与任何标记为 item 的物品发生碰撞,而无需检查特定的实体名称。这使逻辑更具灵活性,因为任何具有相同标签的可收集物体都可以被相同的系统检测到。

此检测的结果应连接到 Get 节点,该节点返回碰撞信息,也称为 Collision Info

然后我们获取索引 0,代表第一个检测到的碰撞。

最后,将此结果连接到 Kill 节点,该节点负责从场景中移除一个实体。

将被移除的实体直接来自于 Collision Info。换句话说,被收集的物品作为输入传递给 Kill,使其在被玩家触碰时从场景中消失。

image.png

通过此逻辑,玩家已经可以检测到可收集物品并将其从场景中移除。

实际上,这意味着当玩家触碰一个标记为 item 的实体时,该实体将被收集并从当前场景中删除。

2. 创建可收集的 UI

现在我们需要向玩家展示一个物品确实被收集了。

为此,我们将创建一个简单的 UI 界面,显示:

  • 物品图标
  • 已收集物品的数量
  • 地图上可用物品的总数量

首先,访问 Player Template 并添加一个 Interface 组件,具体是一个 UI Element。该 UI Element 将负责构建我们 HUD 的视觉部分。

从该元素开始,我们将创建并配置可收集物品图标。该图标将作为在玩家屏幕上显示收集信息的视觉基础。

image.png

UI ElementBasic 选项卡中,我们可以配置图标的位置和大小。

通过点击位置属性的锚图标,你可以将其锚定到屏幕的左下角。

在缩放配置中,将参考点锁定在中心,并保持位置和缩放锁定启用。这使得数值是相对的,并且有助于在不同屏幕分辨率下正确适配布局。

最后,将 Layer 值设置为 2。这确保图标将被渲染在优先级较低的其他 UI Elements 之上。

image.png

调整 Scale 值,直到图标达到你想要的大小。

然后使用 Position 值将其放置在屏幕的左侧,或你在界面中喜欢的其他区域。

这些设置允许你精确控制 HUD 中元素的大小和位置。

Behaviour 选项卡中,我们可以删除默认样式并为我们的图标添加自定义 Texture

你还可以调整 Tint 颜色和 Alpha 不透明度,以达到你想要的视觉效果。

9-Slice Scaling 选项用于避免在布局中拉伸图像时发生失真。当启用时,可以根据图标的需要调整其值,使图像即使在调整大小时仍然保持一致。在我们的案例中,我们将不使用 9-Slice,因为我们的图像是一个图标。

image.png

现在让我们创建 3 个新的 Text 类型的界面实体。

它们将负责显示已收集的物品数量和地图上可用物品的总数量。

首先,将第一个 Text 重命名为 TextCollect。该文本将显示玩家收集的物品数量。

然后,第二个 Text 仅包含 “/” 字符,作为 UI 中值之间的视觉分隔符。

最后,将第三个 Text 重命名为 TextMax。这个文本将表示地图上可用物品的最大数量。

image.png

现在访问创建的 UI ElementsText 选项卡。

在此部分,有一个字段可以定义屏幕上将显示的内容。

对于代表物品值的两个文本 TextMaxTextCollect,让我们将初始值保持为 0

作为分隔符的文本应仅包含 “/” 字符,直观地分隔已收集的数量和总数量。

image.png

现在让我们定位 UI 文本,使它们整齐地排列在图标旁边。

  • 首先,定位 TextCollect
  • 然后将 “/” 文本放置在其后。
  • 最后,将 TextMax 放置在斜杠之后。

这样,UI 将被组织成一个进度计,清晰地显示类似于:

已收集物品 / 总物品

例如:

0 / 10

image.png

注意:另外,你也可以创建一个单一实体,并通过逻辑砖编程连接字符串以达到相同的结果。

3. 创建物品计数器逻辑

现在我们需要使 UI 反映已收集的物品。

目前,物品可以从场景中移除,但 UI 仍然不知道玩家收集了任何东西。因此现在我们将实现计数器逻辑。

首先,返回到 Player Logic Brick 并创建一个名为 Collected Item 的新属性,类型为 Int

这个属性将存储玩家在游戏中收集的物品数量。

image.png

此属性的初始值应为 0

在玩家逻辑中,在移除收集的物品的 Kill 节点之后,我们将创建负责更新物品计数的逻辑。

首先,获取 Collected Item 属性。

然后在其当前值上加 +1

最后,将结果设回 Collected Item 属性。

这样,每当玩家收集一个物品时,Collected Item 的值将增加 1,使计数保持更新。

image.png

但是,这个值仍然只存储在属性中。现在我们需要将其显示在 UI 文本中。

在此之后,连接 Set Collected ItemSet Text 节点。

该节点将负责更新界面中显示的文本。

要使用 Set Text,我们需要提供两个信息:

  • 将更新文本的 UI Element Component
  • 新的文本值

由于文本是作为玩家的子实体创建的,我们可以直接通过实体层次访问它们。

为此,使用 Entity,然后 Get Child,提供文本对象的名称。启用 Recursive 选项以确保搜索也发生在玩家的子级中。

然后从找到的实体中获取 UI Element Component

对于文本值,获取 Collected Item 属性,将其转换为 String ,并连接到 Set Text

这样,UI 文本将自动根据玩家属性中存储的相同值更新。

image.png

现在,让我们使表示总物品数量的文本也能正常工作。

仍然在 Player Logic Bricks 中,创建一个名为 Max Item 的新属性,类型为 Int

该属性将存储地图上可供收集的物品的总数量。

image.png

现在,为了在此属性中存储地图上物品的总数量,我们将使用玩家的 On Start 事件。

这个值只需要在游戏开始时计算一次,因为它表示游戏开始时场景中存在的可收集物品数量。

首先,获取游戏 Scene

然后使用节点返回场景中所有 Entities,并根据 item 标签进行过滤。由于该标签仅在我们的可收集物品中存在,这将返回当前地图上所有可收集物品的列表。

使用此 Entities 列表,使用 Size 节点。

Size 节点将返回列表中元素的总数作为整数。这个值正好代表地图上有多少物品。

最后,将此结果设入 Max Item 属性,确保游戏以正确的可收集物品总量启动并存储在属性中。

image.png

现在我们只需将此值发送到 UI 文本。

为此,我们将使用与 已收集物品 相同的逻辑。

获取 最大物品 属性,将其值转换为 字符串,并将其连接到 设置文本 节点。

接下来,通过使用 Player 层次结构中的 获取子元素 来访问与最大物品文本对应的 UI 元素,输入正确的名称,并在必要时启用 递归

最后,将该 UI 元素组件连接到 设置文本

这样,物品的总数量将正确显示在玩家界面中。

image.png

此时,可收集物品系统已经功能正常。

玩家可以使用 item 标签检测可收集物品,从场景中移除它们,增加已收集物品计数器,并更新 UI 以显示已收集数量和地图上可用物品的总量。