UE5 でマルチプレイヤーのサンプルプロジェクトを作ってDedicated Serverを立てる

 ListenServerはアウトオブ眼中です、の巻

こちらは Unreal Engine (UE) Advent Calendar 2022 のカレンダー 2 、12 月 18 日分の参加記事となります。

UE5 で ThirdPerson テンプレートのプロジェクトを改造し、最短でマルチプレイヤーに対応して DedicatedServer を立てる所までの手順を書きます。 ListenServer を使う記事は多数見つかりますので本稿では扱いません。最初から DedicatedServer しか眼中にない!という奇特な方を対象としています。

方針

公式ドキュメントの専用サーバーを設定するによると、 OpenLevel に IP アドレスを渡すことで DedicatedServer に接続しに行きます。 そのため、普通に ThirdPerson テンプレートからプロジェクト作成した後、まずはログイン用のレベルと IP アドレス入力と接続ボタンの UI を作成します。

プロジェクト作成とマルチプレイ用の設定

UE エディタを起動し、ThirdPerson テンプレートから Blueprint のプロジェクトを作成します。

ThirdPersonテンプレートからプロジェクト作成

また、ThirdPerson テンプレートには物理で動くキューブが 3 とほど置かれていますが、動きが Replicate しない設定になっているため、修正しておきます。

StaticMeshのReplicate設定

ログイン用のレベルを作成

コンテンツブラウザの何もない所で右クリックしレベルを選択します。

レベルの作成

名前は何でも問題ありませんがここでは LoginMap にしました。

LoginMapレベルができた

ログイン用 UI の作成

IP アドレス入力と接続ボタンの UI 用として、WBP_OpenIPAddr という Widget を作成します。

Widget の構成はこのようにしましたが、IP アドレス入力欄と OpenLevel のボタンさえあれば問題ありません。

ログイン用UIのWidget構成

OpenLevel ボタンをクリックされた時のロジックをイベントグラフに実装します。TextBox に入力されたテキストを OpenLevel に渡すだけですね。

ログイン用UIのロジック

起動時にログイン用 UI を表示

LoginMap のレベル BP を開き、下記のように実装します。DedicatedServer の時は UI の表示はできないため除外しています。

レベルBPでUIを表示

PlayInEditor でログイン UI の動作確認

早速実行してみましょう。LoginMap レベルを開いた状態で、Play ボタン右側のメニューから NetMode が Play As Client になっている事を確認してから、Play ボタンをクリックします。

PlayInEditor実行

以下のような画面が表示されたら成功です。

ログインUIが表示された

なお、DedicatedServer が立ってないのでどこにも接続することはできません。残念!

ローカルで DedicatedServer を立てて接続確認

デバッグ目的で最も手軽に DedicatedServer を立てるには、UE エディタを下記の引数で起動します。

"d:\Program Files\Epic Games\UE_5.1\Engine\Binaries\Win64\UnrealEditor.exe" d:\home\logion\development\UE5\Multiplay51\Multiplay51.uproject ThirdPersonMap -server -game -log

プロジェクトファイルをフルパス指定した後、マップ名 ThirdPersonMap を指定しています。 オプション引数は -server でサーバーとして実行、-gameで Cook せずにプロジェクトを単独実行します。-logによりログを出力します。

下記エラーが表示された時は、uproject ファイルのパスがフルパス指定になっているかどうか確認して下さい。

プロジェクトが見つからない時のエラー表示

DedicatedServer の起動に成功すると、ログ画面が出現します。ポート 7777 にて待ち受けをしていることがわかります。7777 は UnrealEngine のマルチプレイヤー接続に使用されるデフォルトの UDP ポートです。

UEエディタでDedicatedServer起動時のログ画面

PlayInEditor(緑色の Play ボタン)を実行し、120.0.0.1:7777を入力、OpenLevel をクリックします。

DedicatedServerに接続

レベル遷移成功です!おめでとうございます。

DedicatedServerのレベル遷移成功

DedicatedServer のログにも接続リクエストやレベルへの参加リクエストが記録されています。

クライアントから接続時のDedicatedServerログ画面

パッケージングの準備

ここから Linux DedicatedServer のパッケージングに向けて準備していきます。 DedicatedServer 用のパッケージングを行うには下記が必要となります。

  • プロジェクトを C++プロジェクトに変更(ServerTarget(後述)を追加してビルドする必要があるため)
  • プロジェクトのエンジンバージョンをソースビルドの UnrealEngine にする

特に後者はランチャー版のエンジンでは ServerTarget がサポートされていないためで、強引に ServerTarget の設定を行ないパッケージングしようとしても、以下のようにログに無慈悲なメッセージが表示されます。

