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.

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))

方法

void

_finalize() virtual

void

_initialize() virtual

bool

_physics_process(delta: float) virtual

bool

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