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

如何避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:55:20