使用 Area2D

前言

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

备注

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

什么是区域?

An Area2D defines a region of 2D space. In this space you can detect other CollisionObject2D nodes overlapping, entering, and exiting. Areas also allow for overriding local physics properties. We'll explore each of these functions below.

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