友達と1台の画面で遊ぶローカル協力プレイ——2人の視点を左右に並べた 分割画面(スプリットスクリーン) は、その定番の見せ方です。でも「1つのゲーム世界を、2つのカメラで別々に映す」をどう作ればいいのか、最初は見当がつきません。
そこで使うのが SubViewport です。この記事では、2つのSubViewportで画面を分ける構成から、world_2d/world_3d で 同じ世界を共有 する仕組み、 入力の振り分け 、そしてパフォーマンス注意点までを解説します。
この記事でわかること
- 分割画面の構成(SubViewportを2つ並べる)
world_2d/world_3dで 同じ世界を共有 する- プレイヤーごとの 入力の振り分け
- 分割画面の パフォーマンス 注意点
動作確認環境: Godot 4.7
分割画面の構成:SubViewportを2つ並べる
分割画面の基本は、 画面を2つに区切り、それぞれに SubViewport を1つずつ置く ことです。左右分割なら、画面の左半分と右半分に、独立した映像を映します。

ノード構成はこうなります。HBoxContainer で左右に並べ、各 SubViewportContainer の中に SubViewport を入れます。
Root
└── HBoxContainer # 左右に並べる
├── LeftContainer (SubViewportContainer) # 左半分
│ └── SubViewport
│ ├── Camera2D # プレイヤー1を追う
│ └── World (Node2D) # プレイヤー・敵・地形はここに1セットだけ
└── RightContainer (SubViewportContainer) # 右半分
└── SubViewport
└── Camera2D # プレイヤー2を追う
SubViewportContainer:SubViewportを画面上に表示する枠。ここのサイズが分割画面の1つ分の大きさになりますSubViewport:実際に映像をレンダリングする場所。中にカメラを置きますCamera2D/Camera3D:各SubViewportに1つずつ。それぞれのプレイヤーを追わせます(Camera2Dの追従 参照)
これで「2つの画面枠」ができました。でも、このままだと2つのSubViewportは 別々の空っぽの世界 を映しています。次に、両方で同じゲーム世界を映す設定が必要です。
同じ世界を共有する:world_2d / world_3d
分割画面の肝が、 2つのSubViewportに同じゲーム世界を共有させる ことです。世界を2つ作るのではなく、 1つの世界を2つのカメラで見る のです。

これは world_2d(2D)または world_3d(3D)を共有することで実現します。片方のSubViewportの world を、もう片方に代入します。
@onready var viewport_a: SubViewport = $HBoxContainer/LeftContainer/SubViewport
@onready var viewport_b: SubViewport = $HBoxContainer/RightContainer/SubViewport
func _ready() -> void:
# 右の画面(B)に、左の画面(A)と同じ2Dワールドを共有させる
viewport_b.world_2d = viewport_a.world_2d
これで、viewport_a に配置したプレイヤー・敵・地形が、viewport_b の画面にも 同じもの として映ります。あとは各SubViewportのカメラを、それぞれのプレイヤーの位置に追従させれば、「同じ世界を、2人それぞれの視点で見る」分割画面の完成です。3Dの SubViewport は、既定で親と同じ3D空間を見ているので(Own World 3D が既定でオフ)、代入しなくても同じ世界が映ります。
入力を振り分ける
分割画面では、 1つのキーボード(やパッド)を2人で分け合う ため、入力をプレイヤーごとに振り分けます。
