Unity向けネットワークライブラリMirrorをLinuxサーバーにホストする

#はじめに

Unity向けのネットワークライブラリとして[Mirror](https://mirror-networking.com/)が有名です。私もローカルネットワークでのマルチプレイヤーVRアプリで使ってますが、リモートサーバーにホストして使うこともできます。一見すると難しそうですが、ネットワークの知識が殆どない私でも作れたので、多分皆さんも大丈夫です。

#Mirrorを導入してみる。

推奨Unityバージョンは2018.3.6です。作者は、LTSバージョンを使うことを**強く**推奨していますが、一応、Unity2019.3などでも動きます。Mirrorアセット（無料）をダウンロードしてインポートしたら、Assets/Mirror/Examples/Pong/ScenesフォルダのSceneを開いてみましょう。いわゆるPongゲームのシーンになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/c41be89a-4ee0-a34e-a743-b5970075de70.png)

左上のClientを押すと、ゲームに参加できます。ただし、現状ではネットワーク化されてないのでゲームは始まりません。

#サーバーサイドのビルドを準備する

そこで、サーバーを準備することになります。Unity2018.3から"Server Build"が追加され、画像を表示しないHeadless Modeで動作させることが可能になりました。これをサーバーに置いて、クライアントに通信させます。

Mirrorでは、下のようにNetwork Managerコンポーネントの"Start on Headless"にチェックを入れると、Server Buildしたアプリ上では自動的にStartServer()が実行されてサーバーがスタートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/b4c05cc0-5f64-ad5f-fbc9-d2b5ee981bae.png)

さてここでは、公式のお勧めに従い、Linux上でサーバーを動かして、Windows上でクライアントを動かす方法をとります。そのためには、まずLinux向けにビルドする必要があります。Unityをインストールする際にLinuxをターゲットに含めていなかったら、Unity Hubからモジュールを追加しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/cecee525-be20-b44f-f2e2-4895e2666ded.png)

それがすんだら、下のようにLinuxをTarget Platformにし、"Server Build"にチェックを入れてビルドしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/193330f9-505d-a248-0d7c-e0832424c6e6.png)

生成されるファイルは以下の通りです。これらを、下の項で示す方法でLinux上にコピーして実行すれば、サーバー上で動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/14077109-8943-b400-b676-0256511dfc69.png)

Linux上でサーバー側アプリが動作している状態で、Windows側のUnity EditorをPlayし、サーバーのIPアドレス（同一マシン上ならlocalhost)を入力して画面左上のClientボタンを押すと、下のようにプレイヤーとしてゲームに入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/48e61fcf-b8f0-9116-743a-104911560b3e.png)

もう一台Clientを用意して同じようにサーバーに接続すればPingを遊べます。


#テスト用ホストの準備

ホスト用のサーバーを準備する方法を説明します。作者による導入方法の解説が[こちら](https://noobtuts.com/unity/unet-server-hosting)です。作者によると、Azure、Amazon、Googleのインスタンスはファイアウォールの設定がめんどくさいので、とりあえずは避けた方が良いそうです。作者が進めているのは [namecheapという会社のVPSホスティング](https://www.namecheap.com/hosting/vps/)です。OSはLinux(Ubuntu)を使ってほしいとのことです。

namecheapはお安くサーバーを立てられますが、それでも無料ではないので、練習用にとりあえずローカル環境で準備できる方法を考えます。

## Windows Subsystem for Linux（WSL）を使ってみる

そこで、Windows10上にLinuxインスタンスを作れるWindows Subsystem for Linux(WSL)を活用します。WSLの有効化、Ubuntuのダウンロードなどは[こちらの記事](https://qiita.com/SSMU3/items/4f0f28c4b630d162d4d8)のやり方で大丈夫です。導入するUbuntuはnamecheapなどでも使っている18.04LTSにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/0678c95f-9129-c970-a35c-397b9233e412.png)

Ubuntuを起動するとインストール処理の後、UNIX Username, passwordの入力を求められるので、ユーザーネームとパスワードを決めて、入力してください。そうすると、コマンドプロンプトになります。

ただし、このままだとユーザーにroot権限がないので、[こちらの方法](https://www.lisz-works.com/entry/wsl-root-password-change)でrootのパスワードを設定し、rootでログインしてください。

ここから先は、[作者による導入方法の解説](https://noobtuts.com/unity/unet-server-hosting)の"Installing our requirements"に従って作業します。まず、

```
apt update
apt -y dist-upgrade
apt -y install screen tmux sudo zip unzip
```
このあと、ユーザーを追加する作業が書いてありますが、そちらは不要（既に上で追加済みなので）です。`exit`でrootでの作業を終了させてください。

このあと、作者による導入方法の解説では、WinSCPを使ったファイル転送の話が出てきますが、ローカルでファイルをやり取りするなら、エクスプローラーでパスに`\\wsl$`を入力すると、Ubuntu-18.04のフォルダを見ることが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/40f65f20-b147-7aa2-c5d5-36967ea254fc.png)

ユーザーのディレクトリは`\\wsl$\Ubuntu-18.04\home\ユーザー名`になります。

こちらに、UnityでLinuxをターゲットにビルドして、出来てくるファイルを直接コピーできます。ここでは`Server.x86_64`というアプリ名としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/14077109-8943-b400-b676-0256511dfc69.png)

次に、作者による導入方法の解説にあるとおり、以下のコマンドを実行すれば、サーバーが起動します。

```
sudo chmod +x ./Server.x*
./Server.x86_64
```
うまくいけば、こんな感じの画面が出てくるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7608578c-e51a-2bd2-f906-0b3a4c1a72dc.png)


終了させるにはCtrl+CでOKです。

ここまで準備出来たら、上でやったように、クライアントを接続させてください。WSLと同じマシンでクライアントを動かすならアドレスはlocalhost（あるいは127.0.0.1）、同じローカルネットワークの別のマシンを使うときは、ifconfigでWSLが動いてるマシンの(127.0.0.1じゃないほうの）IPアドレスを確認して使ってください。うまくいかないときは一旦Ubuntuを閉じて、やりなおしてください。

# リモートサーバーをレンタルして使う

WSLを使って自信がついたら、リモートサーバーをレンタルしてみましょう。上で紹介したnamecheapを使ってみます。VPS Hostingで一番安いのは月額$11.88のコースのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/fee0a26b-e7d0-deb8-92f7-2f53c5613f1d.png)

申し込むと、数時間後にアカウント情報などが送られてきます。とくにSSH接続に関する情報が重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/b828fefd-2e7e-16fc-dacf-4be9d4aa0bd2.png)

