Meta Quest3でスタンドアロン開発をしている時、自分の動きを確認したくて簡易的にカメラに自分を映そうと思ったところ、真っ暗のまま描画されない。
環境
- Unity 2022.3.23
- Universal RP 14.0.10
- Meta Quest3 (Androidビルド)
エラーの内容
ヘッドセットのカメラとは別に、シーンにCameraを設置し、OutputTextureに鏡用のRenderTextureを設定。ビルドして確認しても、真っ暗なまま映らなかった。
エラーメッセージを見てみると、以下のようなエラーが。
Exception: ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.Collections.Generic.List1[T].get_Item (System.Int32 index) (at <00000000000000000000000000000000>:0)
UnityEngine.Experimental.Rendering.XRPass.GetViewport (System.Int32 viewIndex) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.Internal.DrawObjectsPass.ExecutePass (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.Internal.DrawObjectsPass+PassData data, UnityEngine.Rendering.Universal.RenderingData& renderingData, System.Boolean yFlip) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.ScriptableRenderer.ExecuteRenderPass (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.ScriptableRenderPass renderPass, UnityEngine.Rendering.Universal.RenderingData& renderingData) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.ScriptableRenderer.ExecuteBlock (System.Int32 blockIndex, UnityEngine.Rendering.Universal.ScriptableRenderer+RenderBlocks& renderBlocks, UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.RenderingData& renderingData, System.Boolean submit) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.ScriptableRenderer.Execute (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.RenderingData& renderingData) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderSingleCamera (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Rendering.Universal.CameraData& cameraData) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.RenderCameraStack (UnityEngine.Rendering.ScriptableRenderContext context, UnityEngine.Camera baseCamera) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.Universal.UniversalRenderPipeline.Render (UnityEngine.Rendering.ScriptableRenderContext renderContext, System.Collections.Generic.List1[T] cameras) (at <00000000000000000000000000000000>:0)
UnityEngine.Rendering.RenderPipelineManager.DoRenderLoop_Internal (UnityEngine.Rendering.RenderPipelineAsset pipe, System.IntPtr loopPtr, UnityEngine.Object renderRequest) (at <00000000000000000000000000000000>:0)
Warning: Render Pipeline error : the XR layout still contains active passes. Executing XRSystem.EndLayout() right now.
UnityEngine.Rendering.RenderPipelineManager:DoRenderLoop_Internal(RenderPipelineAsset, IntPtr, Object)
対処方法(ワークアラウンド)
何のエラーかよく分からなかったので、ググってみると以下のような記事が。
https://discussions.unity.com/t/xrpass-getviewport-exceptions-in-editor/944254/15
記事によると、universal-render-pipelineのパッケージ内の、ifチェックを追加することで解決するとのこと。
-
Library/PackageCache
内のcom.unity.render-pipelines.universal@...
フォルダを一時的にPackages
などの他のフォルダに移動。これを行わないと、パッケージのスクリプトの変更ができない。 -
同フォルダ内の
Runtime/Passes/DrawObjectPass.cs
184〜187行目にあるコードを、以下のように修正。if (data.m_RenderingData.cameraData.xrRendering && data.m_RenderingData.cameraData.xr.enabled && data.m_IsActiveTargetBackBuffer) { cmd.SetViewport(data.m_RenderingData.cameraData.xr.GetViewport()); }
-
編集したフォルダを元の/Library/PackageCacheに戻す
再度ビルドして実行したら、エラーも出なくなり、カメラの描画もできるようになった。
追記
元々正常に動作していたものの、ある時急に上記のエラーが起きるようになったため、原因の調査に時間がかかった。