Godot如何仅通过代码将脚本配置为Autoload自动加载
Godot 纯代码实现无编辑器配置的Autoload方案
Autoload全局单例的本质是引擎启动时自动实例化、挂载到场景树根节点、切换场景不销毁的常驻节点,完全可以通过代码实现全流程配置,不需要打开编辑器的Autoload设置面板手动添加。
核心实现步骤
1. 编写全局单例脚本
首先新建你要作为全局调用的脚本,比如命名为GlobalManager.gd,正常写你需要的全局变量、函数即可:
extends Node # 示例全局变量 var global_config = {"version": "1.0", "debug_mode": true} # 示例全局函数 func show_global_tip(content:String): print("[全局提示] ", content)
2. 纯代码注册单例(无需编辑器操作)
你不需要在编辑器Autoload列表手动添加这个脚本,只需要在项目默认启动场景的根节点脚本中,添加对应版本的注册逻辑,保证单例在所有其他业务逻辑执行前完成加载即可。
Godot 4.x 注册代码
# 这里的继承类型和你启动场景根节点保持一致,比如启动场景是Node2D就写extends Node2D extends Node func _init(): # 防重复注册 if Engine.has_singleton("GlobalManager"): return # 加载单例脚本,路径替换成你实际存放GlobalManager.gd的res路径 var singleton_script = load("res://GlobalManager.gd") var singleton_inst = singleton_script.new() singleton_inst.name = "GlobalManager" # 挂载到场景树最顶层root节点,和手动配置的Autoload层级完全一致 get_tree().root.add_child(singleton_inst) # 注册到引擎全局单例表,后续可以直接用类名访问 Engine.register_singleton("GlobalManager", singleton_inst)
Godot 3.x 注册代码
3.x版本没有独立的单例注册API,只要把节点挂载到root节点、设置为常驻不销毁即可实现同等效果:
extends Node func _enter_tree(): # 防重复加载 if has_node("/root/GlobalManager"): return var singleton_script = load("res://GlobalManager.gd") var singleton_inst = singleton_script.new() singleton_inst.name = "GlobalManager" # 设置切换场景不销毁 singleton_inst.set_autoreload(true) get_tree().root.add_child(singleton_inst)
跨脚本调用方式
注册完成后,你在任意其他脚本文件中,都可以像调用手动配置的Autoload一样直接访问,不需要额外引用、获取节点:
# 任意第二个脚本、任意业务逻辑里的代码 func _ready(): # 读取全局变量 print(GlobalManager.global_config.version) # 调用全局函数 GlobalManager.show_global_tip("单例调用成功")
注意事项
- 注册逻辑必须放在项目最先执行的生命周期中:Godot4推荐写在启动场景根节点的
_init()方法,Godot3推荐写在_enter_tree()方法,保证所有其他节点执行_ready()逻辑前单例已经加载完成,避免空引用报错 - 单例脚本不要手动挂载到任意场景的节点上,防止重复实例化
load()方法内的资源路径要和你实际存放单例脚本的res路径一致- 如果需要更高的执行优先级,也可以把注册逻辑放到自定义编辑器插件的启动逻辑中,普通游戏项目用启动场景注册的方式完全够用
内容的提问来源于stack exchange,提问作者Résu
相关产品推荐
相关产品推荐

