Using Area2D

简介

Godot offers a number of collision objects to provide both collision detection and response. Trying to decide which one to use for your project can be confusing. You can avoid problems and simplify development if you understand how each of them works and what their pros and cons are. In this tutorial, we'll look at the Area2D node and show some examples of how it can be used.

注解

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

What is an area?

Area2D定义了二维空间的区域。在这个空间中,您可以检测到其他参考:`CollisionObject2D<class_CollisionObject2D>节点重叠,进入和退出。区域覆盖的本地物理属性。我们将在下面讨论这些功能中的每一个。

Area properties

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

../../_images/area2d_properties.png

前八个属性用于配置区域的物理覆盖行为。我们将在下面一节中介绍如何使用这些内容。

*Monitoring*和*Monitorable*用于启用和禁用该区域检测。

在"碰撞"部分,可以配置区域的碰撞层和掩码。

"音频总线 "部分,允许重写该区域内的音频,例如当玩家移动时的音频效果。

请注意,Area2D扩展了:ref:CollisionObject2D <class_CollisionObject2D>,所以它也提供了从该类继承的属性,例如``input_pickable``。

重叠检测

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

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

Here's the node setup for the coin:

../../_images/area2d_coin_nodes.png

为了检测重叠,在Area2d上连接相应的信号,使用哪个信号取决于玩家的节点类型。如果玩家是另一个区域,就使用``area_entered``,假设播放器是一个``KinematicBody2D``,连接``body_entered``信号。

注解

如果熟悉使用信号,请参阅:ref:`doc_signals`的介绍。

extends Area2D

func _on_Coin_body_entered(body):
    queue_free()
public class Coin : Area2D
{

    public void OnCoinBodyEntered(PhysicsBody2D body)
    {
        QueueFree();
    }
}

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

Some other usage examples:

  • 区域对于子弹和其他弹丸物体来说是非常好用,它可以击中并造成伤害,但不需要其他物理效果,如弹跳。

  • 用敌人周围的一个大圆圈区域设定为 "探测 "半径,当玩家在该区域外时,敌人就无法 "看到 "玩家。

  • “安保摄像头”-在有多个摄像头的大型关卡中,在每个摄像头上附加区域(area),并在玩家进入时激活它们。

See the 您的第一个游戏 for an example of using Area2D in a game.

区域影响

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

  • 合并 - 该区域将其数值加到目前已计算的数值上。

  • 替换--该区域替换物理属性,低优先级区域被忽略。

  • 合并-替换 - 该区域将其重力/阻尼值加到目前为止计算出的所有数值上(按优先顺序),忽略任何较低优先级的区域。

  • 替换-合并 - 该区域替换了目前为止计算的所有重力或阻尼,但继续计算其余区域。

使用这些属性,可以创建具有多个重叠区域的复杂行为。

可以重写的物理属性有:

  • Gravity - Gravity's strength inside the area.

  • 重力 Vec - 重力的方向。此向量不需要归一化。

  • 线性阻尼-物体停止移动的速度-每秒损失的线速度。

  • 角度阻尼-物体停止旋转的速度-每秒损失的角速度。

Point gravity

*重力点*属性允许您创建一个"吸引器"。区域中的重力将按 *重力 Vec*属性给出的点进行计算。值是相对于Area2D而言的,因此例如使用``(0, 0)``将吸引对象到区域中心。

示例

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

../../_images/area2d_override.gif

You can download this project here: using_area_2d.zip