使用 Area2D

前言

Area2D 节点, 并展示一些如何使用它的例子. 注解 物理介绍 .

什么是area?

CollisionObject2D 节点的重叠, 进入和退出. 区域(Area)还允许覆盖本地物理属性. 我们将在下面讨论这些功能中的每一个.

Area属性

区域有许多属性可用于自定义它们的行为. 前八个属性用于配置区域的物理覆盖行为. 我们将在下面一节中介绍如何使用这些内容. MonitoringMonitorable 用于启用和禁用该区域检测. 在 “碰撞(Collision)” 部分, 可以配置区域的碰撞层和掩码. “音频总线 (Audio Bus)” 部分, 允许重写该区域内的音频, 例如当玩家移动时的音频效果. CollisionObject2D, 所以它也提供了从该类继承的属性, 例如 input_pickable .

重叠检测

也许Area2D节点最常见的用途是用于触碰和重叠检测. 当需要知道两个物体已经触碰, 但不需要物理碰撞时, 可以使用一个区域来通知. 例如, 要做一个硬币让玩家去捡. 硬币并不是一个实心的物体, 玩家不能站在上面, 也不能推它, 只是想让它在玩家触碰它的时候消失. 这是硬币节点的设置: area_entered . 然而假设玩家是一个 KinematicBody2D (因此也是一个 CollisionObject2D 类型), 将连接 body_entered 信号. 注解 Using Signals 的介绍. GDScript C#

  1. extends Area2Dfunc _on_Coin_body_entered(body): queue_free()
  1. public class Coin : Area2D{ public void OnCoinBodyEntered(PhysicsBody2D body) { QueueFree(); }}

现在我们的游戏角色可以收集硬币了! 其他一些使用实例:

  • 区域对于子弹和其他弹丸物体来说是非常好用, 它可以击中并造成伤害, 但不需要其他物理效果, 如弹跳.
  • 用敌人周围的一个大圆圈区域设定为 “探测” 半径, 当玩家在该区域外时, 敌人就无法 “看到” 玩家.
  • “安保摄像头” - 在有多个摄像头的大型关卡中, 在每个摄像头上附加区域(area), 并在玩家进入时激活它们. Your first 2D game for an example of using Area2D in a game.

    区域影响

    空间重写(Space Override) 属性启用这个功能. 当区域重叠时, 它们会按照 优先级(Priority) 的顺序进行处理(优先级较高的区域会被优先处理). 重写有四个选项:
  • 合并(Combine) - 该区域将其数值加到目前已计算的数值上.
  • 替换(Replace) - 该区域替换物理属性, 低优先级区域被忽略.
  • 合并-替换 (Combine-Replace) - 该区域将其重力/阻尼值加到目前为止计算出的所有数值上(按优先顺序), 忽略任何较低优先级的区域.
  • 替换-合并 (Replace-Combine) - 该区域替换了目前为止计算的所有重力或阻尼, 但继续计算其余区域. 使用这些属性, 可以创建具有多个重叠区域的复杂行为. 可以重写的物理属性有:
  • 重力(Gravity) - 区域内的重力强度.
  • 重力向量 (Gravity Vec) - 重力的方向. 此向量不需要归一化.
  • 线性阻尼 (Linear Damp) - 物体停止移动的速度-每秒损失的线速度.
  • 角度阻尼 (Angular Damp) - 物体停止旋转的速度-每秒损失的角速度.

    重力点

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

    示例

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