[SpatialOS] SpatialOS GDK for Unity のインストール～MMO FPSゲームサンプルの起動を試してみた

インターネットをご覧の皆さん こんばんは。

いままでアルファ?ベータ?版だった [SpatialOS](https://improbable.io/games) ですが、先日 "[SpatialOS GDK for Unity](https://gdk.improbable.io/spatialos-gdk-unity)" としてローンチされたようです。（ ~~for Unreal はまだアルファの模様~~ [SpatialOS GDK for Unreal](https://gdk.improbable.io/spatialos-gdk-unreal)も公開されました ）

SpatialOS GDK for Unity launch: build multiplayer games faster
https://improbable.io/games/blog/spatialos-gdk-for-unity-launch

SpatialOS を採用したゲーム開発に関してもいくつかトピックスがありましたので、今後さらに開発は進んでいくのではないかと思います。

* [Midwinter Entertainment announces funding and technology partnership with Improbable and unveils flagship title, Scavengers](https://improbable.io/company/news/2018/03/13/midwinter-entertainment-announces-funding-and-technology-partnership-with-improbable-and-unveils-flagship-title-scavengers)
* [NetEase Games reveals new details for Nostos VR including SpatialOS integration](https://improbable.io/company/news/2018/08/22/netease-games-reveals-new-details-for-nostos-vr-including-spatialos-integration)
* [Former BioWare General Manager Aaryn Flynn Joins Improbable as General Manager, North America](https://improbable.io/company/news/2018/09/19/aaryn-flynn-joins-improbable)


今回は新しくなった SpatialOS GDK for Unity の公式ドキュメント [Get started](https://docs.improbable.io/unity/alpha/content/get-started/get-started) を試してみたので、かいつまんで書いてみようと思います。


試した時点の環境は

* SpatialOS 14.0-b6143-48ac8-WORKER-SNAPSHOT
* Windows10
* Unity2018.2.8f1
* .NET Core SDK 2.1.403

です。

# 0. ユーザ登録
まずはユーザ登録を行います。今のところは無料で試せるようです。
https://improbable.io/get-spatialos

# 1. 環境構築
SpatialOS GDK for Unity が対応しているバージョンの開発環境をインストールします。
2018/10/20 時点では以下のバージョンが必要なようです。公式ドキュメントから各種リンクが張られています。
https://docs.improbable.io/unity/alpha/content/get-started/set-up#set-up-your-machine

 * Unity 2018.2.8
  * Linux Build Support (server-workers で必要)
  * Mac Build Support (作成したゲームをMacユーザに配布したいときは必要)
  * ~~※はじめは Unity2018.2.13f1 で試そうとしたのですが、モジュールの参照が外れたりエラーが出たので素直に Unity2018.2.8f1 をインストールしました。~~<br>※追記:2018/11/24時点ではバージョンUnity2018.2.14になっていました。都度上がりそうなので公式ドキュメントをチェックしてください。
 * .NET Core SDK (x64) 2.1.3xx or 2.1.4xx
 * SpatialOS Installer
 * コードエディタ
  * Visual Studio 2017 or Rider がおすすめらしい。
  * Visual Studio を使用する際は、Visual Studio Installer から ".NET Core cross-platform development" と "Game development with Unity" を追加。

# 2. サンプルゲームの準備
https://docs.improbable.io/unity/alpha/content/get-started/set-up#clone-the-repos

1. SpatialOS GDK for Unity ではサンプルとして FPS Starter Project が提供されています。
FPS Starter Project は GitHub で提供されていますので、Clone してきます。
https://github.com/spatialos/gdk-for-unity-fps-starter-project

1. clone したリポジトリのルートから以下のコマンドを実行します。
```powershell scripts/powershell/setup.ps1```
このコマンドで、GDK for Unity が所定の場所に clone されます。

1. Unity のバグがあるらしい ( https://docs.improbable.io/unity/alpha/content/get-started/open-project ) ので対処を行います。
※使用する Unity やサンプルコードのバージョンが上がれば解決しているかもしれません。
 - Shader の Reimport：Project パネルから Assets/Fps/Art/Materials/Source_Shaders を選択し、右クリックメニューから Reimport を行います。
 - Navmesh を Rebake：Assets/Fps/Scenes/SimulatedPlayerCoordinator シーンを開き、Hierarchy から FPS-Start_Large を選択して Enable にします。<br>Windows > AI > Navigation で Navigation パネルを開き、Bake タブから Bake を行います。<br>Assets > Fps > Scenes > FPS-SimulatedPlayerCoordinator 内の Navmesh のアイコンが正常に表示されれば Bake 成功です。FPS-Start_Large を Disable に戻しておきます。


# 3. サンプルゲームのビルド > アップロード > 起動
https://docs.improbable.io/unity/alpha/content/get-started/build-workers
https://docs.improbable.io/unity/alpha/content/get-started/upload-launch

1. worker のビルドを行います。（worker はSpatialOSの処理単位です。）
Unity エディタの Jobs メニュー から Enable Burst Compilation が無効になっているのを確認した後、 SpatialOS メニューから Build for cloud > All workers でビルドを行います。<br>ビルドが成功すると、コンソールに "Completed build for Cloud target" というメッセージが出力され、gdk-for-unity-fps-starter-project/build/assembly 以下に worker の zip が生成されます。

1. サンプルゲームをデプロイするにはプロジェクト名が必要です。
登録したアカウントでログインを行い[console](https://console.improbable.io)を表示すると、
「beta_ほげ\_ふが_数値」という名前のプロジェクトが用意されているはずです。

1. 設定ファイル gdk-for-unity-fps-starter-project/spatialos.json の "name" を自分のプロジェクト名に変更します。

```json:spatialos.json
{
    "name": "beta_ほげ_ふが_数値", <- この部分を変更
    "project_version": "0.0.1",
    "sdk_version": "14.0-b6143-48ac8-WORKER-SNAPSHOT",
    "dependencies": [
        {"name": "standard_library", "version": "14.0-b6143-48ac8-WORKER-SNAPSHOT"}
    ]
}
```
4. コマンドプロンプト or Powershell で gdk-for-unity-fps-starter-project/ に移動し、以下のコマンドを実行してアップロードを行います。
アセンブリ名は自由につけることができるようです。ここでは fps-assembly にしています。
```spatial cloud upload fps-assembly```

5. 続いて以下のコマンドを実行して起動を行います。
コマンドでは、アセンブリ名 / 設定 / デプロイ名を指定します。
アセンブリ名はアップロード時に指定したものです。
デプロイ名は自由につけることができるようです。ここでは shootyshooty にしています。デプロイ名は SpatialOS web Console に表示されます。
```spatial cloud launch --snapshot=snapshots/default.snapshot fps-assembly cloud_launch_large.json shootyshooty```

起動時の web Console
![WebConsole.png](https://qiita-image-store.s3.amazonaws.com/0/191218/40d6d0ae-4c15-5e89-f46f-50b332379cd7.png)



# 4. サンプルゲームで遊ぶ
https://docs.improbable.io/unity/alpha/content/get-started/get-playing

1. [console](https://console.improbable.io) から、デプロイしたゲームを選択し、 Overview 画面を表示します。
Overview画面左端のLAUNCHボタンを押すと、ゲームを起動するリンクが表示されるので、そのリンクからゲームを起動できます。<br>![Launch.png](https://qiita-image-store.s3.amazonaws.com/0/191218/51d24c4f-460f-5c8e-bae3-9e9eaba69ef2.png)

1. マルチプレイを行いたい場合は、Overview 画面左端の SHARE ボタンを押すと、共有するための URL が発行されますので、その URL 経由でゲームが起動できます。

1. サンプルゲームでは、WORKER FLAGS 画面から fps_simulated_players_per_coordinator パラメータを変更することで、敵AIを生成することもできるようです。<br>![enemy.png](https://qiita-image-store.s3.amazonaws.com/0/191218/a5890e76-1a2d-a1e1-c711-a9ddc7a53a2a.png)

ゲーム画面はこんな感じ。
![Game.png](https://qiita-image-store.s3.amazonaws.com/0/191218/d577d649-ab8e-3bf8-a1b9-7371383fce6a.png)

console の Inspector 画面では、ゲーム内の状況も見れます。
![inspector.png](https://qiita-image-store.s3.amazonaws.com/0/191218/e0a3b6de-0bbb-6162-4a57-5f5235d2bdde.png)


# おわりに
SpatialOS の CLI ツール等がインストーラから入れられるようになったりと、以前より手軽に導入できた印象です。

最新の環境が必要になった分、特に Unity の新しい機能に対応しているようなのは、開発のしやすさやパフォーマンスに恩恵があるかもしれません。
(ECS とかも使ってたりする模様 https://improbable.io/games/blog/unity-gdk-our-first-steps)

FPSサンプルゲームは、バトルロイヤル系のゲームの参考になりそうな感じだなと思いました。

以上 おつきあいいただきありがとうございました。