MRTK(HoloLens2)ProjectのUnity 2021へ移行時のエラー対処(CS0269,CS0165)


# 環境

- Windows 10 Pro 21H2
- MRTK 2.6.0 から 2.7.3 へ
- Unity 2019.3 LTS から 2021.3 LTS へ
- MixedReality-WebRTC 2.0.2

# ご注意

- 古くからあるプロジェクトのため、MixedReality-WebRTCを使っている
- GitHubには、`MR-WebRTC has been deprecated. `と明記されている、利用時は注意
  - https://github.com/microsoft/MixedReality-WebRTC
- 筆者の環境では、移行がうまくいったように思えるが、まだ検証段階である、移行の判断は慎重に行うのがよいと思う

# 背景

- Unity built-in VR(Unityの組み込みのVR機能)が2019で廃止
- 移行するのが億劫で、長らく2019を使ってきたが、2019 LTSが終了するので移行を決意

# 「Unity built-in VR」形式から 「Unity XR Plug-in」形式への移行

- Hierarchyにある既存の「MixedRealityToolkit」を削除して、公式サイトにある手順を実行したら、特にはまることなくうまくいった
- しかし、別ところで、大きくはまったのでメモ

# Unity 2021で、C#エラーチェックが厳格になった

- 未割当の変数を使用する、未割当のout パラメーターを使用する、などをエラーにしてくれるようになった（ありがたい！）

```
- CS0165: Use of unassigned local variable
- CS0269: Use of unassigned out parameter '’
```

# MRTK 2.7.2（おそらく、これ以前）だと、未割当のエラーが発生する

- （エラーチェックの厳格化は、ありりがたい限りだが、移行のときにエラーが発生すると動揺を隠せない）

```
Library\PackageCache\com.microsoft.mixedreality.toolkit.tools@8eafd83ed930\MSBuild\Scripts\Utilities.cs(132,17): error CS0269: Use of unassigned out parameter 'guid'
Library\PackageCache\com.microsoft.mixedreality.toolkit.foundation@6e9ce41f130d\SDK\Features\UX\Scripts\BoundsControl\BoundsControl.cs(939,54): error CS0165: Use of unassigned local variable 'colliderByTransform'
Library\PackageCache\com.microsoft.mixedreality.toolkit.foundation@6e9ce41f130d\SDK\Features\UX\Scripts\BoundsControl\BoundsControl.cs(947,54): error CS0165: Use of unassigned local variable 'rendererBoundsByTransform'
Library\PackageCache\com.microsoft.mixedreality.toolkit.foundation@6e9ce41f130d\SDK\Features\UX\Scripts\BoundingBox\BoundingBox.cs(1906,54): error CS0165: Use of unassigned local variable 'colliderByTransform'
Library\PackageCache\com.microsoft.mixedreality.toolkit.foundation@6e9ce41f130d\SDK\Features\UX\Scripts\BoundingBox\BoundingBox.cs(1914,54): error CS0165: Use of unassigned local variable 'rendererBoundsByTransform'
```

- 以下のコミットで修正されている
- このコミットが取り込まれたバージョンが、MRTK Ver.2.7.3

https://github.com/microsoft/MixedRealityToolkit-Unity/commit/b199b3459298f31a599c28ab7863d0abb1a5acdf

# MRTK 2.7.3のインストール

- MRTK 2.7.3にすれば無事解決なのだが、MRTK 2.7.3のインストールにひと手間必要だった
- 手元にあった「MixedRealityFeatureTool-1.0.2104.4-Beta」を使って、MRTK 2.7.3 をインストールしようとしたが、なぜか2.7.2までしかリストに表示されない（筆者の環境だけかもしれない）
- 本記事執筆時の最新「MixedRealityFeatureTool-1.0.2203.0-Preview」を使うと、MRTK 2.7.3をインストールできた
- 「MixedRealityFeatureTool-1.0.2203.0-Preview」を使うと、MixedReality-WebRTCがリストに表示されない（3回くらい確認したが、やはりないと思う）
  - GitHubには、`MR-WebRTC has been deprecated. `と追記されているので、終了ということなのだろう
- Beta版とPreview版の両方、使えば無事解決なのだが、そう簡単にいかせてくれない

# MixedRealityFeatureToolのBeta版とPreview版の共存

- 一度、Preview版を起動してしまうと、Beta版が正常動作しなくなる（つまり、MixedReality-WebRTCをインストールできなくなる）
- 設定ファイルの構造が違うからと思われる
- `%appdata%\..\Local\MixedRealityFeatureTool` 以下にあるファイルをバックアップ取って、削除すると
- Beta版が再び正常動作するようになる
- Beta版でMR-WebRTCをインストールして、その後、Preview版でMRTK 2.7.3をインストールという手順でうまくいった

# MixedRealityFeatureTool BetaがなくてもMR-WebRTCをインストールできるように

- deprecatedだとしても、デモ制作などで、MixedReality-WebRTCに頼る機会が今後もあるかもしれないので
  - 早く代替（Microsoft Meshなど）がリリースされればよいのだが
- MixedRealityFeatureToolがなくても、MixedReality-WebRTCをインストールできるようにメモ
- `com.microsoft.mixedreality.webrtc-2.0.2.tgz` ファイルを保存しておく
  - 以下からもダウンロードできる
  - https://github.com/microsoft/MixedReality-WebRTC/releases/download/v2.0.2/com.microsoft.mixedreality.webrtc-2.0.2.tgz
- `ProjectPath\Packages\MixedReality\` に配置する
- `manifest.json` に以下の1行を追加

```js:manifest.json
"com.microsoft.mixedreality.webrtc": "file:MixedReality/com.microsoft.mixedreality.webrtc-2.0.2.tgz",
```

- パッケージマネージャー（UPM）管理にせずに、tgzファイルを解凍して、Assetsフォルダに入れてもよい
  - その場合、Editorの軽微なエラーが発生する、以下に対処方法を書いた

https://qiita.com/hachicomb/items/fd8a113fb4bcd710b670


# さいごに

- `MR-WebRTC has been deprecated`なので、次は、WebRTC部分の移行を検討しないといけない
- 独自に開発するか、Unity WebRTCを待つか、Microsoft Meshを待つか熟考中だが、
- ARM64対応したMicrosoft Meshで快適にリアルタイム通信ができる未来を望む
  - MixedReality-WebRTC は、ARM32bitしか対応していなく、いろいろ苦労した