【VRChat】自信満々でギミックを公開したらバグがあったという話
天啓
みなさんこんにちは、VRChat楽しんでますか?今は夏のVketとかもあって凄い楽しい時期ですよね。一方で私は…
ある休日、唐突に「この前作ったギミックを使えばもっと前に作った古いギミックのクオリティを上げられるんじゃね!」という天啓があったので、以前に作ったVR睡眠愛好家の方向けのどこでもナイトモードを使えるギミックを改良しようとしていました。
→この前作ったギミックである「HUD_Minimap_Gimmick」通称HMG
プレイヤーの視界にミニマップを表示できます。
→今回、古いやつを新しく作り直した「EasyNightmodeGimmick」通称ENG
プレイヤーの視界を直接暗くすることができます。
ギミックの仕組み自体は凄い単純でしたし、以前作ったやつの応用だったので結構楽にギミックを作ることができました。そして、DesktopでもPCVRでも動作確認をして特に大きなバグもなかったので、ぱぱっと配布用のUnitypackageを用意したり、説明文や解説動画を作成したりして、ついにBooth経由でこの世界に解き放ちました。天啓を得てから数時間の出来事でした。
仕組み
UnityのカメラコンポーネントにはDepthという項目があります。Depthは複数のカメラを使用するときに使うことになります。カメラの映像はDepthの低い順から描写されていくので、画面の手前に来てほしいオブジェクト、例えばUIとかはDepth値を高くしたりします。残りの詳しい説明は自分の理解が怪しいので皆さんで調べてみてください。
そして、上で紹介した2つのギミックはこのDepthを作って作成しています。仕組みとしては、まずプレイヤーから少し離れた場所にPlayerLocal(つまり自分自身)しか映さないDepthOnlyのカメラを配置します。このカメラのDepth値はVRChatのメインカメラ(多分0?)よりも高い値である1以上にする必要があります。
その後、そのカメラの先に表示したいオブジェクトを配置します。HMGだったらミニマップを、ENGだったら視界を暗くするためのオブジェクトを配置するわけですね。こうすることでVRChatのメインカメラの画面にDepthOnlyのカメラで撮影された画面が上書きで表示されるようになります。
私がHMGを作った時、VRChat内のカメラ系のワールドギミックなどと競合してほしくなかったこともあり、Depth値は最大の100に設定していました。この設定は実際に効果があり、カメラのDepth値が100に設定されている一部の三人称ギミック以外の三人称ギミックなら、三人称の状態でもミニマップを表示することができたりしました。
そして、HMGを流用して作成したENGも同様にDepth値は100に設定していました。
この雑な設定が後の崩壊に繋がっていくとは、この時の私は知る由もありませんでした。
崩壊
さて、VRchatにはPCVRのプレイヤーだけが使えるストリームカメラというものがあります。配信者の方とかがよく使ったりする機能で、プレイヤーの見ている画面とは違うカメラ経由の画面を出力することができます。これで三人称視点で自分を映せたりするわけですね。
このカメラの詳しい仕組みを私は知りませんが、なんか凄い特殊なことをしてそうです。そして、このストリームカメラが今回の崩壊を引き起こしました。
画像を用意できてないので、わかりづらいとは思いますが文章で説明します。現象としては、ストリームカメラを使用している時にHMGやENGのギミックを有効化すると、視界がとてつもない荒ぶり方をするのです。視界は上下反転するわ、視界が1/4ぐらいになるわでまともな操作をすることができません。VR耐性があっても吐きそうなので耐性が無かったら多分吐いてます。
見えない状態でActionMenuを操作し、ギミックの無効化できればいいのですが、それができなければ完全に操作不能です。おとなしくセーフモードを起動するか、ブラウザ経由でアバターを無理やり変更するぐらいしか対策がありません。非常に深刻なバグです。
検証していてわかったのが、ストリームカメラを使用している時にギミックを有効化するとこの現象が発生します。反対に、ギミックを有効化したあとにストリームカメラを使用すると正常に動作します。しかし、もう一度ギミックの無効化有効化を行うと、やはりこの現象が発生するのです。これはストリームカメラとDepthOnlyカメラの競合が原因である予感がしますね。
その後
まあ大体予想通りで、DepthOnlyカメラのDepth値を変更してあげれば正常に動作するようになりました。恐らくストリームカメラのDepth値が最大の100だったのかもしれません。まあストリームカメラの映像が他のカメラに上書きされたら大変なのでそう設定するのが正解な気がします…
対策としては、HMGは他のギミックとの競合を対策したいこともあり、できるだけ高いDepth値にしたかったのでギリギリの99に設定しました。ENGはそこまで高いDepth値にする意味がなかったので1に設定しました。これで両方のギミックが正常に動作するようになったので良かったです。
このバグを発見したのはENGを公開してすぐの時だったのですが、それってHMGを公開してから1週間半ぐらい経ったタイミングだったんですよね…私のギミックを使用してくださっている方でこのバグの被害を受けた方が居ないことを祈っています…
皆さんもカメラやDepthを使ったギミックを作るときは気をつけましょうね!デバッグもちゃんとやりましょう!というお話でした。
おまけ
この記事が気に入ったらサポートをしてみませんか?