【Unity】Unityで画面分割(スプリットスクリーン)ローカルマルチを作る:Viewport Rectとプレイヤー入力

作成: 2026-07-12最終更新: 2026-07-13

1台の画面を分けて2人プレイ——ローカル協力・対戦の基礎を作ります。複数カメラのViewport Rectによる画面分割、New Input SystemのPlayerInputManagerによるプレイヤーごとの入力割り当て、各自のUIまで、スプリットスクリーンの土台を解説します。

友達と1台のPCやコンソールで、画面を分け合ってワイワイ遊ぶ——ローカルマルチプレイの楽しさは格別です。レースゲームの2人対戦、協力アクションの2Pプレイ、パーティゲームの4人対戦。この 画面分割(スプリットスクリーン) 、実はUnityでは2つの仕組みを組み合わせるだけで作れます。 複数カメラのViewport Rect で画面を分け、 プレイヤーごとの入力割り当て でそれぞれを操作する。この2本柱です。

この記事では、スプリットスクリーンのローカルマルチの土台を組み立てます。Viewport Rectによる画面分割 から、New Input SystemのPlayerInputManager によるプレイヤーごとの入力、そして 各自のUI まで。ローカル対戦・協力ゲームの第一歩です。

画面分割のイメージ。1つの画面が上下(または左右)に分割され、それぞれにプレイヤー1・プレイヤー2の視点が表示される。各プレイヤーが自分のキャラを別々のコントローラーで操作している様子を示す

この記事でわかること

  • Viewport Rect で画面を分割する(上下・左右)
  • PlayerInputManager でプレイヤーごとに入力を割り当てる
  • 各プレイヤーの UI を分ける
  • 実践:2人が別コントローラーで動かすスプリットスクリーン

動作確認環境: Unity 2022.3 LTS / Unity 6(Input System 1.x)

Sponsored

2つの仕組みで画面分割は作れる

スプリットスクリーンと聞くと難しそうですが、分解すると 「画面を分ける」と「入力を分ける」の2つ だけです。この2本柱を押さえれば、あとは人数を増やすだけです。

スプリットスクリーンの2本柱の図。左は「画面を分ける」(複数カメラのViewport Rectで表示範囲を上下や左右に分割)、右は「入力を分け�る」(PlayerInputManagerで各コントローラーを各プレイヤーに割り当て)。この2つの組み合わせでローカルマルチが成立する様子を示す
仕組み役割
画面を分ける(Viewport Rect)プレイヤーごとにカメラを用意し、各カメラの表示範囲を画面の一部に割り当てる
入力を分ける(PlayerInputManager)各コントローラー(デバイス)を各プレイヤーに紐づけ、混線しないようにする

この2つは独立しています。 「画面をどう割るか」はカメラの仕事、「誰がどのキャラを動かすか」は入力の仕事。それぞれ別々に設定でき、組み合わせると「自分の画面で、自分のコントローラーで、自分のキャラを動かす」ローカルマルチが完成します。まずは画面分割から見ていきましょう。

Viewport Rectで画面を分ける

画面分割の要が、カメラの Viewport Rect です。これは「カメラが画面のどの範囲に描画するか」を 0〜1の割合 で指定する設定です。

Viewport Rectで画面を分ける図。カメラのViewport RectはX/Y/W/Hで指定し、画面左下が原点(0,0)、右上が(1,1)。上下分割なら、P1カメラを(0, 0.5, 1, 0.5)=上半分、P2カメラを(0, 0, 1, 0.5)=下半分に設定する様子を示す

Viewport RectX・Y・W・H の4つの値で、画面の左下を原点(0, 0)、右上を(1, 1)とした割合を指定します。

  • 画面全体: (X=0, Y=0, W=1, H=1) ——これが通常のカメラ
  • 上下分割(2人): プレイヤー1のカメラを (0, 0.5, 1, 0.5)(上半分)、プレイヤー2のカメラを (0, 0, 1, 0.5)(下半分)
  • 左右分割(2人): プレイヤー1を (0, 0, 0.5, 1)(左半分)、プレイヤー2を (0.5, 0, 0.5, 1)(右半分)
  • 4分割: 4つのカメラをそれぞれ (0,0.5,0.5,0.5) (0.5,0.5,0.5,0.5) (0,0,0.5,0.5) (0.5,0,0.5,0.5)

