Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

逻辑偏好

有没有想过应该用数据结构Y还是Z, 来处理问题X ?本文涵盖了与这些困境有关的各种主题.

先添加节点还是先修改属性?

运行时使用脚本初始化节点时,你可能需要对节点的名称、位置等属性进行修改。常见的纠结点在于,你应该什么时候去修改?

最佳实践是在节点加入场景树之前修改取值。部分属性的 setter 代码会更新其他对应的值,可能会比较慢!大多数情况下,这样的代码不会对游戏的性能产生影响,但对于程序式生成之类的重型使用场景,就可能让游戏卡成 PPT。

综上,最佳的做法就是先为节点设置初始值,然后再把它添加到场景树中。

加载 VS 预加载

在 GDScript 中,存在全局 preload 方法。它尽可能早地加载资源,以便提前进行“加载”操作,并避免在执行性能敏感的代码时加载资源。

其对应的 load 方法只有在执行 load 语句时才会加载资源。也就是说,它将立即加载资源。所以,在敏感进程中加载资源会造成速度减慢。 load() 函数是可以被 所有 脚本语言访问的 ResourceLoader.load(path) 的别名。

那么, 预加载和加载到底在什么时候发生, 又应该什么时候使用这两种方法呢?我们来看一个例子:

# my_buildings.gd
extends Node

# Note how constant scripts/scenes have a different naming scheme than
# their property variants.

# This value is a constant, so it spawns when the Script object loads.
# The script is preloading the value. The advantage here is that the editor
# can offer autocompletion since it must be a static path.
const BuildingScn = preload