Viewport
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Viewport
Viewport
节点继承关系
继承链:Node -> Viewport
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
Viewport 是 Godot 渲染系统的核心概念。你可以把它理解为一个"独立的相机取景器"——每个 Viewport 都有自己的世界(World2D/World3D)和相机,独立渲染画面。
游戏的主屏幕就是一个 Viewport(由 Godot 自动创建的根 Viewport)。你可以创建额外的 Viewport 来渲染不同的内容(比如小地图、后视镜等)。
简单说:Viewport 就是一个"独立的小屏幕",有自己的世界和相机。
使用频率:★★★ 一般常用
节点用途
- 渲染管理:管理游戏世界的渲染
- 多视口:主游戏画面 + 小地图 + 后视镜
- 独立世界:每个 Viewport 有自己的物理世界和渲染世界
- 离屏渲染:在后台渲染内容,用作纹理
使用场景
| 场景 | 说明 |
|---|---|
| 主游戏画面 | 根 Viewport 渲染主游戏画面 |
| 小地图 | 额外的 SubViewport 渲染俯瞰地图 |
| 后视镜 | SubViewport 渲染车后视角 |
| 分屏游戏 | 多个 Viewport 实现分屏 |
常用节点搭配
| 搭配节点 | 搭配方式 |
|---|---|
| Camera2D / Camera3D | 放在 Viewport 中定义视角 |
| SubViewport | 继承自 Viewport,用于嵌入渲染 |
| Window | 继承自 Viewport,用于创建操作系统窗口 |
生效必备素材/资源
Viewport 通常配合 Camera2D 或 Camera3D 使用。
节点属性与信号
属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
| world_2d | World2D | — | Viewport | 2D世界资源,管理2D物理和渲染 |
| world_3d | World3D | — | Viewport | 3D世界资源,管理3D物理和渲染 |
| render_target_update_mode | int | 3 | Viewport | 渲染目标更新模式 |
| transparent_bg | bool | false | Viewport | 背景是否透明 |
| canvas_transform | Transform2D | — | Viewport | 画布变换(用于缩放和偏移) |
| global_canvas_transform | Transform2D | — | Viewport | 全局画布变换 |
信号
| 信号 | 参数 | 说明 |
|---|---|---|
| size_changed | — | 视口大小改变时触发 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
| GetCamera2D() | Camera2D | 获取当前活跃的2D相机 |
| GetCamera3D() | Camera3D | 获取当前活跃的3D相机 |
| GetVisibleRect() | Rect2 | 获取可见区域 |
| GetMousePosition() | Vector2 | 获取鼠标在视口中的位置 |
| PushInput(event) | void | 向视口发送输入事件 |
代码示例
C
// C# - 获取视口信息
using Godot;
public partial class ViewportInfo : Node
{
public override void _Process(double delta)
{
var viewport = GetViewport();
GD.Print($"视口大小: {viewport.Size}");
GD.Print($"鼠标位置: {viewport.GetMousePosition()}");
GD.Print($"可见区域: {viewport.GetVisibleRect()}");
var camera2D = viewport.GetCamera2D();
if (camera2D != null)
{
GD.Print($"相机位置: {camera2D.Position}");
}
}
}GDScript
# GDScript - 获取视口信息
extends Node
func _process(_delta):
var viewport = get_viewport()
print("视口大小: %s" % str(viewport.size))
print("鼠标位置: %s" % str(viewport.get_mouse_position()))
print("可见区域: %s" % str(viewport.get_visible_rect()))
var camera_2d = viewport.get_camera_2d()
if camera_2d:
print("相机位置: %s" % str(camera_2d.position))