Godot 遊戲引擎指南/伺服器(單例)
| 此頁面或部分是一個未完成的草稿或概要。 您可以幫助 開發工作,或者您可以在 專案室 中尋求幫助。 |
Godot 中的伺服器用於低階引擎操作,例如更改聲音的音量,建立碰撞物件等。“伺服器”在這種情況下指的是“單例”(意味著它只加載/建立一次,並且不能複製或例項化)。為了簡單起見,在本頁中,任何使用“單例”一詞都指的是這些伺服器。
節點只是利用單例併為使用者提供高階(更簡單)操作的“事物”,而這些操作僅能實現到一定程度。
以下是基於節點系統的侷限性
- 執行時速度較慢
- Godot 的原始碼變得稍微複雜
- 在不同執行緒中更難控制它們
- 需要更多記憶體。
節點系統的優勢是
- 更簡單
- 不太可能在您的遊戲中造成錯誤
- 它不那麼令人困惑,更具吸引力 - 它以其簡單性吸引使用者
- 設定節點樹比為所有內容呼叫每個單例的函式更快
您使用高階、低階還是兩者的結合,完全取決於您和您正在製作的遊戲。
有些遊戲只需要單例的功能,因為節點無法提供您需要的功能,或者使用節點來實現該功能過於困難、耗時、計算量大,或者這三者兼而有之。
許多伺服器函式返回或使用 RID(資源 ID)。它們必須儲存在變數中才能保持可修改性。在資源型別(如紋理)的情況下,您必須將資源也作為變數儲存,否則它及其對應的 RID 將被刪除。
有關用法的更多資訊,請參閱 文件。
注意:Godot 中所有視覺元素的 API 將在 Godot 4 中更改
VisualServer 建立了一個 2D “畫布”和一個 3D “場景”,可以將 2D 和 3D 物件提供給它們繪製。除非您使用 Viewport 節點,否則它們不會繪製。
使用 VisualServer.canvas_item_set_parent(<Item RID>, get_canvas()) 將專案新增到主畫布。您可以使用 var canvas=VisualServer.canvas_create() 建立一個畫布以使用其 RID。您可以使用 VisualServer.canvas_item_set_parent(<canvas RID>, <Viewport RID>) 將畫布附加到 Viewport,前提是它尚未附加到任何一個。
對於 3D,使用 VisualServer.scenario_create() 建立一個新的場景,使用 Spatial.get_world().scenario 獲取現有的場景,以及使用 VisualServer.instance_set_scenario(<Item RID>, <Scenario RID>) 將物件/光源新增到場景。
CanvasItems 和 VisualInstance 節點包含允許直接繪製的方法。在 2D 中,您可以繪製圓形和矩形,以及紋理和文字。使用 VisualInstance,您可以將網格繪製到 3D 中。
有用的簡單方法
# Set the textures of the black borders when using stretch_mode ProjectSettings VisualServer.black_bars_set_images(left, top, right, bottom) # Force the screen to update immediately VisualServer.force_draw()
# Attach a new Viewport and disable the root func _ready(): get_viewport().set_attach_to_screen_rect(Rect2()) # Sets the rect to zero size # To get <Viewport RID>, call get_rid() on the chosen Viewport Node VisualServer.set_attach_to_screen_rect(<Viewport RID>, Rect2(0, 0, 600, 600)) # You can also use other sizes and offsets # The reason you must disable the root Viewport is because it is drawn last, # or in other words, drawn over the others. As it has no transparent pixels # in the default settings, it would override every pixel on the screen. # Detach a Viewport from the screen VisualServer.viewport_detach(<Viewport RID>)
使用寬度和高度為 25 繪製紋理的示例
extends Node2D var texture = preload("res://assets/weapons/sword.png") func _ready(): var sprite = VisualServer.canvas_item_create() VisualServer.canvas_item_add_texture_rect(Rect2(0, 0, 25, 25), texture.get_rid()) VisualServer.canvas_item_set_parent(sprite, get_canvas())
AudioServer 用於低階音訊訪問。它還可以錄製和回放已錄製的音訊。這在遊戲中實現語音聊天時很有用。
AudioServer 不使用 RID。
用於 3D 物理的伺服器。
物理伺服器用於建立區域和物體,但不會將它們放置在場景樹上。
以下程式碼建立了一個高度為 5 個單位、厚度為 0.5 個單位、寬度為 4 個單位的牆壁,並將其新增到物理空間。
extends Spacial func _ready(): var wall = PhysicsServer.body_create(0) var shape = PhysicsServer.shape_create(PhysicsServer.SHAPE_BOX) PhysicsServer.shape_set_data(shape, Vector3(0.5, 5, 4)) PhysicsServer.body_add_shape(body, shape) PhysicsServer.body_set_space(body, get_world().space)
PhysicsServer 的 2D 版本。它的使用方法完全相同,但某些值可能需要調整,例如將 Vector3s 調整為 Vector2s。
ARVRServer 或 XRServer 是 Godot 高階 XR 解決方案的核心,處理所有處理。
另請參閱:XR Godot 教程。
CameraServer 不用於跟蹤 Camera 節點,不像它聽起來那樣。它是一個用於使用外部攝像頭的伺服器。就像您手機背面的攝像頭。它可以拍照,但主要用於 AR。
此伺服器不使用 RID。

