#はじめに
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を使ったセットアップは非常にシンプルで驚きました。まだ使いこんで無いので、そのうち色々問題出てくるかもしれませんが、ネットワークの勉強にはちょうどよさそうです。