生命周期 - 循环执行周期
上一节认识的生命周期每个节点只会触发一次,下面这两个周期方法会在节点存在时反复执行。
_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
。熟练掌握这三个生命周期即可实现绝大多数效果。