Godot 4(3D)多Checkpoint系统:位置无法更新问题求助
问题根源
你错误地将Checkpoint节点的脚本设为自动加载——自动加载的单例与场景中的Checkpoint节点实例是完全独立的对象:当角色进入区域时,修改的是节点实例自身的check_point_pos,但加载时调用的是自动加载单例的check_point_pos(始终为初始的Vector3.ZERO),因此角色会回到原点。
修复方案
1. 创建全局Checkpoint管理单例
新建脚本CheckpointManager.gd,作为全局单例统一管理存档位置:
extends Node var current_checkpoint_pos: Vector3 = Vector3.ZERO func save_checkpoint(pos: Vector3) -> void: current_checkpoint_pos = pos
在项目设置→自动加载中添加该脚本,命名为CheckpointManager(方便全局调用)。
2. 修改Checkpoint节点脚本
取消原Checkpoint脚本的自动加载,保留其作为Area3D节点的脚本,修改为:
extends Area3D func _on_area_entered(body: Node3D) -> void: # 仅响应玩家角色(可根据你的角色节点名称/类型调整判断条件) if body.name == "Player": print("Checkpoint saved") # 用global_position确保获取世界空间坐标 CheckpointManager.save_checkpoint(global_position)
注意:需确保Area3D节点已将area_entered信号连接到_on_area_entered函数(编辑器右键节点→连接信号即可)。
3. 角色加载逻辑修改
在角色脚本中,调整加载代码从全局单例获取存档位置:
func _physics_process(delta: float) -> void: # 用is_action_just_pressed避免按住按键时持续重置位置 if Input.is_action_just_pressed("load_checkpoint"): global_position = CheckpointManager.current_checkpoint_pos
额外注意事项
- 确认Checkpoint节点的检测层与角色的碰撞层设置匹配,确保
area_entered信号能正常触发。 - 若需要默认出生点,可在
CheckpointManager的_ready()函数中初始化current_checkpoint_pos为初始位置。
内容的提问来源于stack exchange,提问作者Piramyxed
相关产品推荐
相关产品推荐

