You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:16:11