Godot中实例化类的正确方式:preload与class_name对比
GDScript 2.0 类实例化方式对比与推荐
两种方式的核心区别
preload/加载脚本方式
- 属于显式依赖,必须指定脚本完整路径,编辑器会提前校验路径有效性,编译阶段完成加载,能避免运行时路径错误。
- 脚本不会全局暴露,只有调用
preload的位置能引用该类,不会污染全局命名空间。 - 可配合
load()实现动态加载(比如根据运行时条件切换不同脚本),而preload()是静态加载,性能更稳定。
class_name关键字方式
- 属于全局注册模式,脚本内声明
class_name后,整个项目任意位置都能直接用类名实例化,无需手动写加载路径。 - 写法更简洁,省去
preload的冗余代码,适合频繁调用的核心类。 - 缺点是会占用全局命名空间,若不同脚本使用相同
class_name,编辑器会直接报冲突错误。
- 属于全局注册模式,脚本内声明
推荐使用场景
优先选
class_name的情况:- 项目中的通用核心类,比如自定义UI组件、工具类、全局管理器这类被多处引用的类,用起来更高效。
- 快速原型开发阶段,追求代码简洁,减少路径书写的麻烦。
优先选
preload的情况:- 仅在局部场景或单个脚本内使用的类,避免全局注册污染命名空间。
- 需要动态加载的场景(比如根据关卡加载不同敌人脚本),可搭配
load()实现;preload()则适合固定依赖的场景。 - 大型项目中,显式的
preload能让依赖关系更清晰,方便后续维护和重构,开发者一眼就能看到依赖的脚本位置。
哪些情况要避免滥用class_name
存在不少场景不能随便用class_name:
- 小型工具类/局部专用类:这类类仅在一两个脚本里用到,全局注册完全没必要,反而增加命名冲突风险。
- 模块化开发场景:如果项目按模块拆分,每个模块内部的类尽量用
preload,避免跨模块的全局依赖,方便模块独立复用或修改。 - 可能重名的类:比如不同模块里都有
DataManager,若都加class_name会直接冲突,这种情况用preload指定路径更安全。
内容的提问来源于stack exchange,提问作者iwek
相关产品推荐
相关产品推荐

