はじめてのVR開発

確認済のバージョン: 5.3

-

難易度: 初級

基本の設定

Unity における VR 開発の基礎を学ぶに当たっては、まずは、ハードウェアとソフトウェアが 前章の説明通りに設定されていることを確認してください。

Unity のインストールと正しい設定が完了したら、Unity を起動する前に、DK2 の電源が入っていて接続されていることを確認してください。また、先に進む前に Oculus Configuration Utility(Oculus 設定ユーティリティ)内の Demo Scene(デモシーン)が正常に機能していることを確認してください。Demo Scene を実行するためには、 Oculus Configuration Utility で新規ユーザーのセットアップが必要になるかもしれません。

初めての VR プロジェクトを作成する

まずは、VR で見ることのできるキューブ(立方体)を 1 つ含む、VR のテストプロジェクトを Unity で作成してみましょう。もし、最初から複雑な VR コンテンツのサンプルを使いたい場合は、VR Overview で説明されている VR Samples プロジェクトをダウンロードしてください。

1. Unity の初回起動時に表示される Unity Home Screen で、新規の空のプロジェクトを作成してください。

2. トップメニューから File > Build Settings と進み、プラットフォームに PC, Mac & Linux Standalone を選択してください。

Build Settings(ビルド設定)

3. キューブ(立方体)を 1 つ新規作成し(Game Object > 3D Object > Cube)、Translate ツールを使用して、デフォルトの Main Camera の前にそのキューブを配置してください。

基本的なキューブ

4. シーンを保存してください(File > Save Scene)。

5. メニューを Edit > Project Settings > Player と進み、"Virtual Reality Supported" のチェックボックスにチェックマークを入れて有効にしてください。

VR を有効化する

6. インターフェース上部の「Play」を押して、Play モードを開始してください。

これで DK2 から、(1 つのカメラが Game ビューを映している状態で)シーンを見ることができるようになりました。シーン内を見渡してみてください。DK2 の位置と角度が変わると Unity のカメラにそれが反映されます。

トラブルシューティング DK2 からシーンを見ることができない場合は、以下をご確認ください。

  • 事前に DK2 が接続されていて電源が入っている状態であることを確認してから、Unity プロジェクトを開いてください。

  • Oculus Configuration Utility で Demo Scene が表示されることを確認してください。

  • Graphics Card ドライバーの更新を行ってください。

  • Oculus Runtime 0.8 あるいはそれ以降のバージョンがインストールされていることを確認してください。

VR に関してさらなるヘルプが必要な場合は、Unity VR フォーラム をご参照ください。

VR 開発に関するヒント

VR 開発は通常の Unity 開発と非常に類似していますが、いくつかの相違点を理解しておく必要があります。

エディター上のフレームレート

エディターでプロジェクトを表示する際に、遅延や揺れが起こる場合があります。これは、コンピューターが同じコンテンツを 2 回レンダリングしているためです。Unity エディター上でのレンダリングもオーバーヘッドを発生させるので、随時プロジェクトのビルドを作成し、ターゲットデバイスで直接実行してパフォーマンスのチェックを行うことをお勧めします。

カメラの動き

Unity 上で直接 VR カメラを動かすことはできません。位置や角度を変更したい場合は、別のゲームオブジェクトがその親になっていることを確認し、親の Transform に変更を加える必要があります。

Camera Container

参考例をご覧になりたい場合は、VR Samples プロジェクトの Flyer や Maze シーン をご確認ください。シーン内でカメラを動かしている例をご覧いただけます。

カメラノード

両眼視差カメラは Unity によって作成されるものではありません。これらのノードの位置を取得したい場合は、InputTracking クラスを使用する必要があります。

シーン内の眼のそれぞれの位置を取得したい場合([例]テストを行う場合など)は、下記のサンプルスクリプトを使用し、カメラに追加してください。

Code snippet

using UnityEngine;
using UnityEngine.VR;

public class UpdateEyeAnchors : MonoBehaviour
{
    GameObject[] eyes = new GameObject[2];
    string[] eyeAnchorNames = { "LeftEyeAnchor", "RightEyeAnchor" };  
  
