🎥

【Unity】VRHMDとPCディスプレイに別のカメラ映像を出力する

2023/11/09に公開

はじめに

こんにちは、まつさこ です。

この記事では、UnityでVRHMDとPCディスプレイに別のカメラ映像を出力する方法について説明します。Steamなどにリリースする前提の、ハイエンドPC向けVRコンテンツの開発に活用できると思います。

開発環境

筆者の開発環境は以下です。

  • Unity 2022.3.10f1
  • Rider 2023.2.3

また、本記事では XR Interaction Toolkit が導入済みの、OpenXR 環境が動作する前提で実装を紹介します。
UnityHubから導入できる、公式のテンプレートプロジェクトを使用します。

  • Target Platform は Windows
  • デバッグには MetaQuest2 による QuestLink を使用

Unity における XR Interaction Toolkit を活用した実装は、こりんさんの以下のブログが大変参考になります。

Unity VR開発メモ(XR Interaction Toolkit)

カメラの設置

プレイヤー視点のカメラ(通常は XR Origin 等の CenterEyeCamera)とは別のカメラを新しく作成してください。三人称視点カメラなので、 ThirdViewCamera という名前のオブジェクトにしました。

Camera コンポーネントについて以下の設定をします。

  • コンポーネントのチェックを外し、初期状態で enabled = false にする。
  • Output > Target Eye を None にする。

スクリプトの作成

次のような MultiCameraDisplay.cs を作成します。

using UnityEngine;
using UnityEngine.XR;

public class MultiCameraDisplay : MonoBehaviour
{
    Camera _thirdViewCamera;
    
    void Start()
    {
        //カメラコンポーネントを取得
        _thirdViewCamera = GetComponent<Camera>();
        //PCディスプレイ表示を三人称視点カメラに切り替え
        OnThirdView();
    }
    
    //PCディスプレイにプレイヤー目線を表示
    void OnPlayerView()
    {
        _thirdViewCamera.enabled = false;
        XRSettings.gameViewRenderMode = GameViewRenderMode.LeftEye;
    }
    
    //PCディスプレイにThirdViewCamera映像を表示
    void OnThirdView()
    {
        _thirdViewCamera.enabled = true;
        XRSettings.gameViewRenderMode = GameViewRenderMode.None;
    }
}

各関数でやっていることは、コメントアウトに記載の通りです。

  • カメラコンポーネントの enable を切り替えること
  • XRSettings.gameViewRenderMode を変更すること

が肝です。

今回のサンプルスクリプトは OnThirdView() をゲーム起動時に呼んでいるだけですが、任意のタイミングで OnPlayerView() 関数を呼ぶことで、PCディスプレイの表示をプレイヤーの一人称(VRHMDで見えている映像)に戻すことが出来ます。

以下のように、VRHMD側とPC側で異なる映像を出すことが出来ました。

■ VRHMD側

■ PC側

まとめ

この記事では、UnityでVRとPCディスプレイに別のカメラ映像を出力する方法を説明しました。
HMDとPCで別の映像を出すことを活かした、新しい体験が作れるかもしれませんね!

読んでくださりありがとうございました🤗

Discussion