PanelContainer
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — PanelContainer
PanelContainer
节点继承关系
继承链:Node → CanvasItem → Control → Container → PanelContainer
继承自 Container
| 类型 | 名称 | 说明 |
|---|---|---|
| 信号 | sort_children | 子节点排列发生变化 |
| 方法 | FitChildInRect() | 调整子节点到指定矩形内 |
继承自 Control
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Size | 控件尺寸 |
| 属性 | Position | 控件位置 |
| 属性 | AnchorsPreset | 锚点预设 |
| 属性 | GrowDirection | 超出容器时的扩展方向 |
| 属性 | MouseFilter | 鼠标事件过滤(停止 / 通过 / 忽略) |
| 属性 | FocusMode | 焦点模式(无 / 单击 / 全部) |
| 信号 | gui_input | 接收到 GUI 输入事件 |
| 信号 | mouse_entered | 鼠标进入控件区域 |
| 信号 | mouse_exited | 鼠标离开控件区域 |
| 信号 | focus_entered | 获得焦点 |
| 信号 | focus_exited | 失去焦点 |
| 信号 | resized | 尺寸变化 |
| 方法 | GrabFocus() | 获取焦点 |
| 方法 | ReleaseFocus() | 释放焦点 |
| 方法 | SetAnchorsPreset() | 设置锚点预设 |
| 方法 | GetMinimumSize() | 获取最小尺寸 |
继承自 CanvasItem
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Visible | 是否可见 |
| 属性 | Modulate | 整体颜色叠加(乘法) |
| 属性 | SelfModulate | 自身颜色叠加(不影响子节点) |
| 属性 | ZIndex | 绘制层级(Z 轴排序) |
| 信号 | visibility_changed | 可见性变化时触发 |
| 方法 | GetGlobalMousePosition() | 获取鼠标全局坐标 |
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
PanelContainer 不仅帮你排列子控件,还给它们加了一个背景面板(通常是一个半透明的灰色矩形)。适合做对话框、信息面板的容器。就像 Panel 和 Container 的结合体——既有背景,又能自动布局。
使用频率:★★★ 一般常用(对话框、信息框常用)
节点用途
- 做带背景的对话框
- 信息提示面板
- 任何需要背景 + 自动布局的场景
使用场景
- 游戏内对话框的背景
- 任务描述面板
- 提示信息框
常用节点搭配
- 搭配
VBoxContainer做面板内部布局 - 搭配
MarginContainer加内边距
生效必备素材/资源
无需特殊资源。样式由主题控制(StyleBoxFlat 等)。
节点属性与信号
自有属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
| (PanelContainer 没有额外属性,样式由主题控制) | — | — | — | — |
信号
| 信号 | 触发时机 | 参数 |
|---|---|---|
| (PanelContainer 没有特有信号) | — | — |
常用方法
继承自 Container 的所有方法。
代码示例
C
using Godot;
public partial class DialogPanel : Control
{
public override void _Ready()
{
var panelContainer = new PanelContainer();
panelContainer.SetAnchorsPreset(LayoutPreset.Center);
panelContainer.OffsetLeft = -200;
panelContainer.OffsetTop = -100;
panelContainer.OffsetRight = 200;
panelContainer.OffsetBottom = 100;
// 内部用 VBoxContainer 排列内容
var vbox = new VBoxContainer();
panelContainer.AddChild(vbox);
var title = new Label();
title.Text = "提示";
title.HorizontalAlignment = HorizontalAlignment.Center;
vbox.AddChild(title);
var message = new Label();
message.Text = "确定要退出游戏吗?";
vbox.AddChild(message);
var btnBox = new HBoxContainer();
var confirmBtn = new Button() { Text = "确定" };
var cancelBtn = new Button() { Text = "取消" };
btnBox.AddChild(confirmBtn);
btnBox.AddChild(cancelBtn);
vbox.AddChild(btnBox);
AddChild(panelContainer);
}
}GDScript
extends Control
func _ready():
var panel_container = PanelContainer.new()
panel_container.set_anchors_preset(Control.LayoutPreset.CENTER)
panel_container.offset_left = -200
panel_container.offset_top = -100
panel_container.offset_right = 200
panel_container.offset_bottom = 100
# 内部用 VBoxContainer 排列内容
var vbox = VBoxContainer.new()
panel_container.add_child(vbox)
var title = Label.new()
title.text = "提示"
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(title)
var message = Label.new()
message.text = "确定要退出游戏吗?"
vbox.add_child(message)
var btn_box = HBoxContainer.new()
var confirm_btn = Button.new()
confirm_btn.text = "确定"
var cancel_btn = Button.new()
cancel_btn.text = "取消"
btn_box.add_child(confirm_btn)
btn_box.add_child(cancel_btn)
vbox.add_child(btn_box)
add_child(panel_container)