最近、技術トピックは社内のWiki(システムはesa)にばかり書いていてブログをサボり気味だったので反省。
それにしてもコロナウイルスが猛威を振るっていますね。オリンピック延期が決まって(正直1年後でも怪しい気がするんだけど)、今週末は東京都から外出自粛要請が出て、今頃はスーパーが買い貯めの人で溢れていることでしょう。
で、昨日ハマった、SteamVR Plugin2.5.0 と MRTK 2.3の共存についてのメモです。
MRTK2.3自体がOpenVRに対応しているので、SteamVR PluginとMRTKを同時に使うことはあまりないと思うのですが、既存のSteamVRプロジェクトをHoloLens対応させるために、SteamVR Pluginの後にMRTK2.3をインストールしました。
すると、コンパイルエラーの嵐で、内容は「SteamVR名前空間のクラスが無いよ」という致命的なものでした。
Gitのログから変更履歴を辿ると、MRTKインストール時に、「Assets/SteamVR/Plugins/openvr_api.cs」がUpdateされていて、それが原因ということがわかってきました。しかし、MRTKは「MixedRealityToolkit」で始まるフォルダにしかインストールされないハズ。どうしてSteamVRフォルダの内容が上書きされたのか不明でした。
悩んだ過程がこちらのTweet↓
MRTK以外のディレクトリにファイルが入ることなんてある!?と思ったらちゃんとパッケージにSteamVRがあった。 pic.twitter.com/OyrBzfAUNv
— とりカシュ (@torikasyu) March 25, 2020
UnityPackageを7zipで解凍してgrepかけてみたけど、SteamVR/Pluginに置くファイルなんて無いぞ。
$ find ./ -type f | xargs grep openvr_api.cs
だと引っ掛かるけどProvidersの下— とりカシュ (@torikasyu) March 25, 2020
やっぱり同じだった pic.twitter.com/JAmCfLmZ0t
— とりカシュ (@torikasyu) March 25, 2020
UnityPackageを7zipで解凍して、中身のテキストファイルをgrepしてもStreamVRフォルダに配置されるファイルはありませんでした。
大量のテキストファイルをgrepするには、Git Bash等で下記を使うと便利です。
$ find ./ -type f | xargs grep openvr_api.cs
そして気が付いたのがGUIDの件。UnityPackageは、パスやファイル名が異なっていても、同じGUIDを持つオブジェクトは上書きする、という特性があることを知りました。
今回は、MRTKに入っているopenvr_api.csが、SteamVRのopenvr_api.csと同じGUIDを持っていたため、上書きされてしまったのがエラーの原因でした。
これを解消するためには、MRTKインストール前に、SteamVR/Plugins/openvr_api.cs のファイルを複製して、元の方を削除します。これでGUIDを強制的に変更できるので、MRTKインストール時に上書きされなくなります。
MRTKのGuitHubでバグ報告をしたところ、秒速で修正されて、MRTK2.4リリース時には直るそうです。(早い!)
UnityPackageの性質について勉強できたエラーでした。