同じステージを2人で歩き回り、一方はスイッチを押し、もう一方は開いた扉を通る。そんな協力プレイを、1台のPCで試してみましょう。
UE5には、プレイヤーの人数に応じて画面を分ける仕組みがあります。今回はThird Personテンプレートに2人目を加え、1Pはキーボードとマウス、2Pはゲームパッドで操作できるようにします。最後に、それぞれの画面の左上へ名前とHPバーを出します。

この記事でわかること
- 1つのゲーム画面を左右に分け、2人で別々に歩く
- キーボードとゲームパッドを別のプレイヤーへ割り当てる
- 1P・2Pそれぞれの画面に、自分用のUIを表示する
世界は1つ、見る位置は2つ
画面を分割しても、ステージが2つに増えるわけではありません。同じステージを、2台のカメラでそれぞれ映します。 1Pが箱の裏へ回り込めば、2Pの画面からはその姿が隠れます。箱も、2人のキャラクターも、同じ世界に存在しています。

このとき、UEでは次の3つをプレイヤーごとに扱います。
| 名前 | 今回の役割 |
|---|---|
| Local Player | このPCで参加しているプレイヤー。画面を分ける単位になる |
| Player Controller | そのプレイヤーの入力を受け取り、操作するキャラクターを管理する |
| Pawn | 実際にステージ内を動く体。今回はThird Personのキャラクター |
「Controller」という名前でも、Player Controllerは手に持つゲームパッドそのものではありません。 キーボードで遊ぶ1Pにも、ゲ ームパッドで遊ぶ2Pにも、それぞれPlayer Controllerがあります。
Create Local Player は、このゲームに参加者を1人追加するノードです。Third Personテンプレートのキャラクターとカメラを使えば、追加したプレイヤーも自分のキャラクターを映しながら動けます。C++の関数名は CreatePlayer なので、資料によっては「Create Player」と表記されています。
2人で遊ぶ準備をする
今回は、Windows版のUE5.5以降で作った、BlueprintのThird Personテンプレートを使います。まず1人で歩く・視点を動かす操作ができ、接続したゲームパッドもUEから認識されている状態にしてください。テンプレートの移動処理や入力設定は、そのまま利用します。
スタート地点を2つ置く
レベル内の Player Start を2つにします。これは、プレイヤーのキャラクターを出現させる候補地点です。床の少し上に置き、互いのカプセルが重ならないように離してください。
キャラクターをもう1体レベルへ直接置く必要はありません。Third PersonのGameModeが、設定された Default Pawn Class をもとにキャラクターを生成します。独自のレベルで試す場合は、「World Settings」の「GameMode Override」がThird Person用のGameModeになっていることも確認します。
画面分割とゲームパッドの割り当てを設定する
「Project Settings」→「Maps & Modes」→「Local Multiplayer」で、次のように設定します。
| 設定 | 今回の値 | 意味 |
|---|---|---|
| Use Splitscreen | オン | 複数のローカルプレイヤーで画面を分ける |
| Two Player Splitscreen Layout | Vertical | 画 面を左右に分ける |
| Skip Assigning Gamepad to Player 1 | オン | 最初のゲームパッドを1Pへ割り当てず、2Pから使う |
最後の設定が、今回の「キーボードで1P、ゲームパッドで2P」に必要です。オフのままだと、キーボードと最初のゲームパッドが同じ1Pを操作することがあります。画面を分けただけでは、入力まで希望どおりに分かれるとは限りません。

