この事件は 2021年9月7日に発生し、 (2022-10-23追記:シーン遷移がなくとも、プレイモードの再生・停止により生じることを確認しました。ほぼ毎回症状が出ていますが、 |
この事件は 2023-03-18 現在、解決策が見つかっています。
追記 2023-03-18 を参照してください。
状況説明
MissingReferenceException: The object of type 'OVRCameraRig' has been destroyed but you are still trying to access it.
以下の状況で、コンソールに上記エラーが大量に発生する。送出元は不明。
- プレイモード中にスクリプトからシーン遷移を行った場合
- 特に何もせず、起動直後にエディタ上で別のシーンファイル(同じ設定の XR Rig を含む)を選択・展開し、再生した場合
なお、起動直後の状態では再生してもエラーが出ないほか、エラーが出ていても、OVRCameraRig および XR Controller 等、関連オブジェクト・コンポーネントは不足なくシーン上に存在している。また関連性は不明だが、事象発生後、Ray Interactor のレイが実機上で不可視になる。
筆者は XR Interaction Toolkit をオーバーライドして使用していたため、当初はそれが原因かと思われた。しかし、Oculus Integration 付属の OVRCameraRig.prefab を空シーンに置いた場合にも同様の操作で問題が発生することが事件発生の翌日に確認され、別の問題が主要因であると断定された。
また Oculus Integaration も直近3つのバージョンを確認したが、いずれも同様の問題が起きた。
検証時に確認したパッケージ等
当初のパッケージ等:
- Unity 2019.4.22f1, 2020.3.0f1, 2020.3.16f1
- Oculus Integration v29, v31, v32
- XR Interaction Toolkit 1.0.0-pre.5
- XR Legacy Input Helpers 2.1.7, 2.1.8
- XR Plugin Management 4.0.7, 4.1.0
解決法を見つけた際のパッケージ等:
- Unity 2021.3.19f1
- Oculus Integration v49
- XR Interaction Toolkit 2.2.0
- XR Legacy Input Helpers 2.1.10
- XR Plugin Management 4.2.1
検証内容
複数のバージョンの Unity エディタで、設定項目やパッケージのバージョンの違いによる影響を確認。
解決方法
Verified ではないが、XR Plugin Management 4.1.0 を使用する。
不明。一時的な対処法として、XR Plugin Management をその時点で使用しているものとは異なるバージョンにすることが挙げられる。(再起動後、問題が再発することが判明。)
所感
いままで何故この問題が起きなかったのか、本当の問題はどこにあったのかは、未だ謎に包まれている。
追記 2023-03-18
作業効率は落ちますが、Project Settings > Editor > Enter Play Mode Options
をオフにしたり、下記のようなショートカットキーを設定し、再生直前に強制的にリロードさせることで回避できるようです。(標準の Assets > Refresh
: 既定ショートカットキー Ctrl + R
だと、スクリプトに変更がない場合はコンパイルが走らない:シリアライズされた変数の初期化が走らないので、前回実行時の参照が残ってしまうようです。再生前に毎回リロードしたい場合は、Enter Play Mode Options で Reload Domain をオンにするのが手っ取り早いですが、自分の場合は必要に応じてリロードしたいので、ショートカットキーを作りました。)
こうするか、
こうする。
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Compilation;
#endif
// クラス名は任意
public static class X
{
#if UNITY_EDITOR
[MenuItem(nameof(X) + "/" + nameof(ForceCompile) + " %R")]
static void ForceCompile()
{
CompilationPipeline.RequestScriptCompilation();
}
#endif
}
// このスクリプトを Editor フォルダに入れる場合、if ディレクティブは不要