プレイヤーごとにカメラを用意し、それぞれの Viewport Rect を設定するだけで、画面がきれいに分かれます。各カメラは自分のプレイヤーを追従させれば(Cinemachine が便利)、それぞれの視点が別々に映ります。特別なシェーダーもレンダリング技術も不要——カメラの設定1つで実現できるのがポイントです。

カメラの深度(Depth)に注意: 複数カメラを使うとき、各カメラの Depth の値で描画順が決まります。分割表示では重ならないので通常は問題ありませんが、UIカメラなどを重ねる場合はDepthで前後を制御します。

PlayerInputManagerで入力を割り当てる

画面が分かれても、両方のキャラが同じ入力で動いては意味がありません。 プレイヤーごとに「自分のコントローラー」を割り当てる のが、New Input SystemPlayerInputManager です。

PlayerInputManagerの図。PlayerInputManagerが、接続された各コントローラー(ゲームパッド1・ゲームパッド2)を検知して、それぞれにPlayerInputを持つプレイヤーオブジェクトを生成する。各プレイヤーは自分のデバイスからの入力だけを受け取る様子を示す

PlayerInputManager は、 コントローラーが参加すると、自動でプレイヤーを生成し、そのデバイスの入力だけを届ける 仕組みです。

  1. Player Prefabを用意: PlayerInput コンポーネントを付けたプレイヤーキャラのPrefabを作る(入力アクションはInput Actionsアセットで定義)
  2. PlayerInputManagerを置く: シーンに PlayerInputManager を置き、Player Prefab に手順1を割り当てる
  3. 参加方法を設定: 「ボタンを押したら参加」などのJoin方式を選ぶ。ゲームパッドのボタンを押すと、そのデバイス専用のプレイヤーが生成される

これで、ゲームパッド1で参加したプレイヤーはパッド1の入力だけ、パッド2のプレイヤーはパッド2の入力だけを受け取ります。 入力の混線が起きない のが最大の利点です。キーボード1台を「WASDのP1」「矢印キーのP2」に分けるといったこともControl Schemeで設定できます。生成された各プレイヤーのカメラに、前節のViewport Rectを割り当てれば、画面と入力が結びつきます。

Sponsored

各プレイヤーのUIを分ける

体力バーやスコアも、 プレイヤーごとに自分の画面に出したい ものです。分割された各領域に、それぞれのUIを配置します。

各プレイヤーのUIを分ける図。上下分割された画面で、P1の上半分には自分の体力バー、P2の下半分には自分の体力バーが、それぞれの領域内に表示される。各プレイヤーのCanvasを対応するカメラのViewport範囲に合わせる様子を示す

各プレイヤーのUIを分けるには、 プレイヤーごとにCanvasを用意 します。方法は主に2つです。

  • Screen Space - Cameraで紐づける: 各プレイヤーのCanvasを Screen Space - Camera にし、Render Camera にそのプレイヤーのカメラを設定する。カメラのViewport範囲にUIが収まる
  • World Spaceでキャラに追従: 体力バーをキャラの頭上に World Space のCanvasで置く。各プレイヤーのカメラがそれぞれ描画するので、自然に自分の画面に映る

これで、P1の体力バーはP1の画面領域に、P2のはP2の領域に表示されます。Canvas・RectTransform の基本を押さえておくと、分割領域内での配置がスムーズです。スコアや残機など、プレイヤー固有の情報はすべてこの方式で各自の画面に出せます。

実践:2人プレイのスプリットスクリーン

ここまでを組み合わせて、 2人が別々のコントローラーで、上下分割の画面を遊ぶ ローカルマルチを完成させましょう。協力アクション、対戦レース、パーティゲーム——どれもこの土台から始まります。

実践の完成イメージ。上下2分割の画面で、上半分にプレイヤー1、下半分にプレイヤー2の視点。各自が別のゲームパッドで自分のキャラを動かし、それぞれの画面隅に自分の体力バーが表示される、完成したスプリットスクリーンを示す

今回は 最大2人 のセッションと決めて組みます(PlayerInputManagerEnable Max Player CountをオンにしてMax Player Countを2に——Joinボタンを連打されても3人目は生まれません)。全体の組み立てはこうです。

  1. Player Prefab を作る(PlayerInput + キャラ + 追従カメラ + 自分のCanvas)
  2. PlayerInputManager をシーンに置き、Player Prefabと人数上限を設定する
  3. 参加・退出のたびに、人数に応じて全員の画面を配り直す(1人なら全画面、2人なら上下)
  4. 各コントローラーで参加 → それぞれのキャラ・画面・入力が結びつく
