【メモ】Unity 2019.4 で XR Plug-in Manager から Oculus を選んだら import 無限ループにハマったけど無事脱出できた話。

TL;DRはこちら：[LINK TO THE SECTION](https://qiita.com/liveasnotes/items/c3fab2c1a83679254ba2#tldr)

# 環境情報

- Windows 10 Home
- Unity 2019.4.0f1, 2019.4.1f1
- Oculus Rift

# 流れ
Unity 2019.4 (LTS) が来たので、早速インストールした。

ついでなので、「[ゼロからはじめるHDRP 第2回 デジタルヒューマンをプレイヤーキャラにする（6月16日号） - Unityステーション](https://www.youtube.com/watch?v=fnsTnSzW4L0)」も試してみた。
[![ゼロからはじめるHDRP 第2回 デジタルヒューマンをプレイヤーキャラにする（6月16日号） - Unityステーション](http://img.youtube.com/vi/fnsTnSzW4L0/0.jpg)](https://www.youtube.com/watch?v=fnsTnSzW4L0)

なかなか良いモデルなので VR で見たくなり[^VR-in-HDRP]、`Project Settings > Player` を覗いてみたら、
![built-in xr is deprecated](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/36435619-38ce-da1b-ddc4-98bb84bc7a5f.png)
と書かれていた。（「いままでのXRプラグインは非推奨。新しいのを試してね！」）

[^VR-in-HDRP]: 最近 HDRP が正式に VR 対応した。cf.「[レンダーパイプラインでフォトリアリスティックな没入型 VR 体験を作成する - Unity Technologies Blog](https://blogs.unity3d.com/jp/2020/03/12/creating-immersive-photorealistic-vr-experiences-with-the-high-definition-render-pipeline/)」

そういえば、「[Unity XR プラットフォームの最新情報 - Unity Technologies Blog](https://blogs.unity3d.com/jp/2020/01/24/unity-xr-platform-updates/)」で XR Plug-in などというのが入ってくると言ってたなあと思い出し、「[Configuring your Unity Project for XR - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/configuring-project-for-xr.html)」の指示に従って、テキトウに Oculus 対応することにした。

1. `Edit > Project Settings > XR Plug-in Management` で `XR Plug-in Management` をインストール（自分の環境ではいつの間にか入っていた。）
1. `XR Rig` を配置し、`MainCamera` を変更。（詳細は「[Configuring your Unity Project for XR - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/configuring-project-for-xr.html)」参照）
1. Oculus を選択→インストールされる
1. **問題発生**: oculusなんちゃらのインポートが終わらない（というか、ループしてた。）& 重くて動かない → 詰む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/303bb2a5-69bd-8b25-ad9f-bcf3b6f1867a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/3cbb84c1-f2ce-9d17-f3b9-7c15b7d7db37.png)

~~ループ中のスクショは忘れた。~~ 色々いじってたらまた出てきたのでスクショ。~~「~.oculus.xr.~」~~みたいな名前のもの（`com.unity.xr.oculus.standalone` でした。あとopenvrなんとかも出てた。）をインポートしようとしてるらしいダイアログが定期的に表示されるも何もできないので、エディタごと `Kill` した。

とりあえず、Unity Editor のマイナーアップデートが降ってきていたので、エディタを最新版にして再起動。
しかし、再度ループにハマる。

冷静に考えてみたら、ダイアログに `Cancel` ボタンがあったのでクリック。
無事ループから脱出。
`XR Plug-in Management`を見ると、`Oculus` のチェックボックスが入ってなかったので、これもクリック。前にやったときはきちんとチェックが入らなかったのが、今回は一発でマークが付いた。

これで、Play モードに入り直したらちゃんと見れた。
ただ、HDRP + VRなので、どうしても描画が重い。

というか前のプラグインでやったときのほうが動作軽いぞ？？？
これから改善されることを祈る。

# まとめ（仮）

- とりあえずエディタをアップデート
- とりあえず**ダイアログをキャンセル**
- とりあえずプラグインを再設定
- なんか動くようになった

~~以上！~~ しかし、これでは終わらなかった。

# 追記①（XR周りのプラグインを全削除）

なんと再発したので、ここから追記していく。

コンソールには
> Package Metadata store error. Check if there are any other errors in the console and make sure they are corrected before trying again.
 Failure reason: Timeout trying to get package list after 30s.
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()

と出ていた。
メタデータの修正ってことはプラグインをRemoveしてまたinstallすれば良いってことだろうか？

現状でも、エディタを `Kill` か、ダイアログを `Cancel` すれば、ループから出ることはできる。
ただ、再発防止にはならないので、試しに色々やってみる。

ちなみに、こんな話もあったけど保留。
[XR Plugin Management infinite import loop - Unity Answers](https://answers.unity.com/questions/1700900/xr-plugin-management-infinite-import-loop.html)
> Had this problem too. First I stopped it from looping by editing a .cs file and introducing a compiler error. Just delete a semi colon somewhere.
> Then go to the Steam_VR_Settings asset and uncheck the "Auto Enable VR" box. For me this was in "Assets/SteamVR_Resources/Resources/SteamVR_Settings.asset".
> Now you can fix your c# again.

まず、なんとなく `Package Manager` で `XR Plugin Management`を Remove したら怒られた。
> Could not install or assign any package with id . Check if there are any other errors in the console and make sure they are corrected before trying again.
 Failure reason: Error installing package . Error Code: Failure Error Message: 
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()

よく分らんがとりあえず、`Project Settings > XR Plug-in Management` の `Oculus` を uncheck しておく。

XR Plugin Management を再インストール。

再度ループ　→ ダイアログを`Cancel` ×2で脱出

途中で止めたので、前のバージョンのままになっている：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/7aa5fc33-bacb-37af-f8cc-79a688ff0685.png)

Remove 押したら忠告が出た。そういうのは最初から出してほしかった：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/1ff112c5-c018-31b4-0208-bfdcef035294.png)

そして Remove。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/c1cf9f7b-3fe6-32b4-1a55-f0eb572ac788.png)

今回はループに入らず、そのまま終了。ただし、コンソール曰く
> Error converting build target group names .
Must specify valid information for parsing in the string.
UnityEngine.SubsystemManager:Internal_ReloadSubsystemsCompleted()

無視。

Assets フォルダを見たら、Steam VR Pluginも入ってたので、アンインストールしようとするも、`Package Manager > inProject`　に出てこない。`Package Manager > My Assets`でインストールし直してみるも、やはり検索結果に出てこないので、Removeできず。

[unity3d - How to remove SteamVR from Project - Stack Overflow](https://stackoverflow.com/questions/39882994/how-to-remove-steamvr-from-project)曰く `Project Settings > Player` の `Virtual Reality Supported` を外せとのことなので実行。（`XR Plugin Managemnet` がインストールされたままだとグレーアウトして外せないので注意）

実行したはいいが、何度やっても uncheck できないので一旦保留。
なんとなく `Package Manager` で `OpenVR Desktop` を検索したらこちらも Deprecated（非推奨）と出たので Remove。しかしこっちも Remove されないので一旦保留。

やはり SteamVR Plugin を消せないのが気持ち悪いので、`Ctrl + S` してから Unity Editor を終了し（`Kill` ではない）、`SteamVR` フォルダと `SteamVR_Resources` フォルダを削除（念のため別フォルダに退避）。再度プロジェクトを開く。

ダメモトで `Package Manager` から `OpenVR Desktop`を検索& Remove → 成功。（なぜ）

とりあえず、これで初期状態に戻せたっぽいので、XR Plugin Managementを入れ直す。

# 追記②（XR Plugin を入れ直す）

環境を整理したところで、XR Plugin Management を入れ直すと、次のエラーが出た：
> Package Metadata store error. Check if there are any other errors in the console and make sure they are corrected before trying again.
 Failure reason: Timeout trying to get package list after 30s.
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()

最初に見たエラーは、`XR Plugin Management` のインストールが原因だったのか…
問題の切り分けに時間がかかってしまった。

エラーコードで検索をかけてみる：
[Bug - Package Metadata store error.Check if there are any other errors in the console and make sure they a - Unity Forum](https://forum.unity.com/threads/package-metadata-store-error-check-if-there-are-any-other-errors-in-the-console-and-make-sure-they-a.918368/)
…昨日付けでバグとして共有されてるとか、タイムリー過ぎでは。

```csharp
private static float k_TimeOutDelta = 30f; // -> 300f
```
という修正方法は、こっちの環境でも解決策にはならなかった。

頼みの綱は、公式ドキュメント：[トラブルシューティング - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/upm-errors.html)…

いや、ちょっと待て、と思い `Ctrl + P`（再生）してみると、
ちゃんと動くし、ループにはハマらない、ということに気付いた。

それならと、コンソールウィンドウの `Clear on Play` を有効にして　`Ctrl + P` する…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/ad651768-e268-557b-38b2-e9b0ab5f8779.png)

エラーが出ていない…。
`OpenVR Desktop` はわざと取っ払ったものだし、もうひとつはただのコメントだ。

なるほど、古いプラグインが Unity 2020 から廃止になるとは聞いていたが、同時に使用するのも駄目だったらしい。

# TL;DR

- **import のループにハマったら、ダイアログの`Cancel`ボタンを何度かクリックすれば、ループから抜けられる。**
- **新しい `XR Plugin` は既存のプラグインと相性が悪い（かも [^Compatibility]）。**
- **`OpenVR Desktop`, `Steam VR Plugin`, `Oculus Integration`などをすべてアンインストールしてから `XR Plugin` を入れると安全。**
- **そもそも、新しい `XR Plugin` は、外部プラグインを基本的に必要としなかった気がする。（SteamVR もそのうち対応するはず [^OpenVR-XR-Plugin]）**
- **コンソールに何か表示されるが、`Clear on Play` を有効にすれば、再生モードをオン/オフすることで、エラーが今も続いているのかが分かる。**
- **`TimeOut` はそこまで気にしなくて良いのかもしれない**

[^Compatibility]: 未検証だけどバージョンのせいかもしれない。cf. 「[Unity VR 「Oculus Integration」をインポートすると「Unable to start Oculus XR Plugin.」エラーが出る場合の対処法 - Qiita](https://qiita.com/necotarou/items/f913d258767595fb4656)」

[^OpenVR-XR-Plugin]:  cf.「[【Unity】そろそろXR Managementに対応したOpenVR XR Pluginがリリースされそう - Qiita](https://qiita.com/shiena/items/87cbdfb8c8ba7834e088)」