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,則影格間隔可能經過後期處理。