Genvid SDK＆サンプル実行トラブルシューティング（随時更新）

# Genvid SDKについて
Genvidは、動画ストリーミングとブラウザを介したインタラクティブな体験を組み合わせた「大規模インタラクティブ・ライブ・イベント」（Massive Interactive Live Events）を実現するSDKです。
https://www.genvidtech.com/ja/mile%E3%81%A8%E3%81%AF%EF%BC%9F/

ゲーム技術をベースに、リアルタイムで進行する動画番組に対して、動画視聴者が能動的に参加できるシステムを提供します。
コンテンツ内のキャラクターが次に何をするかを投票で決めたり、ミニゲームをプレイしてポイントをため、特定のキャラクターを応援するなどの活動を経て、物語が変化していきます。
MILEは、Unityを使いFacebook上で配信されている「Rival Peak」と、Unreal Engine 4を使った「Project Raven」があります。

『RIVAL PEAK』が示す次世代の視聴者参加型デジタルエンタテインメント
https://news.yahoo.co.jp/byline/onokenji/20210326-00229353

Genvid SDKの導入については、Genvidディベロッパーサイトの日本語マニュアルからご確認ください。
https://www.genvidtech.com/for-developers/

さて、GenvidのシステムはWindowsクラウドサーバーで様々なミドルウェアを動作させるというシステム上、ゲーム開発者には不慣れなツールの利用などもあります。
本投稿は普段ゲーム開発（フロントエンド開発、個人開発）をしている方向けに、Genvidを試そう・導入しようと思っているときの引っ掛かりポイントを書いていきます。

# インストール時のポイント
Genvid SDKにはさまざまなツールやライブラリが同梱されています。

- Python 3.5.4
- C++ Build Tools
- Node.js
- AWS Command Line Interface
- TightVNC

そのため、すでにPCにインストールされているソフトウェア・ライブラリとかち合うことがあります。

## Microsoft Visual C++ Build Toolsセットアップに失敗（エラー）
その中には「Microsoft Visual C++ Build Tools」も含まれています。
しかし、￥PCに既に別のバージョンのMicrosoft Visual C++ Build ToolsやVisual Studio 2017, 2019などがインストールされている場合は、そのインストールプロセスに失敗したり、
再インストールのダイアログでエラーになる場合があります。
先に「Microsoft Visual C++ Build Tools」が入っている場合は、ダイアログで再インストールを聞かれたら「いいえ」を選択します。

詳しい情報はGenvid公式サイトのガイドがあります。
https://answers.genvidtech.com/articles/151/unable-to-install-microsoft-c-build-tools-with-sdk.html

## genvid-toolboxのインストール時にcryptographyライブラリがインストールできずに中断される

genvid-toolboxのwheelsで指定されているCryptographyのバージョンが古く、pipの処理がうまく進まないことがありました。

pipの再インストールで治ります。

```
py -3.8 -m pip install -U pip
```

関連
https://github.com/pyca/cryptography/issues/5101

## genvid-toolboxインストール後にgenvid-bastionなどのコマンドが動かずNo Module named 'chardet'などのエラー
動作に必要なpythonモジュールが何らかの理由でインストールされていません。
（ふつうはtoolboxインストール時に依存関係を見て自動的に入れてくれます）

```
pip install [モジュール名]
```

でインストールできます。

# サンプルビルド時のポイント
Genvid SDKのサンプル（Cube Sampleとよばれる四角が転がるもの）やGenvid Tanks Sampleのビルドと実行には、UnityやUE4をメインで使っている方には少々不慣れなコマンドでの操作が必要になります。
踏みがちなトラブルを見ていきましょう。

## Unity EditorでMultiple versions of Newtonsoft.jsonエラー
（またはMultiple precompiled assemblies with the same name Newtonsoft.Json.dllエラー）

Genvid Unity SDKが同梱しているNewtonsoft.jsonライブラリがUnity Editor内に既にあり、競合しています。

ややこしいことにUnity 2020.3のどこかから、Unity Editorをインストールすると自動でUnity Package Managerが「Version Control package」をインストールする挙動になったのですが、これにNewtonsoft.Json.dllが含まれているためエラーの原因になっています。

Version Control（Plastic SCM）を使っていない場合はこのパッケージをアンインストールしましょう。
Genvid SDK側のNewtonsoft.Json.dllの削除でも構いません。

## py unity.py buildに失敗する（ Aborting batchmode due to failue)

Unityのプロジェクトに何らかのコンパイルエラーがあるとコマンドでのビルドも失敗します。
上記で紹介したNewtonsoft.jsonライブラリの重複でも同様のエラーになります。
いちどUnity Editorを起動して、コンパイルエラーの原因を取り除いてください。

##  Project has invalid dependenciesエラー

Genvid Tanksサンプル1.25をUnity Asset Storeからインストールしたときに、Unity Package Managerの依存設定が変（com.unity.package-manager-ui: Package [com.unity.package-manager-ui@2.2.0] cannot be foundエラー）となってインストールが正常に完了しないことがありました。
こちらは、サンプルのバージョンを上げれば問題ありません。
特定の理由で1.25を使う場合は、以下のダイアログが出た時に「Skip」とすれば進めます。

![packagemanagerdependencies______skip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/4c7d4670-07b8-f26b-f6c8-7e6b4c045699.png)

## python.exe: can't open file 'Unity.py'（または 'Web.py'）エラー
「そんなPythonスクリプトは無い」というメッセージです。現在のディレクトリまたは指定したパスに使用したいpyファイルがないということです。

Genvidのマニュアルでは、ディレクトリ移動のコマンドは（細かすぎるので）省いていることがあります。
よくあるのが、pyファイルがあるディレクトリが実は一段下だった（web.pyがフォルダwebの下にある）などによるディレクトリ指定忘れです。
ディレクトリに直接移動したり、適切なパスを指定します。

