GFViewportUtility¶
API Reference / Standard / 类索引
- 路径:
addons/gf/standard/utilities/display/gf_viewport_utility.gd - 模块:
Standard - 继承:
GFUtility - API:
public - 类别:运行时服务 (
runtime_service) - 首次版本:
3.17.0
通用 SubViewport 布局管理工具。 用于本地多人、调试监视器、小地图或多视角预览等场景。它只管理 Viewport 容器、相机挂载和后处理材质,不接管玩家、场景切换或输入规则。
成员概览¶
| 类型 | 名称 | 签名 |
|---|---|---|
| 信号 | split_screen_configured |
signal split_screen_configured(viewports: Array) |
| 信号 | split_screen_cleared |
signal split_screen_cleared |
| 属性 | viewport_resolution_scale |
var viewport_resolution_scale: float = 1.0: |
| 属性 | default_disable_3d |
var default_disable_3d: bool = false |
| 属性 | default_transparent_bg |
var default_transparent_bg: bool = false |
| 方法 | setup_split_screen |
func setup_split_screen(root: Control, viewport_count: int, options: Dictionary = {}) -> Array[SubViewport]: |
| 方法 | clear_split_screen |
func clear_split_screen(free_cameras: bool = false) -> void: |
| 方法 | get_viewport_count |
func get_viewport_count() -> int: |
| 方法 | get_viewports |
func get_viewports() -> Array[SubViewport]: |
| 方法 | get_viewport |
func get_viewport(index: int) -> SubViewport: |
| 方法 | get_container |
func get_container(index: int) -> SubViewportContainer: |
| 方法 | set_viewport_camera |
func set_viewport_camera(index: int, camera: Node) -> bool: |
| 方法 | set_postprocess_material |
func set_postprocess_material(index: int, material: Material) -> bool: |
| 方法 | screen_to_world_ray_3d |
func screen_to_world_ray_3d( camera: Camera3D, screen_position: Vector2, length: float = 1000.0 ) -> Dictionary: |
| 方法 | raycast_from_screen_3d |
func raycast_from_screen_3d( camera: Camera3D, screen_position: Vector2, collision_mask: int = 0xffffffff, length: float = 1000.0, exclude: Array[RID] = [] ) -> Dictionary: |
| 方法 | world_to_screen_3d |
func world_to_screen_3d(camera: Camera3D, world_position: Vector3) -> Vector2: |
| 方法 | world_to_screen_3d_report |
func world_to_screen_3d_report(camera: Camera3D, world_position: Vector3) -> Dictionary: |
| 方法 | world_to_screen_2d |
func world_to_screen_2d(canvas_item: CanvasItem, world_position: Vector2) -> Vector2: |
| 方法 | screen_to_world_2d |
func screen_to_world_2d(canvas_item: CanvasItem, screen_position: Vector2) -> Vector2: |
| 方法 | calculate_control_window_rect |
func calculate_control_window_rect( control_rect: Rect2, viewport_size: Vector2, window_size: Vector2i, options: Dictionary = {} ) -> Dictionary: |
| 方法 | get_control_window_rect |
func get_control_window_rect(control: Control, viewport: Viewport = null) -> Dictionary: |
| 方法 | calculate_safe_area_margins |
func calculate_safe_area_margins( safe_area: Rect2i, window_size: Vector2i, viewport_size: Vector2, extra_margins: Dictionary = {} ) -> Dictionary: |
| 方法 | get_display_safe_area_margins |
func get_display_safe_area_margins(viewport: Viewport = null, extra_margins: Dictionary = {}) -> Dictionary: |
| 方法 | apply_safe_area_margins |
func apply_safe_area_margins(container: MarginContainer, margins: Dictionary) -> bool: |
| 方法 | apply_display_safe_area_margins |
func apply_display_safe_area_margins( container: MarginContainer, viewport: Viewport = null, extra_margins: Dictionary = {} ) -> Dictionary: |
| 方法 | get_debug_snapshot |
func get_debug_snapshot() -> Dictionary: |
| 方法 | tick |
func tick(_delta: float) -> void: |
信号¶
split_screen_configured¶
- API:
public
分屏布局创建完成后发出。
参数:
| 名称 | 说明 |
|---|---|
viewports |
当前 SubViewport 列表副本。 |
结构:
viewports: Array,由分屏布局创建的 SubViewport 实例。
split_screen_cleared¶
- API:
public
分屏布局被清理后发出。
属性¶
viewport_resolution_scale¶
- API:
public
子 viewport 渲染尺寸缩放。1 表示使用配置尺寸。
default_disable_3d¶
- API:
public
新建 SubViewport 是否禁用 3D。
default_transparent_bg¶
- API:
public
新建 SubViewport 是否启用透明背景。
方法¶
setup_split_screen¶
- API:
public
func setup_split_screen(root: Control, viewport_count: int, options: Dictionary = {}) -> Array[SubViewport]:
创建 1 到 4 个 SubViewport 的分屏布局。
参数:
| 名称 | 说明 |
|---|---|
root |
承载布局的 Control。 |
viewport_count |
目标 viewport 数量;小于等于 0 时只清理。 |
options |
可选设置,支持 viewport_size、columns、disable_3d、transparent_bg、stretch。 |
返回:当前 SubViewport 列表副本。
结构:
options: Dictionary,包含 viewport_size: Vector2i 或 Vector2、columns: int、disable_3d: bool、transparent_bg: bool 和 stretch: bool。
clear_split_screen¶
- API:
public
清理当前分屏布局。
参数:
| 名称 | 说明 |
|---|---|
free_cameras |
是否连同已挂载相机一起释放。 |
get_viewport_count¶
- API:
public
获取当前 SubViewport 数量。
返回:viewport 数量。
get_viewports¶
- API:
public
获取当前 SubViewport 列表副本。
返回:viewport 列表。
get_viewport¶
- API:
public
获取指定索引的 SubViewport。
参数:
| 名称 | 说明 |
|---|---|
index |
viewport 索引。 |
返回:SubViewport;不存在时返回 null。
get_container¶
- API:
public
获取指定索引的 SubViewportContainer。
参数:
| 名称 | 说明 |
|---|---|
index |
viewport 索引。 |
返回:SubViewportContainer;不存在时返回 null。
set_viewport_camera¶
- API:
public
将相机挂载到指定 SubViewport。
参数:
| 名称 | 说明 |
|---|---|
index |
viewport 索引。 |
camera |
Camera2D 或 Camera3D 节点。 |
返回:挂载成功返回 true。
set_postprocess_material¶
- API:
public
设置指定 SubViewportContainer 的后处理材质。
参数:
| 名称 | 说明 |
|---|---|
index |
viewport 索引。 |
material |
材质;传 null 可清除。 |
返回:设置成功返回 true。
screen_to_world_ray_3d¶
- API:
public
func screen_to_world_ray_3d( camera: Camera3D, screen_position: Vector2, length: float = 1000.0 ) -> Dictionary:
从屏幕/Viewport 坐标构建 3D 射线。
参数:
| 名称 | 说明 |
|---|---|
camera |
用于投射的 Camera3D。 |
screen_position |
Viewport 内的屏幕坐标。 |
length |
射线长度。 |
返回:包含 ok、origin、direction、end 的字典。
结构:
return: Dictionary,包含 ok: bool、origin: Vector3、direction: Vector3 和 end: Vector3。
raycast_from_screen_3d¶
- API:
public
func raycast_from_screen_3d( camera: Camera3D, screen_position: Vector2, collision_mask: int = 0xffffffff, length: float = 1000.0, exclude: Array[RID] = [] ) -> Dictionary:
从屏幕/Viewport 坐标执行 3D 射线检测。
参数:
| 名称 | 说明 |
|---|---|
camera |
用于投射的 Camera3D。 |
screen_position |
Viewport 内的屏幕坐标。 |
collision_mask |
物理碰撞层掩码。 |
length |
射线长度。 |
exclude |
要排除的 RID 列表。 |
返回:包含射线信息、hit 标记和 result 的字典。
结构:
return: Dictionary,包含物理射线检测得到的 ok、origin、direction、end、hit 和 result。
world_to_screen_3d¶
- API:
public - 首次版本:
8.0.0
将 3D 世界坐标转换为屏幕/Viewport 坐标。
参数:
| 名称 | 说明 |
|---|---|
camera |
用于投影的 Camera3D。 |
world_position |
3D 世界坐标。 |
返回:屏幕坐标;camera 无效时返回 Vector2.ZERO。需要失败原因时使用 world_to_screen_3d_report()。
world_to_screen_3d_report¶
- API:
public - 首次版本:
8.0.0
将 3D 世界坐标转换为结构化屏幕/Viewport 坐标报告。
参数:
| 名称 | 说明 |
|---|---|
camera |
用于投影的 Camera3D。 |
world_position |
3D 世界坐标。 |
返回:投影报告。
结构:
return: Dictionary,包含 ok、reason、screen_position 和 world_position;失败时 screen_position 为 Vector2.ZERO。
world_to_screen_2d¶
- API:
public
将 CanvasItem 所在世界坐标转换为屏幕/Viewport 坐标。
参数:
| 名称 | 说明 |
|---|---|
canvas_item |
参考 CanvasItem。 |
world_position |
2D 世界坐标。 |
返回:屏幕坐标。
screen_to_world_2d¶
- API:
public
将屏幕/Viewport 坐标转换为 CanvasItem 所在世界坐标。
参数:
| 名称 | 说明 |
|---|---|
canvas_item |
参考 CanvasItem。 |
screen_position |
屏幕坐标。 |
返回:2D 世界坐标。
calculate_control_window_rect¶
- API:
public - 首次版本:
8.0.0
func calculate_control_window_rect( control_rect: Rect2, viewport_size: Vector2, window_size: Vector2i, options: Dictionary = {} ) -> Dictionary:
将 Viewport 逻辑坐标中的 Control 矩形换算为物理窗口像素矩形。 适合需要把 Godot UI 区域同步给原生 overlay、平台控件或工具预览的桥接层。 该方法只做坐标换算,不创建或管理任何外部视图。
参数:
| 名称 | 说明 |
|---|---|
control_rect |
Control 的全局矩形,单位为 Viewport 逻辑坐标。 |
viewport_size |
Viewport 可见尺寸。 |
window_size |
DisplayServer 物理窗口尺寸。 |
options |
可选项,支持 content_rect 与 viewport_offset,用于 letterbox、HiDPI 或嵌入窗口映射。 |
返回:窗口矩形报告。
结构:
options: Dictionary,可包含 content_rect: Rect2i 或 Rect2;未提供 content_rect 时可用 viewport_offset: Vector2i/Vector2 叠加窗口偏移。return: Dictionary,包含 ok、rect、position、size、scale_x、scale_y、mapping_mode、content_rect、viewport_offset、control_rect、viewport_size 和 window_size。
get_control_window_rect¶
- API:
public - 首次版本:
8.0.0
读取 Control 当前全局矩形并换算为物理窗口像素矩形。
参数:
| 名称 | 说明 |
|---|---|
control |
目标 Control。 |
viewport |
可选 Viewport;为空时使用 control 所在 Viewport。 |
返回:窗口矩形报告。
结构:
return: Dictionary,包含 ok、rect、position、size、scale_x、scale_y、mapping_mode、content_rect、viewport_offset、control_rect、viewport_size 和 window_size。
calculate_safe_area_margins¶
- API:
public - 首次版本:
5.2.0
func calculate_safe_area_margins( safe_area: Rect2i, window_size: Vector2i, viewport_size: Vector2, extra_margins: Dictionary = {} ) -> Dictionary:
根据物理屏幕安全区计算 Viewport 逻辑坐标中的边距。 extra_margins 使用已经转换到 Viewport 逻辑坐标的 top、left、bottom、right, 可用于叠加项目自己的遮挡区域。
参数:
| 名称 | 说明 |
|---|---|
safe_area |
DisplayServer 返回的物理像素安全区。 |
window_size |
DisplayServer 返回的物理窗口尺寸。 |
viewport_size |
当前 Viewport 可见尺寸。 |
extra_margins |
额外逻辑边距。 |
返回:安全区边距报告。
结构:
extra_margins: Dictionary,可选 top、left、bottom、right,单位为 Viewport 逻辑坐标。return: Dictionary,包含 ok、top、left、bottom、right、scale_x、scale_y、safe_area、window_size 和 viewport_size。
get_display_safe_area_margins¶
- API:
public - 首次版本:
5.2.0
func get_display_safe_area_margins(viewport: Viewport = null, extra_margins: Dictionary = {}) -> Dictionary:
读取当前 DisplayServer 安全区并转换为 Viewport 逻辑边距。
参数:
| 名称 | 说明 |
|---|---|
viewport |
可选 Viewport;为空时使用物理窗口尺寸作为逻辑尺寸。 |
extra_margins |
额外逻辑边距。 |
返回:安全区边距报告。
结构:
extra_margins: Dictionary,可选 top、left、bottom、right,单位为 Viewport 逻辑坐标。return: Dictionary,包含 ok、top、left、bottom、right、scale_x、scale_y、safe_area、window_size 和 viewport_size。
apply_safe_area_margins¶
- API:
public - 首次版本:
5.2.0
将边距字典应用到 MarginContainer。
参数:
| 名称 | 说明 |
|---|---|
container |
目标 MarginContainer。 |
margins |
边距字典。 |
返回:应用成功返回 true。
结构:
margins: Dictionary,包含 top、left、bottom、right,单位为 Viewport 逻辑坐标。
apply_display_safe_area_margins¶
- API:
public - 首次版本:
5.2.0
func apply_display_safe_area_margins( container: MarginContainer, viewport: Viewport = null, extra_margins: Dictionary = {} ) -> Dictionary:
读取当前 DisplayServer 安全区并应用到 MarginContainer。
参数:
| 名称 | 说明 |
|---|---|
container |
目标 MarginContainer。 |
viewport |
可选 Viewport;为空时优先使用 container 所在 Viewport。 |
extra_margins |
额外逻辑边距。 |
返回:安全区边距报告,applied 表示是否成功写入 container。
结构:
extra_margins: Dictionary,可选 top、left、bottom、right,单位为 Viewport 逻辑坐标。return: Dictionary,包含 ok、applied、top、left、bottom、right、scale_x、scale_y、safe_area、window_size 和 viewport_size。
get_debug_snapshot¶
- API:
public
获取调试快照。
返回:调试信息字典。
结构:
return: Dictionary,包含 viewport_count、container_count、has_root、has_grid 和 resolution_scale。
tick¶
- API:
public
驱动布局生命周期清理。
参数:
| 名称 | 说明 |
|---|---|
_delta |
本帧时间增量。 |