求助:Godot自动加载GD脚本变量值无法正确同步的问题
Godot自动加载脚本调用变量值不一致问题
将一段GD脚本设置为自动加载后,遇到以下问题:在另一个脚本中调用Morton.morton_statetest始终返回0;同时在Morton脚本和调用它的脚本中分别添加打印语句后,两者输出的变量值完全不一致,但终端没有任何错误提示。
相关代码如下:
extends AnimatedSprite2D var morton_statetest := 0 var rng := RandomNumberGenerator.new() var running := false var morton_hall_trigered := false @onready var morton_hall_spr := self var animatronic := "morton" var morton_position := 99 func _process(_delta: float) -> void: #SUPER SPAGUETTI if morton_statetest == 0: morton_position = 99 elif morton_statetest == 1: morton_position = 6 elif morton_statetest == 2: morton_position = 7 elif morton_statetest == 3: morton_position = 4 elif morton_statetest == 4: morton_position = 5 elif morton_statetest == 5: morton_position = 0 func _on_morton_timer_movement_timeout() -> void: if morton_statetest <= 4 && Global.alive == true: var numero_aleatorio_morton = rng.randi_range(1, 21) if numero_aleatorio_morton < Global.dificulty_morton: get_node("/root/Night 1/Camera2D/Ui/Estatica_spr").modulate.a = 1 morton_statetest += 1 print("morton state: ", morton_statetest) print("morton position: ", morton_position) await get_tree().create_timer(0.5).timeout get_node("/root/Night 1/Camera2D/Ui/Estatica_spr").modulate.a = 0.2
问题分析与解决方法
核心原因:多实例冲突
你的Morton脚本继承自AnimatedSprite2D(节点类型),设置为自动加载后,Godot会在/root下生成一个全局实例;但如果你的场景中还放置了另一个Morton节点,就会出现两个独立的实例。你在定时器回调中修改的是场景实例的morton_statetest,而另一个脚本调用的是自动加载的全局实例的变量,自然值不一致。具体排查与修复步骤
- 检查自动加载配置:打开项目设置→自动加载,确认Morton脚本的加载路径,全局实例的路径通常是
/root/[你的脚本名]。 - 确认操作的是同一个实例:
- 在
_on_morton_timer_movement_timeout函数中添加print(self.get_path()),查看当前修改变量的实例路径,判断是不是全局实例。 - 在调用
morton_statetest的脚本中,不要直接用Morton.morton_statetest,而是通过get_node("/root/Morton").morton_statetest明确访问全局实例的变量(替换成你的自动加载实例实际路径)。
- 在
- 清理冗余实例:如果场景中的Morton节点是多余的,直接删除;如果需要保留,要明确区分全局实例和场景实例的调用方式。
- 补充:
morton_position是在_process中实时更新的,修改morton_statetest后立即打印morton_position会得到旧值,需要等待下一帧再打印,不过这不是导致跨脚本值不一致的主因。
- 检查自动加载配置:打开项目设置→自动加载,确认Morton脚本的加载路径,全局实例的路径通常是
内容的提问来源于stack exchange,提问作者Withoutsleep_dev
相关产品推荐
相关产品推荐

