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.
Checking the stable version of the documentation...
MainLoop
继承: Object
派生: SceneTree
游戏主循环的抽象基类。
描述
MainLoop 是 Godot 项目中游戏循环的抽象基类。它被 SceneTree 继承,SceneTree 是 Godot 项目中使用的默认游戏循环的实现,不过也可以编写和使用自己的 MainLoop 子类,来代替场景树。
应用程序启动时必须向操作系统提供一个 MainLoop 实现;否则应用程序将退出。该过程是自动的(会创建 SceneTree),除非从命令行提供了 MainLoop Script(例如 godot -s my_loop.gd)或覆盖了 ProjectSettings.application/run/main_loop_type 项目设置。
以下是实现简单 MainLoop 的示例脚本:
class_name CustomMainLoop
extends MainLoop
var time_elapsed = 0
func _initialize():
print("初始化:")
print(" 开始时间:%s" % str(time_elapsed))
func _process(delta):
time_elapsed += delta
# 返回 true 结束主循环。
return Input.get_mouse_button_mask() != 0 || Input.is_key_pressed(KEY_ESCAPE)
func _finalize():
print("完成:")
print(" 结束时间:%s" % str(time_elapsed))
using Godot;
[GlobalClass]
public partial class CustomMainLoop : MainLoop
{
private double _timeElapsed = 0;
public override void _Initialize()
{
GD.Print("初始化:");
GD.Print($" 开始时间:{_timeElapsed}");
}
public override bool _Process(double delta)
{
_timeElapsed += delta;
// 返回 true 结束主循环。
return Input.GetMouseButtonMask() != 0 || Input.IsKeyPressed(Key.Escape);
}
private void _Finalize()
{
GD.Print("完成:");
GD.Print($" 结束时间:{_timeElapsed}");
}
}
方法
void |
_finalize() virtual |
void |
_initialize() virtual |
_physics_process(delta: float) virtual |
|
信号
on_request_permissions_result(permission: String, granted: bool) 🔗
当用户对权限请求作出反应时发出。
常量
NOTIFICATION_OS_MEMORY_WARNING = 2009 🔗
当应用程序超过其分配的内存时,从操作系统收到的通知。
仅限 iOS 平台。
NOTIFICATION_TRANSLATION_CHANGED = 2010 🔗
当翻译可能发生变化时收到的通知。会在用户改变区域设置时触发。可以用来响应语言的变化,例如实时改变 UI 字符串。可配合内置的翻译支持使用,比如 Object.tr()。
NOTIFICATION_WM_ABOUT = 2011 🔗
当发出“关于”信息请求时,从操作系统收到的通知。
仅限 macOS 平台。
NOTIFICATION_CRASH = 2012 🔗
当引擎即将崩溃时,从Godot的崩溃处理程序收到的通知。
如果崩溃处理程序被启用,这只会在桌面平台上实现。
NOTIFICATION_OS_IME_UPDATE = 2013 🔗
当输入法引擎发生更新时,从操作系统收到的通知(例如,IME 光标位置或组成字符串的变化)。
已在桌面平台和 web 平台上实现。
NOTIFICATION_APPLICATION_RESUMED = 2014 🔗
当应用程序恢复时,从操作系统收到的通知。
具体针对 Android 和 iOS 平台。
NOTIFICATION_APPLICATION_PAUSED = 2015 🔗
应用程序暂停时从操作系统收到的通知。
特定于 Android 和 iOS 平台。
注意:在 iOS 上,你只有大约 5 秒时间来完成由该信号启动的任务。如果你超过了该分配,则 iOS 将终止该应用程序而不是暂停它。
NOTIFICATION_APPLICATION_FOCUS_IN = 2016 🔗
当应用程序获得焦点时从操作系统收到的通知,即焦点将从操作系统桌面或第三方应用程序更改为 Godot 实例的任何一个打开窗口时。
在桌面和移动平台上实现。
NOTIFICATION_APPLICATION_FOCUS_OUT = 2017 🔗
当应用程序失去焦点时从操作系统收到通知,即焦点将从 Godot 实例的任何一个打开窗口,更改为操作系统桌面或第三方应用程序时。
在桌面和移动平台上实现。
NOTIFICATION_TEXT_SERVER_CHANGED = 2018 🔗
文本服务器被更改时,收到的通知。
NOTIFICATION_APPLICATION_PIP_MODE_ENTERED = 2019 🔗
当应用程序进入画中画模式时收到的通知。
NOTIFICATION_APPLICATION_PIP_MODE_EXITED = 2020 🔗
当应用程序退出画中画模式时收到的通知。
方法说明
void _finalize() virtual 🔗
在程序退出前调用。
void _initialize() virtual 🔗
在初始化时调用一次。
bool _physics_process(delta: float) virtual 🔗
每个物理周期调用一次。delta 是物理周期之间的逻辑时间,单位为秒,等于 Engine.time_scale / Engine.physics_ticks_per_second。等价于 Node._physics_process()。
实现后,该方法必须返回布尔值。true 会终止主循环,而 false 则会允许其进入下一步。
注意:_physics_process() 每(空闲)帧最多只能调用 Engine.max_physics_steps_per_frame 次。引擎遭遇性能问题时可能触及该限制。
注意:对 delta 进行累加可能与现实世界的秒数存在偏差。
bool _process(delta: float) virtual 🔗
每个空闲帧调用一次,调用时机在渲染之前、所有物理帧处理完毕之后。delta 是帧与帧之间的时间,单位为秒。等价于 Node._process()。
实现后,该方法必须返回布尔值。true 会终止主循环,而 false 则会允许其进入下一帧。
注意:引擎遭遇帧率下降时,delta 会增大。delta 增大时,最大值为 Engine.time_scale * Engine.max_physics_steps_per_frame / Engine.physics_ticks_per_second。因此,对 delta 进行累加可能与现实世界的秒数存在偏差。
注意:如果启用了 --fixed-fps 或者在 Movie Maker 模式下运行(见 MovieWriter),每帧的处理 delta 都相同,与该帧的渲染耗时无关。
注意:如果项目启用了 OS.delta_smoothing,则帧间隔可能经过后期处理。