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


はじめに

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

Mirrorを導入してみる。

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

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

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

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

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

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

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

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

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

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

テスト用ホストの準備

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

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

Windows Subsystem for Linux(WSL)を使ってみる

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

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

ただし、このままだとユーザーにroot権限がないので、こちらの方法でrootのパスワードを設定し、rootでログインしてください。

ここから先は、作者による導入方法の解説の"Installing our requirements"に従って作業します。まず、

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

このあと、ユーザーを追加する作業が書いてありますが、そちらは不要(既に上で追加済みなので)です。exitでrootでの作業を終了させてください。

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

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

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

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

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

うまくいけば、こんな感じの画面が出てくるはずです。

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

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

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

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

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

ここからさきは、作者による導入方法の解説のConfiguring the Linux Server (one time setup)のやり方の通りに行えば良いです。WSLでUbuntuを用意してあるので、Linux向けのやり方が使えます。つまり、

ssh root@your-server-ip

で接続し、rootのパスワードを入力してください(途中で警告が出たらyesで良いです)。うまくいくと、ubuntuにログイン出来るはずです。

あとは、作者による導入方法の解説の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キーを押せばデフォルト値が入ります。

これで、ユーザーが作れました。さらにroot権限を与えるために

adduser your-user-name sudo

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

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

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

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


さて、次にビルドしたファイルのアップロードですが、エクスプローラーは使えないので、作者による導入方法の解説のCopying our built game to the serverでお薦めされているWinSCPを使います。こちらからインストールしてください。アプリを起動すると、下のように接続の設定を求められます。

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

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

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

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

おわりに

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