はじめに
ボタンやテキストを並べたとき、画面の端にぴったりくっついて窮屈に見えてしまった——そんな場面で活躍するのが MarginContainer です。子ノードの周囲に余白(マージン)を設定するだけのシンプルなコンテナですが、UIの見栄えを整えるうえで欠かせない存在です。
この記事では、MarginContainer の仕組みと使いどころ、マージンの設定方法を紹介します。
MarginContainerとは?
MarginContainer は ひとつの子ノードを内包し、その四辺(上下左右)に余白を加えるUIコンテナです。CSSの padding に相当する役割を担います。子ノード自体には手を加えず、コンテナ側でスペースを確保するのが特徴です。
額縁をイメージしてください。絵(子ノード)のサイズは変えずに、額縁(MarginContainer)の内側の余白を広げると、絵の周りに空間が生まれます。MarginContainer はまさにその「額縁の余白」を担うノードです。
継承ツリーは MarginContainer → Container → Control → CanvasItem → Node です。子ノードは 1つだけが基本で、複数並べたいときは内側に VBoxContainer や HBoxContainer を挟みます。

このノードを使うべき場面
- パネルやダイアログの内側余白:
Panelの中にMarginContainerを置いてコンテンツとの間にスペースを確保するとき - 画面端からの余白:HUD の要素を画面端から一定距離だけ内側に配置したいとき
- ボタン・ラベルの周囲スペース:テキストが枠にぴったりくっついて見づらいとき
- スクロールコンテンツの内側パディング:
ScrollContainer内のリストに上下左右の余白をつけたいとき - カードUIのコンテンツ余白:カード風パネルの内側にテキストやアイコンを余裕を持って配置するとき
別のノードが適切な場面:
- 複数の子ノードを整列させたい →
HBoxContainerやVBoxContainerでまず整列し、その外側に MarginContainer を被せる - 子ノード同士の間隔だけを調整したい → 各コンテナの
separationテーマ定数で対応する方がシンプル
主なプロパティと機能
MarginContainer 固有の追加プロパティはなく、マージンは テーマオーバーライド(Theme Overrides)の定数 で設定します。インスペクターの「Theme Overrides > Constants」から4方向それぞれに値を入力します。
@onready var margin: MarginContainer = $MarginContainer
func _ready() -> void:
# 四辺すべてに16pxの余白を設定
margin.add_theme_constant_override("margin_left", 16)
margin.add_theme_constant_override("margin_right", 16)
margin.add_theme_constant_override("margin_top", 16)
margin.add_theme_constant_override("margin_bottom", 16)
コード例:MarginContainer を使った基本的なシーン構成
# MarginContainer
# └─ VBoxContainer
# ├─ Label ("タイトル")
# └─ Button ("スタート")
# MarginContainer に余白を設定するだけで
# 内側の VBoxContainer ごと余白が生まれる
margin.add_theme_constant_override("margin_left", 24)
margin.add_theme_constant_override("margin_right", 24)
margin.add_theme_constant_override("margin_top", 16)
margin.add_theme_constant_override("margin_bottom",16)
もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 変えると何が起きるか |
|---|---|
| 四辺を同じ値に揃える | 均一な余白になり、カードUIやダイアログに落ち着いた印象を与える。16〜24px が汎用的な出発点 |
| 左右だけ大きくする | 横長テキストコンテンツの可読性が上がる。スマホUI でよく使われるパターン |
| 上下だけ大きくする | 縦スクロールコンテンツの先頭・末尾に「呼吸」をつくれる |
| 実行中に値を変える | アニメーションと組み合わせて「開く」「閉じる」ような演出に使える |
| MarginContainer を入れ子にする | 外側は画面端マージン、内側はコンテンツ間パディング、と役割を分けて管理できる |

まとめ
MarginContainer は 「子ノードの周囲に余白を追加するだけのシンプルなコンテナ」 です。
- マージンは Theme Overrides の定数(
margin_left等)でピクセル単位に指定する - 複数の子を並べたいときは内部に
VBoxContainer/HBoxContainerを挟む - Panel や ScrollContainer と組み合わせると、洗練されたUIが手軽に作れる
次回は、子ノードを常に中央に配置してくれる CenterContainer を紹介します。
シリーズ:Godot 4 ノード解説
- 001:Node(基底クラス)
- 002:Node2D
- 003:Sprite2D
- 004:AnimatedSprite2D
- 005:CharacterBody2D
- 006:CollisionShape2D
- 007:Area2D
- 008:RigidBody2D
- 009:Camera2D
- 010:Label
- 011:RichTextLabel
- 012:LineEdit
- 013:Button
- 014:HBoxContainer
- 015:VBoxContainer
- 016:GridContainer
- 017:ScrollContainer
- 018:Panel
- 019:TabContainer
- 020:SplitContainer
- 021:HSplitContainer
- 022:VSplitContainer
- 023:FlowContainer
- 024:MarginContainer(この記事)
- 025:CenterContainer
- 026:AspectRatioContainer
- 027:SubViewportContainer
- 028:TextureRect
- 029:ColorRect
- 030:ProgressBar
この記事はGodot 4.xをもとに執筆しています。


コメント