使用Area2D

简介

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

注解

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

什么是area?

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

Area属性

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

../../_images/area2d_properties.png

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

MonitoringMonitorable 用于启用和禁用该区域检测.

在 “碰撞(Collision)” 部分,可以配置区域的碰撞层和掩码.

“音频总线 (Audio Bus)” 部分,允许重写该区域内的音频,例如当玩家移动时的音频效果.

请注意,Area2D扩展了 CollisionObject2D,所以它也提供了从该类继承的属性,例如 input_pickable .

重叠检测

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

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

这是硬币节点的设置:

../../_images/area2d_coin_nodes.png

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

注解

如果熟悉使用信号,请参阅 信号 的介绍.

GDScript

C#

  1. extends Area2D
  2. func _on_Coin_body_entered(body):
  3. queue_free()
  1. public class Coin : Area2D
  2. {
  3. public void OnCoinBodyEntered(PhysicsBody2D body)
  4. {
  5. QueueFree();
  6. }
  7. }

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

其他一些使用实例:

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

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

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

请参阅 您的第一个游戏 ,了解在游戏中使用Area2D的例子.

区域影响

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

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

  • 替换(Replace) - 该区域替换物理属性,低优先级区域被忽略.

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

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

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

可以重写的物理属性有:

  • 重力(Gravity) - 区域内的重力强度.

  • 重力向量 (Gravity Vec) - 重力的方向.此向量不需要归一化.

  • 线性阻尼 (Linear Damp) - 物体停止移动的速度-每秒损失的线速度.

  • 角度阻尼 (Angular Damp) - 物体停止旋转的速度-每秒损失的角速度.

重力点

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

示例

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

../../_images/area2d_override.gif

你可以在这里下载这个项目 : using_area_2d.zip