using UnityEngine;
using UnityEngine.InputSystem;

// 参加・退出のたびに、人数に応じて全員のViewport Rectを配り直す
public class SplitScreenManager : MonoBehaviour
{
    // PlayerInputManagerの「On Player Joined」「On Player Left」の両方から呼ぶ
    public void OnPlayerJoined(PlayerInput input) => Relayout();
    public void OnPlayerLeft(PlayerInput input) => Relayout();

    private void Relayout()
    {
        var players = PlayerInput.all;  // 現在参加中の全プレイヤー

        for (int i = 0; i < players.Count; i++)
        {
            var cam = players[i].GetComponentInChildren<Camera>();
            if (cam == null) continue;

            cam.rect = players.Count <= 1
                ? new Rect(0f, 0f, 1f, 1f)                     // 1人 → 全画面に戻す
                : new Rect(0f, i == 0 ? 0.5f : 0f, 1f, 0.5f);  // 2人 → 上下分割
        }
    }
}

ポイントは2つです。 「カメラと入力はプレイヤー単位でセット」(1人のプレイヤーは『自分のカメラ+自分のPlayerInput+自分のUI』を1組で持つ。Player Prefabにまとめておくと生成が楽)と、 「レイアウトは参加時でなく増減のたびに配り直す」OnPlayerJoinedだけで済ませると、2人目が抜けたとき1人目が半画面のまま取り残されます。JoinとLeftの両方から同じRelayoutを呼べば、1人に戻った瞬間、画面がすっと全画面へ戻る——この気配りがローカルマルチの体験を締めます)。

わざと壊して、直す

  1. Player Prefabにカメラを入れ忘れる: 2人目が参加しても画面が割れません。「プレイヤー1組=キャラ+入力+カメラ+UI」のセットが崩れたサインです
  2. 両プレイヤーのUIが同じキャラの体力を購読する: P2が被弾したのにP1のバーまで減ります。UIの参照はPrefabの自分の中で完結させれば、この混線は原理的に起きません(instanceイベント の考え方そのままです)
  3. ポーズメニューを全画面に1つ出す: 「誰のパッドで操作できるの?」問題が発生します。定番は、ポーズを開いたプレイヤーのPlayerInputだけをUI用Action Mapへ切り替え、他のプレイヤーの入力は止める——「ポーズの持ち主」を決めるのがコツです

この土台さえできれば、レースでも格闘でも協力アクションでも、あとはゲームロジックを載せるだけです。

おまけ:先に知っておくと良いこと

  • Input Systemパッケージが必要: PlayerInputManager はNew Input Systemの機能です。Package Managerで Input System を導入し、New Input System の基本(Input Actions)を先に押さえておきましょう。
  • 音は共有される: 画面は分かれても、スピーカーは1つです。BGMやSEはゲーム全体で1つとして扱い、プレイヤーごとに分けないのが普通です。3D音源は「どちらのプレイヤーの近くか」で聞こえ方が変わる点に注意。
  • 境界線を引くと見やすい: 分割の境目に細い線(区切りのUI)を1本引くだけで、画面がぐっと見やすくなります。全画面のUIカメラを1つ足して、境界線だけ描くのが定番です。
  • オンラインとは別物: この記事は「1台の画面を分ける」ローカルマルチです。ネットワーク越しのオンラインマルチは、Netcode for GameObjects など別の仕組みが必要で、設計もまったく異なります。

まとめ

  • スプリットスクリーンは 「画面を分ける」+「入力を分ける」 の2本柱
  • 画面分割は各カメラの Viewport Rect(X/Y/W/H の割合)。上下なら (0,0.5,1,0.5)(0,0,1,0.5)
  • 入力は PlayerInputManager。コントローラーごとにプレイヤーを生成し、混線を防ぐ
  • UIは プレイヤーごとにCanvas を用意し、対応するカメラの領域に合わせる
  • 実践:Player Prefab(カメラ+入力+UI)を1組にし、参加・退出のたびに全員へViewport Rectを配り直す(1人に戻ったら全画面へ)

まずはカメラを2つ置き、Viewport Rectで上下に分割するところから始めてください。1つの画面が2つに割れた瞬間、ローカルマルチの扉が開きます。あなたは友達と、どんなゲームで画面を分け合いますか?

さらに学ぶために