    void Update()
    {
        for (int i = 0; i < 2; ++i)
        {
            // If the eye anchor is no longer a child of us, don't use it
            if (eyes[i] != null && eyes[i].transform.parent != transform)
            {
                eyes[i] = null;
            }

            // If we don't have an eye anchor, try to find one or create one
            if (eyes[i] == null)
            {
                Transform t = transform.Find(eyeAnchorNames[i]);
                if (t)
                    eyes[i] = t.gameObject;

                if (eyes[i] == null)
                {
                    eyes[i] = new GameObject(eyeAnchorNames[i]);
                    eyes[i].transform.parent = gameObject.transform;
                }
            }

            // Update the eye transform
            eyes[i].transform.localPosition = InputTracking.GetLocalPosition((VRNode)i);
            eyes[i].transform.localRotation = InputTracking.GetLocalRotation((VRNode)i);
        }
    }
}

VR でのイメージエフェクトの使用

イメージエフェクトの多くは、VR プロジェクトで使用するには負荷が掛かり過ぎます。シーンのレンダリングを両方の眼に関して 1 回ずつ行うため、ほとんどのイメージエフェクトは(それ自体で既にパフォーマンス負荷が高い)、フレームレートへの影響を考慮すると、一切使用できない場合も多くなります。

VR は仮想空間の中におけるユーザーの目に相当します。そのため、中には VR ではつじつまの合わないイメージエフェクトもあります。例えば被写界深度やブラー、レンズフレアなどは現実世界で見えるものではないため、VR でもつじつまが合いません。VR HMD が将来的にアイ・トラッキングに対応するようになれば、被写界深度はつじつまの合う形で使用できる可能性はあります。

一部のエフェクトは使用可能です。アンチエイリアス処理は(低解像度 HMD デバイスでは特に)役立つ可能性があります。カラーグレーディングは間違いなく使用できます(詳細はこちらの Unity ブログをご覧ください)。ブルームもゲームによっては使用できるでしょう。開発中のゲームに適用できるかどうか実際に各種エフェクトを試してみてください。

Unity には基本的なイメージエフェクトが一式搭載されています(Assets > Import Package > Effects)が、アセットストアにも ColorfulChromaticaAmplify Colorその他数多く の素晴らしいイメージエフェクトがあります。

レンダースケール

VR シーンの複雑さ加減やハードウェアに応じて、レンダースケールの変更が必要になることもあります。これは、レンズ補正前のテクセルとピクセルの比率を制御するもので、つまりシャープネスと引き換えにパフォーマンスを向上させることができます。

これはコードから設定する必要があり、VRSettings.renderScale でアクセス可能です。また、下記のスクリプトを使用すれば簡単に変更を加えることができます。

Code snippet

using UnityEngine;
using System.Collections;
using UnityEngine.VR;

namespace VRStandardAssets.Examples
{ 
    public class ExampleRenderScale : MonoBehaviour
    {
        [SerializeField] private float m_RenderScale = 1f;              //The render scale. Higher numbers = better quality, but trades performance

        void Start ()
        {
            VRSettings.renderScale = m_RenderScale;
        }
    }
}

この簡単な例が VR Samples の中にあります。 Scenes/Examples/RenderScale のシーンや MainMenu のシーン内で使用されています。

レンダースケールの変更例 Unity のレンダースケールの初期値は 1.0 です。

レンダースケール 1x

これを 1.5 に上げると、アセットの見た目がかなりくっきりします。

レンダースケール 1.5x

レンダースケールを 0.5 に下げると、画質がかなり荒くなることが分かります。

レンダースケール 0.5x

シーンがどの程度スムーズに実行されているかによって、レンダースケールを低くしてパフォーマンスを向上させたり、逆に高くしてビジュアルをよりシャープにしたりすることができます。

以上、この記事では Unity で VR を使用するにあたっての基本的な事柄や、カメラの動かし方、また非 VR プロジェクトの場合と比較したイメージエフェクトの使用方法の違いを学びました。次章 『VR におけるインタラクション』 では、VR 内でオブジェクトとインタラクションする方法を学びます。