UE4でビルドしたLinux用DedicatedServerのビルドをWindows Subsystem for Linuxで起動してみる

# 初めに

この記事では、UE4でLinux用のパッケージ化できる状態から、***Linux DedicatedServerをWSLを用いてLocalで起動して、Windows Clientアプリで接続するまでについて説明します。***

クラウドや実際にホスティングをする前に、手元でデバックや挙動を確かめておきたいことがよくあると思います。ここでは、Windows上で、簡単にLinuxのサブシステムを動かすことができるWSLを用いて、サーバーでの挙動の確認を行っていきます。

# 前提

- ソースからUE4のビルドができている。

https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/DevelopmentSetup/BuildingUnrealEngine/


- Linux用のパッケージ化がEditorからできるようになっている。

https://docs.unrealengine.com/4.27/en-US/SharingAndReleasing/Linux/GettingStarted/

https://youtu.be/WKRi8bZCsFM

## 開発環境

- Windows  10
- Visual Studio IDE / 2019
- Unreal Engine / 4.27.2 Built From Source Code
- Toolchain **-v19** [clang-11.0.1-based](https://cdn.unrealengine.com/CrossToolchain_Linux/v19_clang-11.0.1-centos7.exe)
- プロジェクトファイルは、C++を使用したプロジェクトを想定しています。
- WSL2の有効化 (以下の記事などを参考に利用できるようにしておきます)
    - https://bsblog.casareal.co.jp/archives/5361
    - https://qiita.com/matarillo/items/98d7452967987fe5d633

# Setup

まず初めに、パッケージ化したいプロジェクトファイルのDefaultEngine.iniファイルに、Linuxのターゲット設定を追記します。

```bash
[/Script/LinuxTargetPlatform.LinuxTargetSettings]
TargetArchitecture=X86_64UnknownLinuxGnu
```
![image (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/9e720e36-6b88-9a85-0c3a-a93054b54177.png)
(この追加作業は、現場のUE4.27では必要ないかもしれません。)

DefaultEngine.iniファイルは、`[ProjectRoot]/Config/DefaultEngine.ini`にあります。

さらに、`[ProjectRoot]/Source`にServerとClientのターゲットファイルを追加します。

![image (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/14cdc8bf-fb39-9aa8-88ad-29edad66850e.png)


例えば、Server用のターゲットファイルには、

```csharp
using UnrealBuildTool;
using System.Collections.Generic;

public class LinuxSampleServerTarget : TargetRules
{
	public LinuxSampleServerTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Server;
		DefaultBuildSettings = BuildSettingsVersion.V2;
		ExtraModuleNames.Add("LinuxSample");
	}
}
```

のように、プロジェクトファイル生成時に生成されるLinuxSmapleEditorファイルをコピーした内容から、Editor部分をServerやClientという文字列に置き換えたファイルを追加します。この設定を行い、再度プロジェクトファイルを右クリックから、Generate Visual Studio project filesをすると、

![image (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/6d818ce1-9206-17f4-a3db-c3a979f1fa5e.png)


パッケージする設定から、どのビルドターゲットにするかを選択できるようになります。

![image (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/e5b21557-89ee-fc45-3ba2-f9c0c4927a14.png)

# Build

ここまでの設定が完了したら、プロジェクトファイルを開き、Package ProjectからBuild ConfigurationをDevelopmentに、先ほどのBuild TargetをServerにした状態で、Linuxのビルドを行います。

![image (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/3240d50e-92b2-8d74-ca58-988e3e944e3c.png)

今回は、パッケージ化したファイルをプロジェクトフォルダー内のPackagesフォルダーに保存します。例えば、以下のようにプロジェクトファイル名 + Serverというファイルが、以下のパスにあることが確認できるともいます。

![image (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/356a7fc6-3138-ea1c-43bd-b5ad0d0395c2.png)

この作業は、VSからも以下のようにターゲットをServer、プラットフォームをLinuxに設定してビルドすることでも必要なファイルを手に入れることができます。

![image (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/8d66c9f1-2cbc-4c6d-ea3b-c40e4de8d349.png)

同じ手順で、windowsのclientアプリに関してもビルドしておきます。

![image (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/6ac74ed8-c088-fbe8-4711-69dec31fb356.png)
# Usage
これまでで必要なパーツが揃ったので、実際にWSLを用いてLinux 上で先ほどのビルドを立ち上げていきます。

今回は、Microsoft StoreにあるUbuntu 18.04 LTSを利用します。WSL2からlocal hostへのアクセスがそのままではできないので、WSL上のIPを

```bash
ip -4 addr show eth0
```

 で取得します。

[can't access 127.0.0.1:80 outside of WSL2 / Ubuntu 20.04](https://superuser.com/questions/1594420/cant-access-127-0-0-180-outside-of-wsl2-ubuntu-20-04)

このIPにWindowsのClientアプリからアクセスすることで、サーバーにアクセスできるように、先ほどのビルドを起動します。

Linuxのビルドは、私の場合は、 /mnt/c/UE/MySample/LinuxSample/Packages/LinuxServer/LinuxSample/Binaries/Linux/

にあるので、

```bash
cd /mnt/c/UE/MySample/LinuxSample/Packages/LinuxServer/LinuxSample/Binaries/Linux/
./LinuxSampleServer xxx.xx.xxx.xxx -log
```

で起動します。-logをつけることで、Serverのlogを見ながら接続が可能になります。また、xxx.xx.xxx.xxxには、先ほどip addr showで取得したIPを入力してください。

この状態で、今度は、Windowsのcmdなどで、Clientアプリを起動します。起動は、

```bash
{Clientアプリ実行ファイルまでのpath}/LinuxSampleClient -log xxx.xx.xxx.xxx -windowed resx=720 resy=480
```

とすることで、適当なサイズのwindowでサーバーへ接続するwindowsのアプリケーションを立ち上げることができます。

![image (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/e2b341c9-4f88-4fac-bbfe-924c6eae985d.png)

#Reference

https://baemincheon.github.io/2019/08/19/unreal-linux-server-build/