GameObject 节点与 Godot 中常用作根节点的节点
在 Godot 中,可以使用多种类型的节点作为游戏对象的根节点。然而,目前 ACTION GAME MAKER 的视觉脚本必须将 GameObject 节点用作根节点。
ACTION GAME MAKER 的 GameObject 节点基于 Godot 的 CharacterBody2D,其基本行为也类似。
另一方面,Godot 中还有其他包含“Body”的节点,例如:
- StaticBody2D
- AnimatableBody2D
- RigidBody2D
此外,有时也会使用 Area2D 作为根节点。
那么,GameObject(即 CharacterBody2D)与这些节点之间具体有哪些区别呢?本手册将对此进行说明。
带“Body”名称的节点与不带“Body”名称的节点的区别
最大的区别在于:
“是否能通过 CollisionShape2D 实现碰撞系统中的碰撞?”
- Body 节点之间,或 Body 节点与瓦片之间可以相互碰撞,产生推挤、碰撞停止或站立在地面等行为。
- 这些行为仅在 Body 节点作为根节点 时才能正确运行。
另一方面,Area2D 无法与 Body 节点或瓦片发生物理碰撞,但可以检测到碰撞事件。
形象地理解:
- Body 节点 → 具有实体的物体
- Area2D → 不具有实体的传感器
这样理解会更清晰。
各 Body 节点的区别
CharacterBody2D(GameObject)
主要用于玩家或敌人等“角色”对象。
由于采用伪物理处理,可以实现推挤和推开等行为。但因为需要持续计算碰撞处理,负载相对较高。
StaticBody2D
用于地面、墙壁等“静止物体”。
可以发生碰撞,但不进行伪物理处理,因此不会被玩家推挤。负载较低的节点。
AnimatableBody2D
是 StaticBody2D 的变种,用于“可移动但不受物理影响”的对象。
不会被其他 Body 节点推挤,但具有移动能力,因此可以被 CharacterBody2D 检测到碰撞。适用于移动平台等。
RigidBody2D
Godot 中用于实现完整物理处理的节点。
通过设置重量、摩擦、反弹等参数,可实现更真实的物理行为。
但与其他 Body 节点碰撞时,其他 Body 节点会被视为“质量为零(或无限大)”,因此 RigidBody2D 可能单方面被推动。
比 CharacterBody2D 的负载更高。
非 Body 节点
Area2D 节点
无法发生碰撞,但可以“检测”碰撞。
例如,无法实现“与瓦片碰撞后自动停止”的行为,但可以通过检测瓦片并用脚本将速度设为 0 来实现。
由于不进行伪物理处理,轻量,适用于道具、可破坏的方块等。
各节点对比表
| 节点名称 | 碰撞处理 | 相互碰撞 | 物理处理 | 处理负载 |
|---|---|---|---|---|
| CharacterBody2D (GameObject) | 有 | 可 | 伪物理 | 中~高 |
| StaticBody2D | 有 | 不可 | 无 | 低 |
| AnimatableBody2D | 有 | 不可 | 无 | 低~中 |
| RigidBody2D | 有 | 可 | 完全物理 | 高 |
| Area2D | 无 | 不可 | 无 | 低 |
目前 ACTION GAME MAKER 仅支持 GameObject(即 CharacterBody2D),但未来将逐步开发支持更轻量的节点。