跳轉到內容

Godot 遊戲引擎指南/伺服器(單例)

75% developed
來自華夏公益教科書,開放世界開放書籍

Godot 中的伺服器用於低階引擎操作,例如更改聲音的音量,建立碰撞物件等。“伺服器”在這種情況下指的是“單例”(意味著它只加載/建立一次,並且不能複製或例項化)。為了簡單起見,在本頁中,任何使用“單例”一詞都指的是這些伺服器。

節點只是利用單例併為使用者提供高階(更簡單)操作的“事物”,而這些操作僅能實現到一定程度。


以下是基於節點系統的侷限性

  1. 執行時速度較慢
  2. Godot 的原始碼變得稍微複雜
  3. 在不同執行緒中更難控制它們
  4. 需要更多記憶體。


節點系統的優勢是

  1. 更簡單
  2. 不太可能在您的遊戲中造成錯誤
  3. 它不那麼令人困惑,更具吸引力 - 它以其簡單性吸引使用者
  4. 設定節點樹比為所有內容呼叫每個單例的函式更快


您使用高階、低階還是兩者的結合,完全取決於您和您正在製作的遊戲。

有些遊戲只需要單例的功能,因為節點無法提供您需要的功能,或者使用節點來實現該功能過於困難、耗時、計算量大,或者這三者兼而有之。

許多伺服器函式返回或使用 RID(資源 ID)。它們必須儲存在變數中才能保持可修改性。在資源型別(如紋理)的情況下,您必須將資源也作為變數儲存,否則它及其對應的 RID 將被刪除。

有關用法的更多資訊,請參閱 文件

VisualServer

[編輯 | 編輯原始碼]

注意: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 用於低階音訊訪問。它還可以錄製和回放已錄製的音訊。這在遊戲中實現語音聊天時很有用。

AudioServer 不使用 RID。


Clipboard

待辦事項
我不知道如何使用此伺服器。請幫忙!


PhysicsServer

[編輯 | 編輯原始碼]

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

Physics2DServer

[編輯 | 編輯原始碼]

PhysicsServer 的 2D 版本。它的使用方法完全相同,但某些值可能需要調整,例如將 Vector3s 調整為 Vector2s。

ARVRServer

[編輯 | 編輯原始碼]

ARVRServer 或 XRServer 是 Godot 高階 XR 解決方案的核心,處理所有處理。


另請參閱:XR Godot 教程

CameraServer

[編輯 | 編輯原始碼]

CameraServer 不用於跟蹤 Camera 節點,不像它聽起來那樣。它是一個用於使用外部攝像頭的伺服器。就像您手機背面的攝像頭。它可以拍照,但主要用於 AR。

此伺服器不使用 RID。


Clipboard

待辦事項
我不知道如何使用此伺服器。請幫忙!



Godot 遊戲引擎指南

入門 [編輯]
安裝
什麼是節點?
程式設計
資源和匯入
訊號和方法
你的第一個遊戲
讓它工作
除錯
輸入
物理
儲存和載入
多人遊戲
讓它看起來更好
UI 皮膚
動畫
高階幫助
伺服器(單例)
平臺特定
最佳化
加密
匯出
外掛
其他
有用的連結
作者和貢獻者
印刷版


<-- 上一個 返回頂部 下一個 -->


華夏公益教科書