使用 Area2D

前言

Godot提供了许多碰撞对象来提供碰撞检测和响应. 试图决定为你的项目使用哪一个可能会让人感到困惑. 如果你了解它们各自的工作原理以及它们的优点和缺点, 你就可以避免问题并简化开发. 在本教程中, 我们将查看 Area2D 节点, 并展示一些如何使用它的例子.

备注

本文假设你熟悉 Godot 中的各种物理体,否则请先阅读 物理介绍

什么是区域?

Area2D 定义了二维空间的区域。 在这个空间中,你可以检测到其他 CollisionObject2D 节点的重叠,进入和退出。区域 (Area) 还允许覆盖本地物理属性. 我们将在下面讨论这些功能中的每一个。

Area 的属性

区域有许多属性可用于自定义它们的行为.

../../_images/area2d_properties.webp

GravityLinear DampAngular Damp 用于配置区域的物理覆盖行为,我们将在下文的 区域影响 部分介绍如何使用这些属性。

MonitoringMonitorable 用于启用和禁用该区域。

Audio Bus 部分 ,允许覆盖该区域内的音频,例如玩家移动时的音频效果。

注意,Area2D 扩展了 CollisionObject2D,所以它也提供了从该类继承的属性。在 CollisionObject2DCollision 部分,你可以配置该区域的层和遮罩。

重叠检测

也许Area2D节点最常见的用途是用于触碰和重叠检测. 当需要知道两个物体已经触碰, 但不需要物理碰撞时, 可以使用一个区域来通知.

例如, 要做一个硬币让玩家去捡. 硬币并不是一个实心的物体, 玩家不能站在上面, 也不能推它, 只是想让它在玩家触碰它的时候消失.

这是硬币节点的设置:

../../_images/area2d_coin_nodes.webp

为了检测重叠,我们将在 Area2D 上连接相应的信号,使用哪个信号取决于玩家的节点类型。如果玩家是另一个区域(Area2D), 就使用 area_entered。然而当假设玩家是一个 CharacterBody2D (也是一个 CollisionObject2D 类型)时,我们将连接 body_entered 信号.

备注

如果你不熟悉信号的使用,请参阅 使用信号 的介绍。

extends Area2D

func _on_coin_body_entered(body):
    queue_free()

现在我们的游戏角色可以收集硬币了!

其他一些使用实例:

  • 子弹等抛射物使用区域就很合适,命中就会造成伤害,不需要反弹之类的物理效果。

  • 围绕敌人放一个圆形的区域就可以定义他的“检测”半径。玩家位于该区域之外,敌人就无法“看到”玩家。

  • “监控摄像头”——假设一个大型关卡中有多个相机,可以为每个相机都附加一个区域,玩家进入某个区域就激活对应的相机。

游戏中使用 Area2D 的示例请参阅 你的第一个 2D 游戏

区域影响

区域节点的第二个主要用途是改变物理效果。默认情况下区域不会启用这个功能,但你可以用 Space Override(空间覆盖)属性来启用。当区域重叠时,它们会按照 Priority(优先级)的顺序进行处理(优先处理优先级高的区域)。覆盖功能有四个选项:

  • Combine(合并)——区域会将其数值加到目前计算得到的数值上。

  • Replace(替换)——区域会替换物理属性,忽略优先级更低的区域。

  • Combine-Replace(合并后替换)——区域会将重力/阻尼数值加到目前计算得到的数值上(按优先级顺序),忽略优先级更低的区域。

  • Replace-Combine(替换后合并)——区域会替换目前计算得到的重力/阻尼数值,但会继续计算其他区域。

你可以利用这些属性为相互重叠的区域创建非常复杂的行为。

可以覆盖的物理属性有:

  • Gravity(重力)——区域内的重力强度。

  • Gravity Direction(重力方向)——该向量不需要归一化。

  • Linear Damp(线性阻尼)——物体停止移动的快慢——每秒损失的线速度。

  • Angular Damp(角度阻尼)——物体停止旋转的快慢——每秒损失的角速度。

重力点

重力点 (Gravity Point) 属性允许你创建一个“吸引器”。区域中的重力将朝向一个由 点中心 (Point Center) 属性给出的点进行计算。这些值相对于 Area2D,因此例如使用 (0, 0) 将吸引物体到区域的中心。

示例

以下所附中的示例项目包含三个区域, 它们说明了物理重写.

../../_images/area2d_override.gif

你可以在此处下载项目:area_2d_starter.zip