金币、钥匙、终点门,都是「谁进来了」而不是「谁堵住了」。用 Area2D,不要用 CharacterBody2D。
金币场景
根:Area2D(脚本) 子:Sprite2D、CollisionShape2D、可选 AudioStreamPlayer
监控层勾 player,让玩家身体能进区域。
gdscript
extends Area2D
signal collected
func _ready() -> void:
body_entered.connect(_on_body_entered)
func _on_body_entered(body: Node2D) -> void:
if not body.is_in_group("player"):
return
collected.emit()
queue_free()玩家根节点加到组 player(节点面板 → 组)。
分数放哪
主场景挂一个 Game 脚本记分:
gdscript
var score := 0
func _ready() -> void:
for coin in get_tree().get_nodes_in_group("coins"):
coin.collected.connect(_on_coin)
func _on_coin() -> void:
score += 1
$UI/Score.text = str(score)金币场景根也加组 coins。
信号从物走向局,不要让玩家 get_overlapping_areas() 每帧扫描。微型游戏里这也是后面做成就、音效的挂钩点。
