游戏开发中的物理之使用Area2D
- 介绍
- 什么是面积?
- 区域属性
- 重叠检测
- 区域影响
- 点重力
- 例子
介绍
Godot提供了许多碰撞对象以提供碰撞检测和响应。试图确定要为您的项目使用哪个选项可能会造成混淆。如果您了解每个问题的工作原理和优点和缺点,则可以避免这些问题并简化开发。在本教程中,我们将查看 Area2D节点并显示一些如何使用它的示例。
注意 本文档假定您熟悉Godot的各种物理机构。请先阅读物理简介。
什么是面积?
Area2D定义2D空间的区域。在此空间中,您可以检测到其他 CollisionObject2D节点重叠,进入和退出。区域还允许覆盖本地物理属性。我们将在下面探讨这些功能。
区域属性
区域具有许多属性,可用于自定义其行为。
前八个属性用于配置区域的物理替代行为。我们将在下面的部分中介绍如何使用它们。
监测和监视的是用来启用和禁用区域。
在“碰撞”部分中,可以配置区域的碰撞层和蒙版。
“音频总线”部分使您可以覆盖该区域中的音频,例如在播放器移动时应用音频效果。
请注意,Area2D扩展了CollisionObject2D,因此它还提供了从该类继承的属性,例如input_pickable。
重叠检测
Area2D节点最常见的用途可能是用于接触和重叠检测。当您需要知道两个物体已触摸但不需要物理碰撞时,可以使用区域来通知您该联系人。
例如,假设我们正在为玩家捡硬币。硬币不是坚固的物体-玩家不能站立或推动它-我们只希望它在玩家触摸时消失。
这是硬币的节点设置:
为了检测重叠,我们将适当的信号连接到Area2d上。使用哪种信号取决于播放器的节点类型。如果播放器在另一个区域,请使用area_entered。但是,假设我们的播放器是一个KinematicBody2D (因此是一种CollisionObject2D类型),那么我们将连接 body_entered信号。
代码语言:javascript复制注意 如果您不熟悉使用信号,请参阅信号的介绍。
public class Coin : Area2D
{
public void OnCoinBodyEntered(PhysicsBody2D body)
{
QueueFree();
}
}
现在我们的玩家可以收集硬币了!
其他一些用法示例:
- 这些区域非常适合击中并造成伤害的子弹和其他射弹,但不需要其他任何物理过程,例如弹跳。
- 在敌人周围使用较大的圆形区域来定义其“检测”半径。当玩家在该区域之外时,敌人无法“看到”它。
- “安全摄像机”-在具有多个摄像机的较大级别上,将区域附加到每个摄像机并在播放器进入时激活它们。
有关在游戏中使用Area2D的示例,请参见您的第一个游戏。
区域影响
区域节点的第二个主要用途是改变物理学。默认情况下,该区域不会执行此操作,但是您可以使用“空间覆盖”属性启用它。当区域重叠时,将按优先级顺序进行处理(优先级较高的区域将首先处理)。有四个替代选项:
- 合并-区域将其值添加到到目前为止已计算的值。
- 替换-替换物理属性的区域,优先级较低的区域将被忽略。
- 组合替换-该区域将其重力/阻尼值添加到到目前为止计算出的所有内容(按优先级顺序),而忽略任何较低优先级的区域。
- Replace-Combine-替换该区域替换到目前为止计算出的所有重力/阻尼,但继续计算其余区域。
使用这些属性,可以创建具有多个重叠区域的非常复杂的行为。
可以覆盖的物理属性是:
- 重力-区域内重力的强度。
- Gravity Vec-重力方向。此向量不需要进行标准化。
- 线性阻尼-物体停止移动的速度-每秒损失的线速度。
- 角阻尼-物体停止旋转的速度-每秒损失的角速度。
点重力
重力点属性使您可以创建“引子”。 该区域的重力将根据Gravity Vec属性给出的点进行计算。 值是相对于Area2D的,因此例如使用(0,0)会将对象吸引到区域的中心。
例子
下面所附的示例项目包含三个区域,说明了物理覆盖。
您可以在此处下载该项目: using_area_2d.zip