実行時の人数は「1」のままにする
エディタのプレイ設定では「Number of Players」を 1、「Net Mode」を Play Standalone にし、「Standalone Game」で起動します。
この「Number of Players」は、主にネットワークプレイを試すための設定です。今回はゲームを1つ起動し、その中にノードで2人目を追加します。ここを2にして別のゲームウィンドウを増やす必要はありません。
2人目を追加して歩いてみる
プレイヤーを追加するためのActorを1つ作ります。今回は、同じマップで2人プレイを始めるところに絞ります。
- Actorを親クラスにしたBlueprint BP_LocalCoopSetup を作り、レベルへ 1つだけ 配置します。
- SecondPlayer という変数を作ります。型は Player ControllerのObject Reference、初期値は
Noneにします。 - Event Graph で、
Event BeginPlay → Create Local Player → Set SecondPlayerと白い実行線をつなぎます。 - Create Local Playerの「Controller Id」を -1、「Spawn Player Controller」を オンにします。
- Create Local Playerの Return Value を、Set SecondPlayerの値へつなぎます。

Object Reference(参照) は、「作ったどのPlayer Controllerか」を後から指定するためのものです。Return Valueに返された2人目をSecondPlayerへ保存しておけば、後で2PのUIを作るときにも同じ相手を指定できます。None は、まだ相手が入っていない状態です。
Controller Idの -1 は「次の空きIDを選ぶ」という指定です。一方、Spawn Player Controllerは、追加時にPlayer Controllerを作るかどうかの設定です。今回はすぐに操作したいのでオンにします。
続けて、SecondPlayerから実行ピン付きの Is Valid へつなぎます。これは、参照先を今使えるか確かめるノードです。
- Set SecondPlayerの実行出力 → Is Validの実行入力
- Get SecondPlayer → Is Validの「Input Object」
- 「Is Not Valid」→ Print Stringで「2Pの作成に失敗」と表示
- 「Is Valid」は、今の段階では未接続で構いません。後でUIの作成をつなぎます。

コンパイルしてStandalone Gameで起動すると、画面が左右に分かれます。キーボードで1P、ゲームパッドで2Pを動かしてみてください。一方を動かしたときに、もう一方のキャラクターまで一緒に動かなければ、入力も分かれています。
2人で同じ箱の周りを歩いてみると、「世界は1つ、見る位置は2つ」という関係がよく分かります。ここまでで、画面分割の土台はできました。
入力の設定も、各プレイヤーが持つ
Third Personテンプレートでは、Input Mapping Context に「どのキーやボタンで、移動やジャンプをするか」が登録されています。これを使えるようにするのが Add Mapping Context です。
入力を受け持つ Enhanced Input Local Player Subsystem は、プレイヤーごとの入力設定の管理場所です。名前は長いですが、ここでは「1P用と2P用が別々にある」と押さえれば十分です。
元のテンプレートで2人とも動くなら、追加の入力ノードは不要です。入力処理を改造済みで2Pだけ動かない場合は、既存のAdd Mapping Contextが 操作する本人のPlayer Controllerから取得したSubsystem を対象にしているか確認します。キャラクター内なら Get Controller、Player Controller内なら Self が本人を指します。
毎回 Get Player Controller(Player Index = 0) を使うと、2Pを準備しているつもりでも1P側の設定を触ってしまいます。なお、Player Indexは一覧の順番、Controller Idは入力側のIDです。今回の2Pは、番号から探し直さずSecondPlayerで指定します。
自分の画面にUIを出す仕組み
2人とも歩けたら、それぞれの画面に名前とHPバーを付けましょう。ここで必要なのは、誰のUIを作るかと、どこへ表示するかの2つです。
| ノード・入力 | 指定すること |
|---|---|
| Create Widgetの Owning Player | このUIの持ち主となるPlayer Controller |
| Add to Player Screen | 持ち主に割り当てられた画面の領域へ表示する |
いつもの Add to Viewport は、ゲームウィンドウ全体を基準にUIを配置します。たとえば1P用と2P用のUIを両方「左上」に置くと、ウィンドウ左上で重なることがあります。自動で各画面に1つずつ配られるわけではありません。
Add to Player Screenなら、同じ「左上」の設定でも、1PのUIは左側の画面、2PのUIは右側の画面の左上に配置されます。画面の分割を上下に変えたときも、それぞれの領域を基準に配置できます。
