こちらは Unreal Engine (UE) Advent Calendar 2022 のカレンダー 2 、12 月 18 日分の参加記事となります。
UE5 で ThirdPerson テンプレートのプロジェクトを改造し、最短でマルチプレイヤーに対応して DedicatedServer を立てる所までの手順を書きます。 ListenServer を使う記事は多数見つかりますので本稿では扱いません。最初から DedicatedServer しか眼中にない!という奇特な方を対象としています。
方針
公式ドキュメントの専用サーバーを設定するによると、 OpenLevel に IP アドレスを渡すことで DedicatedServer に接続しに行きます。 そのため、普通に ThirdPerson テンプレートからプロジェクト作成した後、まずはログイン用のレベルと IP アドレス入力と接続ボタンの UI を作成します。
プロジェクト作成とマルチプレイ用の設定
UE エディタを起動し、ThirdPerson テンプレートから Blueprint のプロジェクトを作成します。
また、ThirdPerson テンプレートには物理で動くキューブが 3 とほど置かれていますが、動きが Replicate しない設定になっているため、修正しておきます。
ログイン用のレベルを作成
コンテンツブラウザの何もない所で右クリックしレベルを選択します。
名前は何でも問題ありませんがここでは LoginMap にしました。
ログイン用 UI の作成
IP アドレス入力と接続ボタンの UI 用として、WBP_OpenIPAddr
という Widget を作成します。
Widget の構成はこのようにしましたが、IP アドレス入力欄と OpenLevel のボタンさえあれば問題ありません。
OpenLevel ボタンをクリックされた時のロジックをイベントグラフに実装します。TextBox に入力されたテキストを OpenLevel に渡すだけですね。
起動時にログイン用 UI を表示
LoginMap のレベル BP を開き、下記のように実装します。DedicatedServer の時は UI の表示はできないため除外しています。
PlayInEditor でログイン UI の動作確認
早速実行してみましょう。LoginMap レベルを開いた状態で、Play ボタン右側のメニューから NetMode が Play As Client になっている事を確認してから、Play ボタンをクリックします。
以下のような画面が表示されたら成功です。
なお、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
によりログを出力します。
- UE4 MultiPlayer Online Deep Dive 基礎編 1 -Getting Started- (historia 様ご講演) #UE4DD (pp.64)
- 【UE4】マルチプレイにおける Dedicated Server の建て方
下記エラーが表示された時は、uproject ファイルのパスがフルパス指定になっているかどうか確認して下さい。
DedicatedServer の起動に成功すると、ログ画面が出現します。ポート 7777 にて待ち受けをしていることがわかります。7777 は UnrealEngine のマルチプレイヤー接続に使用されるデフォルトの UDP ポートです。
PlayInEditor(緑色の Play ボタン)を実行し、120.0.0.1:7777
を入力、OpenLevel をクリックします。
レベル遷移成功です!おめでとうございます。
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++ビルドに必要な Source フォルダや VisualStudio のソリューションファイル(*.sln)が生成されています。
Source\Multiplay51
フォルダ以下に生成されたMyClass.h
,MyClass.cpp
はもういらないのでエクスプローラから削除しておいて下さい。
ServerTarget の追加
Source フォルダ内を開き、 Multiplay51Editor.Target.cs
をコピー&ペーストしてMultiplay51Server.Target.cs
を生成します。
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 のプロジェクトを生成するため少し時間がかかります。
Windows 用クライアントのパッケージング
UE エディタを起動し、Windows 用クライアントのパッケージングを行います。 Platform のメニュー内の Windows を開き、Build Target が Multiplay51 になっている事を確認し、Package Project を実行します。
Linux 用 DedicatedServer のパッケージング
続いて Linux 用 DedicatedServer のパッケージングを行います。 Linux のビルドには予めクロスコンパイルチェーンのインストールが必要となります。未入手の場合は下記からダウンロード・インストールして下さい。 開発要件
Platform のメニュー内の Linux を開き、Build Target が Multiplay51Server になっている事を確認し、Package Project を実行します。
以上でパッケージングは完了です!
手元で Linux DedicatedServer を立てる
Linux 用の DedicatedServer を手軽に実行するには Windows10 以降に付属している WSL(Windows Subsystem for Linux)を使用します。 未入手の場合は下記を参考にして下さい。
手元の環境では Ubuntu-22.04 が入っているのでこれを実行し、パッケージを作成したディレクトリに移動した後、下記の通り実行します。
$ ./LinuxServer/Multiplay51/Binaries/Linux/Multiplay51Server
あっさり起動しました。
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 を立てる所は続きの記事に書きました。