Linux で DedicatedServer 建てたいよォ!
ということで、いろいろ試したことをメモしておきます
この記事は
- UE4.25 で確認します
- AWS EC2 を利用します
- C++ビルド環境が必要です
Windows環境で動作を確認する
まずはエディタ上で動作することを確認しましょう
[選択ビューポート] x [スタンドアローンゲーム] x [Play Offline] x [Play As Client] x [プレイヤー数]
これらの組み合わせをそれぞれ動作確認するので、結構タイヘン。。
エディタ外部からの起動
PIEで起動すれば全てのサーバー、クライアントのプロセスをトレースできます
これはこれで便利ですが、CLI1, CLI2, SERV と複数回コールされる関数(BeginPlay等)を追っていくと頭が非常に疲れるので(!)
プロセスを個別に起動する方法について記述します
Server起動バッチ
:: [UE4DIR], [ProjectName] は自身の環境で置き換えてください
set EDITOR=[UE4DIR]\Engine\Binaries\Win64\UE4Editor.exe
set GAME_UPROJECT=%~dp0%\[ProjectName].uproject
:: 起動マップをオプションで指定する
:: デフォルトはプロジェクト設定の [Server Default Map] が使われる
set MAP_NAME=
:: エディタからサーバーを起動
start %EDITOR% %GAME_UPROJECT% %MAP_NAME% -server -log
exit
Client起動バッチ
set EDITOR=[UE4DIR]\Engine\Binaries\Win64\UE4Editor.exe
set GAME_UPROJECT=%~dp0%\[ProjectName].uproject
start %EDITOR% %GAME_UPROJECT% -game -log -windowed -ResX=1024 -ResY=576
exit
ビルド&クックの実行
次はバイナリ作成について記述します
サーバーのビルドターゲットを追加
テンプレートにはターゲットファイルが存在しないので追加します
using UnrealBuildTool;
using System.Collections.Generic;
public class [ProjectName]ServerTarget : TargetRules
{
public [ProjectName]ServerTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Server;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.Add("[ProjectModuleName]");
}
}
同じディレクトリにある [ProjectName].Target.cs を参考に追加してください
ファイル追加後、uprojectメニューからVSファイルを更新します
ターゲットが増えていることを確認してください(画像はVSCode)
コマンドラインからクック
ググると ProjectLauncher でのチュートリアルが多いですが、
エディタを起動せずに済むのでバッチファイルから実行することをおススメします
set ENGINE_ROOT=[UE4DIR]\Engine
set GAME_UPROJECT=%~dp0%\[ProjectName].uproject
:: 1行が長くなる場合は^で改行する
:: startを入れると終了時にウィンドウが残る
start %ENGINE_ROOT%\Build\BatchFiles\RunUAT ^
BuildCookRun -project=%GAME_UPROJECT% ^
-nop4 -build -cook -compressed -stage ^
-noclient -server -serverplatform=Win64 -serverconfig=Development ^
-pak -utf8output
BUILD SUCCESSFUL と表示されたら完了です
[ProjectDir]\Saved\StagedBuilds\WindowsServer 以下にパッケージが生成されます
フォルダをエクスプローラーで開き、cmdと入力するとその場でコマンドプロンプトが開きます(知らなかった)
-log 引数をつけて exe を実行し、サーバーを起動してください
PIE を起動してから @キー を押し、[open 127.0.0.1] とコマンドを入力するとサーバーに接続できます
Linux 環境を構築する
Linux のクロスコンパイル をまず読みましょう
読みましたね?どうすればいいんだ・・・
そもそも Linux 環境でビルドすればよくないですか?そう思ったあなた!!!
P4環境を作ろうとして、UE4DIRをサブミット&更新かけたらこんな感じになったので怖くてやめました
Setup叩くと120GBくらいあるので・・・そもそもボリューム足りないが・・・
Building Unreal Engine Game Client and Dedicated Server on Linux
やってる人とかいるけどね、どういう運用してるんだろうね
というわけで Windows でビルド -> 実行ファイルだけ転送 のフローにします
ツールチェインのインストール
リンクをクリックしてもインストールが始まりません、が
右クリック -> 新しいウィンドウを開く でインストールできました
再び [Generate Visual Studio project files] を実行すると、Linux がターゲットに追加されるはずです
(この辺は詳細の自信がない・・・)
Linuxサーバーのクック
先ほどの BuildServer.bat 内の -serverplatform を Linux に変更してビルド&クックします
\Saved\StagedBuilds\LinuxServer にパッケージされれば成功です
AWS サーバーを構築する
あまり本題ではないので要点だけ
-
t3.microを起動します(t2より安くて次世代機、しかし無料枠ではない)
-
t3.nanoではメモリが足りないのでサーバーが起動できません(後述)
-
デフォルトのボリューム8GiBだと足りなかったので16GiBに増量(減量についてはめんどくさすぎるので慎重に!)
参考:EC2のボリューム(EBS)容量拡張方法検証 (AmazonLinux) -
使うときだけ起動したいので、ElasticIPで固定しとくと楽です
-
WinSCP で転送しました
\Saved\StagedBuilds\LinuxServer\[ProjectName]\Binaries\Linux\[ProjectName]Server.debug は容量が大きいので、用途に合わせて転送するか決めてください
gdb でスタックトレースとかを追うので開発の場合は必要かも
サーバーの起動
$ ./[ProjectName]Server.sh -log
ひとまずコマンドを実行してみる、が
./[ProjectName]Server.sh: line 5: 2950 Segmentation fault
"$UE4_PROJECT_ROOT/[ProjectName]/Binaries/Linux/[ProjectName]Server" [ProjectName] "$@"
w
gdb デバッガ起動
$ gdb [ProjectName]Server
GNU gdb (GDB) Red Hat Enterprise Linux 8.0.1-30.amzn2.0.3
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from [ProjectName]Server...Reading symbols from /var/www/[ProjectName]/Binaries/Linux/[ProjectName]Server.debug...done.
done.
(gdb) run -log
Starting program: /var/www/[ProjectName]/Binaries/Linux/[ProjectName]Server -log
fork: Cannot allocate memory.
(gdb)
Cannnnnnnnnot allocate memory!!!
ということで、t3nano から t3micro に変更して無事起動できました
[open ###.###.###.###(GlobalIP)] で接続できることを確認
nohup でバックグランド起動
// nohup で起動するため実行権限を付与
$ chmod +x SlothServer.sh
// 標準/エラー出力は適宜変更する
// MapName はオプションです(指定しなかった場合は[Server Default Map])
$ nohup ./SlothServer.sh [MapName] > nohup.out 2> nohup.err &
nohup 起動プロセスをキル
$ pkill SlothServer
参考リンク
How To Set Up Dedicated Servers for Windows and Linux For Your UE4 Game (using Windows)
Legacy/Dedicated Server Guide (Windows & Linux)