UATHelper: Packaging (Linux): Server targets are not currently supported from this engine distribution.

C++プロジェクトへの切り替え

C++プロジェクトに切り替えるには、ダミーで C++ソースを追加します。

C++ソースを追加

親クラスは指定なしで問題ありません。

親クラスはなし

クラス名もデフォルトのままで問題ありません。

適当なクラス名を指定

しばらくクラス追加処理が走ります。

クラス追加中

追加が完了すると、C++ビルドに必要な Source フォルダや VisualStudio のソリューションファイル(*.sln)が生成されています。

VisualStudio関係のファイルが生成されている

Source\Multiplay51 フォルダ以下に生成されたMyClass.h,MyClass.cpp はもういらないのでエクスプローラから削除しておいて下さい。

不要なクラスを削除

ServerTarget の追加

Source フォルダ内を開き、 Multiplay51Editor.Target.cs をコピー&ペーストしてMultiplay51Server.Target.cs を生成します。

ServerTarget

Multiplay51Server.Target.cs をテキストエディタで開き、文字列置換でEditorを全てServerにします。

// Fill out your copyright notice in the Description page of Project Settings.

using UnrealBuildTool;
using System.Collections.Generic;

public class Multiplay51ServerTarget : TargetRules
{
    public Multiplay51ServerTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Server;
        DefaultBuildSettings = BuildSettingsVersion.V2;

        ExtraModuleNames.AddRange( new string[] { "Multiplay51" } );
    }
}

プロジェクトのエンジンバージョンの切り替え

github からエンジンソースの入手と VisualStudio ビルドを行ってない場合は、下記リンクを参考にして下さい。

プロジェクトファイル上で右クリックし Switch Engine Version を実行します。

エンジンバージョンの切替

ソースビルドのエンジンのフォルダを選択します。

エンジンバージョンの指定

再度 VisualStudio のプロジェクトを生成するため少し時間がかかります。

VisualStudioプロジェクトファイル生成中

Windows 用クライアントのパッケージング

UE エディタを起動し、Windows 用クライアントのパッケージングを行います。 Platform のメニュー内の Windows を開き、Build Target が Multiplay51 になっている事を確認し、Package Project を実行します。

Windowsパッケージング

Linux 用 DedicatedServer のパッケージング

続いて Linux 用 DedicatedServer のパッケージングを行います。 Linux のビルドには予めクロスコンパイルチェーンのインストールが必要となります。未入手の場合は下記からダウンロード・インストールして下さい。 開発要件

Platform のメニュー内の Linux を開き、Build Target が Multiplay51Server になっている事を確認し、Package Project を実行します。

Linuxパッケージング

以上でパッケージングは完了です!

手元で Linux DedicatedServer を立てる

Linux 用の DedicatedServer を手軽に実行するには Windows10 以降に付属している WSL(Windows Subsystem for Linux)を使用します。 未入手の場合は下記を参考にして下さい。

手元の環境では Ubuntu-22.04 が入っているのでこれを実行し、パッケージを作成したディレクトリに移動した後、下記の通り実行します。

$ ./LinuxServer/Multiplay51/Binaries/Linux/Multiplay51Server

あっさり起動しました。

WSL でLinux DedicatedServer起動

Windows クライアントを 2 つ起動し、127.0.0.1:7777 に接続するとマルチプレイが動いていることが確認できます。

マルチプレイ実行中

なお、接続先の IP アドレスは WSL のバージョンによって異なります。WSL のバージョンはコマンドプロンプトから確認できます。

> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         1

WSL1 であればブリッジ接続のため 127.0.0.1 になります。(LAN 内の他の PC から接続する場合はホストの WindowsPC の IP アドレスになります) WSL2 の場合は NAT の中にいるため、WSL のシェル内で ifconfig で確認して下さい。

$ ifconfig -a | grep inet
inet 172.24.201.78  netmask 255.255.240.0  broadcast 172.24.207.255

LAN 内で複数の PC から接続する場合は、WSL1 の方が便利です。WSL のバージョンはコマンドプロンプトから下記の通り自由に変更可能です。

> wsl --set-version Ubuntu-22.04 1
変換中です。この処理には数分かかることがあります...
変換が完了しました。

まとめ

UE の ThirdPerson テンプレートからプロジェクトを作成し、マルチプレイヤー対応してパッケージング、DedicatedServer を立てる所までをまとめてみました。 WSL のおかげで Linux DedicatedServer の動作確認も手軽にできるようになりましたので、気になったら試してみて下さい。

後、AWS に EC2 インスタンスで DedicatedServer を立てる所は続きの記事に書きました。

文責:ともたこ/Tomotaka Ogino Twitter/github/Qiita