如何避免Godot启动时调用setget函数初始化导出变量?
解决Godot导出变量重启时触发setter的问题
方案1:在setter中区分加载场景与主动赋值
直接在setter函数内添加判断逻辑,跳过编辑器加载场景阶段的耗时代码:
tool extends Node2D export(int) var example_value=0 setget set_example_value func set_example_value(val): print("Setting example_value=",val) # 仅在非编辑器加载场景时执行耗时代码 # 编辑器加载场景时,Engine.editor_hint为true且get_tree().is_playing()为false if not (Engine.editor_hint and not get_tree().is_playing()): # time/memory consuming code segment here pass example_value=val
原理:Godot重启加载场景时,处于编辑器环境且未进入运行状态,通过Engine.editor_hint和get_tree().is_playing()的组合判断,可以精准识别该场景,从而跳过耗时的精灵生成逻辑。手动修改变量或运行游戏时,会正常执行setter内的业务代码。
方案2:绕过setter直接操作内部变量
Godot会为带setget的变量自动生成以下划线开头的内部变量(例如example_value对应的内部变量为_example_value),直接给该内部变量赋值即可绕过setter函数:
# 恢复值时直接赋值内部变量,不触发setter _example_value = 3
若需在节点初始化时自动恢复值,可将这段代码放在_ready或_enter_tree方法中,启动时仅恢复变量值,不会执行setter内的耗时逻辑。
方案3:分离导出变量与逻辑变量
将用于持久化保存值的导出变量和带业务逻辑的变量拆分,避免加载时触发setter:
tool extends Node2D # 用于保存值的导出变量,无setget逻辑 export(int) var saved_example_value = 0 # 实际业务使用的变量,带setget var example_value = 0 setget set_example_value func _ready(): # 初始化时直接给内部变量赋值,绕过setter _example_value = saved_example_value func set_example_value(val): print("Setting example_value=",val) # time/memory consuming code segment here example_value = val # 同步保存值,确保下次重启能恢复 saved_example_value = val
原理:重启时Godot仅加载saved_example_value的值,不会触发任何setter。_ready方法内直接给example_value的内部变量赋值,完成值的恢复。后续手动修改example_value时,setter会同步更新saved_example_value,保证值能持久保存。
内容的提问来源于stack exchange,提问作者cak3_lover
相关产品推荐
相关产品推荐

