生命周期 - 循环执行周期

上一节认识的生命周期每个节点只会触发一次,下面这两个周期方法会在节点存在时反复执行。

_process

我们都知道游戏画面是一帧一帧显示的,那这个 _process 就是每个画面帧时执行了。

这个方法还需要有个参数,Godot 给的默认参数名是 delta,它表示当前帧和上一帧之间间隔的时长,单位是秒。

_physics_process

类似画面帧,游戏中进行物理效果模拟时也是一帧一帧进行的,不过这个帧不等于画面帧,Godot 默认是每秒 60 物理帧,同样他也有个 delta 参数,表示上一个物理帧与当前物理帧之间的间隔时长。

画面帧和物理帧

画面帧和物理帧就是指 _process_physics_process

当我们处理一些画面显示相关的逻辑,例如按钮动画、视角移动等,建议使用 _process,这能保证每次画面刷新时都能看到流畅的画面变化。

如果要处理一些物理相关的逻辑,例如玩家移动、开门关门等,一定要使用 _physics_process,因为物理碰撞、摩擦等运算都是在物理帧进行的,如果某个物体在画面帧中移动,可能会导致物理帧中处理不到这次移动信息,从而影响物理模拟的真实性。

delta

两个 process 生命周期都有个 delta 参数,使用这个方法可以平衡不同帧率对游戏的影响。

例如现在我有一个配置极高的电脑,可以保证 _physics_process 方法每秒执行 60 次,而你的电脑比较垃圾,只能保证 _physics_process 方法每秒执行 30 次。

然后这个游戏里有一段这样的代码:

func _physics_process(delta):
    position.x += 1

很明显,我会每秒移动 60 单位,因为我的电脑在一秒钟内执行了 60 次 _physics_process,而你一秒钟只能移动 30 次。

这时结合 delta 参数,让上面的代码变成:

func _physics_process(delta):
    position.x += 60 * delta

这时,由于 delta 有“电脑越差数值越高”的特点,修改后的代码可以保证咱俩每秒都能移动 60 的单位。

[!note] 常用生命周期

最常用的生命周期就这三个: _ready _process _physics_process

熟练掌握这三个生命周期即可实现绝大多数效果。