触发区域
Area节点定义了三维空间的区域. 在这个空间中, 您可以检测到其他CollisionObject节点的重叠, 进入和退出。区域(Area)还允许覆盖本地物理属性。
创建触发区域
点击 快速创建→触发区域 可以看到触发区域的子菜单,点击后可在场景中创建一个新的Area节点以及初始的碰撞形状(Area节点的子节点)。如下图:
常用参数
Area有许多参数可以定义其行为。
- 前八个属性用于配置区域的物理覆盖行为。比如覆盖设置该区域的重力。
- 监测(Monitoring)和可检测(Monitorable)用于启用和禁用该区域检测。
- 在碰撞(Collision)部分, 可以配置区域的碰撞层和掩码。
- 音频总线 (Audio Bus)部分, 允许重写该区域内的音频, 例如当玩家移动时的音频效果。
- 混响总线 (Reverb Bus)部分,可以设置混响效果。
使用触发区域检测物理碰撞
Area节点最常见的用途是用于触碰和重叠检测. 当需要知道两个物体已经触碰, 但不需要物理碰撞时, 可以使用一个区域来通知。例如, 我们想要实现当物体碰到金币时,金币消失,那么我们可以连接body_entered的信号(如果检测的对象是另外一个Area对象,应该使用area_entered信号),然后在其回调函数中将硬币隐藏掉。
节点结构如下:
脚本内容如下:
extends Area
# Called when the node enters the scene tree for the first time.
func _ready():
self.connect("body_entered", self, "_on_Coin_body_entered")
func _on_Coin_body_entered(body):
queue_free()
tip
可视化编辑器有封装好的空间触发器逻辑单元,实现了上面的功能。
区域影响
区域节点的第二个主要用途是改变物理效果。 默认情况下, 区域不会这样做, 但你可以用空间重写(Space Override)属性启用这个功能。当区域重叠时, 它们会按照优先级(Priority)的顺序进行处理(优先级较高的区域会被优先处理). 重写有四个选项:
- 合并(Combine) - 该区域将其数值加到目前已计算的数值上.
- 替换(Replace) - 该区域替换物理属性, 低优先级区域被忽略.
- 合并-替换 (Combine-Replace) - 该区域将其重力/阻尼值加到目前为止计算出的所有数值上(按优先顺序), 忽略任何较低优先级的区域.
- 替换-合并 (Replace-Combine) - 该区域替换了目前为止计算的所有重力或阻尼, 但继续计算其余区域.
使用这些属性, 可以创建具有多个重叠区域的复杂行为。可以重写的物理属性有:
- 重力(Gravity) - 区域内的重力强度.
- 重力向量 (Gravity Vec) - 重力的方向. 此向量不需要归一化.
- 线性阻尼 (Linear Damp) - 物体停止移动的速度-每秒损失的线速度.
- 角度阻尼 (Angular Damp) - 物体停止旋转的速度-每秒损失的角速度.
重力点 重力点(Gravity Point)属性允许您创建一个"吸引器"。区域中的重力将按重力向量(Gravity Vec)属性给出的点进行计算。值是相对于Area而言的。
如果你想有一个反重力的区域,你可以启用空间重写,然后将重力向量(Gravity Vec)设置为(0,1,0)即可。