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。