跳转到内容

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 皮肤
动画
高级帮助
服务器(单例)
平台特定
优化
加密
导出
插件
其他
有用的链接
作者和贡献者
印刷版


<-- 上一个 返回顶部 下一个 -->


华夏公益教科书