游戏开发中的物理之使用Area2D

2021-08-23 17:02:20 浏览数 (2)

游戏开发中的物理之使用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

0 人点赞