## verification failed while extracting genvid-math@file:modules\genvid-math.tgz エラー
Webのビルド時にこれが表示された場合は、そのWebサイトの動作に必要なライブラリのバージョンや依存関係がおかしくなっている可能性があります。
web用のデータ一式が入ってィるフォルダ内のnode_modulesフォルダとpackage-lock.jsonを消してから、再度Webのビルドコマンドを実行してみましょう。

## npm WARN tar ENOENT no such file or directoryエラー
こちらもpackage-lock.jsonが悪さをしている可能性が高いです。package-lock.jsonを削除して再実行しましょう。
また、npmのキャッシュが壊れている可能性もあるため、次のコマンドでキャッシュをクリアします。

```
npm cache verify
```

それでも変な場合はcache clean

```
npm cache clean --force
```


## [Errno 2] Cannot find executable in the path: 'Unity.exe'
Genvidのビルドプロセス（unity.pyに含まれるスクリプトを利用）は、PCにインストールされているUnity Editorを自動的に探してきてビルドを行うスクリプトが含まれています。
(run.py の　class UnityTool(SDK):がパス探しをしています）

が、何らかの理由でUnity Hubのjsonにアクセスできなかったり、そのフォールバックであるレジストリキーでのUnity.exeの位置情報が消えていたりすると、exeが見つからずこちらのエラーになります。
理由としてよくあるのが、エディタで別プロジェクトを起動状態のまま、というのがあります。閉じるとコマンドが通るようになります。

動かないときは、レジストリエディターを確認します。適切なデータを与えることでビルドが通るようになります。
具体的にはHKEY_CURRENT_USER\SOFTWARE\Unity Technologies\Installer\Unityの中に「Location x64」と「Version」の文字列値を作ります。

![Unityレジストリキーの修正.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/557ee7a1-9b23-32af-34ac-a062473c96ff.png)
「Location x64」にはUntiy.exeまでのフルパス、「Version」にはUnityバージョンを記入しておきます。

それでもうまくいかない場合は、run.pyのfind_unity関数内にエディタバージョンも含めてパスを直打ちします（最終手段）。

```python
        for pfpath in pfpaths:
            candidate = os.path.join(pfpath, "Unity","2020.3.27f1","Editor", "Unity.exe")
            if os.path.isfile(candidate):
                return candidate

```
(pfpath)にはC:/ProgramFiles等が入ります

# サンプル実行時のポイント
Genvidのセットアップが一通り終わり、管理画面であるCluster UIでタスク「Services」「Unity」「web」が3つとも起動すればOK（SDK 1.35移行は「nats」「bins」を含む5つ）なのですが、設定や環境によって初回でうまくいかないことがあります。
よくある見落としポイントをおさらいしましょう。

![Cluster-UI_ local - Google Chrome 2020-12-02 17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/ff301017-ebe5-b1c8-5b67-543291f84cb2.png)

## タスクServicesが起動しない、存在しない
Genvid Clusterの初期設定がロードされていない可能性があります。
初期設定をロードするコマンドを実行します。

```
genvid-sdk load-config-sdk
```

## タスクUnityが存在しない
Unityのゲームインスタンス（Unityでビルドしたexe）を実行するための設定情報がロードされていません。
パスまたは設定情報が書かれたunity.nomad.tmplまたはgame.hclなどのファイルを個別にロードするか、サンプルの場合は以下のコマンドでロードされます。

```
py unity.py load
```

## タスクUnityが起動しない
Genvid Clusterに読み込まれたゲームのexeファイルのパス情報がおかしい可能性があります。
サンプルの場合は、unity.nomad.tmplファイル内でexeまでのパスを書いてあります。
このファイルに正しいパスを記入してロードするか、Genvid Cluster UI内で直接書き換えます。

Settingsタブ内Jobsタブで、「unity」タスク設定のEditボタン（メモ帳みたいなアイコン）をクリックして設定編集ウィンドウを開きます。

![JobsSettingUnity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/a1be370e-5b92-374d-cef4-5248199b0d54.png)

ちょっと見づらいですが、Task ”Unity”内のConfig -> commandにexeの位置を指定する箇所があります。


## タスクWebが起動しない
Webサイトの実行に必要なビルドがされていない可能性があります。
py web.py buildコマンドを実行して、実効に必要なライブラリ群をダウンロードします。

```
py web.py build
```

## Unsupported argument; An argument named "config" is not expected here. エラー

hcl設定ファイルに必要なブロック「config」が見つからない、というエラーです。
これはGenvid SDK 1.34あたりから内部のサーバーミドルウェアTerraformのバージョンアップがあり、一部の古いサンプルの設定ファイル(HCLファイル）が新しいバージョンで読み込めず、config設定が無い状態になっています。

```
Error! http://[::1]:8092/v1/proxy/local/cluster-api/v1/jobs/start/web
{"errorType":"error","error":"Error parsing job: Error parsing job: Unexpected response code: 400 (input.hcl:11,2-8: Unsupported argument; An argument named \"config\" is not expected here. Did you mean to define a block of type \"config\"?)"}
```

そこで、hclファイルのうち

```hcl
	config = {
	  command = "{{key `local/binary/node/path` | js}}"
	  args = ["{{key `local/website/script` | js}}"]
	}
```

と、configのあとに=が入っているものを見つけ、この=を消すことで設定ファイルが正常に読み込まれるようになります。

# 今後のSDKバージョンアップに向けて
Genvid SDKのバージョンアップは日々行われており、Unity / UE4も同様です。どうしても開発環境や併用しているアセット等の組み合わせがうまくいかないケースもありますので、
随時情報収集して更新していきます。