ここからさきは、[作者による導入方法の解説](https://noobtuts.com/unity/unet-server-hosting)のConfiguring the Linux Server (one time setup)のやり方の通りに行えば良いです。WSLでUbuntuを用意してあるので、Linux向けのやり方が使えます。つまり、
```
ssh root@your-server-ip
```
で接続し、rootのパスワードを入力してください（途中で警告が出たらyesで良いです）。うまくいくと、ubuntuにログイン出来るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/bea37d6b-4709-f8f5-845d-cb4c06203cb8.png)

あとは、[作者による導入方法の解説](https://noobtuts.com/unity/unet-server-hosting)のInstalling our requirementsの指示に従い、以下の命令を実行し

```
apt update
apt -y dist-upgrade
apt -y install screen tmux sudo zip unzip
```

次に、root以外のユーザーを追加します。

```
adduser your-user-name
```
your-user-nameは自分で選んだユーザーネームを入れてください。このユーザーネームはメモっておきましょう。
すると以下の通り、パスワードなどの情報の入力を求められます。Full NameなどはEnterキーを押せばデフォルト値が入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/5599646b-2ccf-8350-a7f0-ec5b44e31f85.png)
これで、ユーザーが作れました。さらにroot権限を与えるために

```
adduser your-user-name sudo
```

も実行してください。これがおわったら、rootでの作業は終了なので`logout`を入力してください。

こんどは、作ったユーザーでログインしましょう。

```
ssh your-user-name@your-server-ip
```

your-user-nameはさっき作ったユーザーの名前、your-server-ipはリモートサーバーのipアドレスです。実行すると、パスワードが求められるので（rootの方ではなく）先ほど設定したものを入力すればログインできます。

---

さて、次にビルドしたファイルのアップロードですが、エクスプローラーは使えないので、[作者による導入方法の解説](https://noobtuts.com/unity/unet-server-hosting)のCopying our built game to the serverでお薦めされているWinSCPを使います。[こちら](https://winscp.net/eng/download.php)からインストールしてください。アプリを起動すると、下のように接続の設定を求められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/dd61e5d1-dbc4-1ec4-8ddf-a343495cddf2.png)

転送プロトコルはSFTP, ホスト名にリモートサーバーのipアドレスを入れ、ポート番号は22で、ユーザー名とパスワードは上で作ったユーザーアカウントのものを使ってください。接続が上手くいくと、下のような画面になり、右側の方へファイルをドラッグアンドドロップすると、ファイルが転送されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/820663a6-ccf0-010f-b93a-5f7d33028666.png)

ここから先は、WSLのUbuntuでやるのと同様に

```
chmod +x ./Server.x*
./Server.x86_64
```

でビルドを実行できます。

# おわりに

自分のようなネットワーク技術の素人にとって、マルチプレイヤーゲーム用のサーバーを用意するというのは非常にハードルが高く感じられたのですが、Mirrorを使ったセットアップは非常にシンプルで驚きました。まだ使いこんで無いので、そのうち色々問題出てくるかもしれませんが、ネットワークの勉強にはちょうどよさそうです。