前回は、UnityでViveのサンプルプロジェクトを動かしましたが、今回からはオリジナルのシーンからVive向けVRコンテンツを作る手順を説明します。

まずは、今回と次回で「VRコントローラから発するレーザーポインターで箱オブジェクトを選択して動かせる」コンテンツを制作してみましょう。

新規プロジェクトにSteam VRを導入する

最初に、Unityを開き、「Blocks」という名前で新規シーンを作成します(次画面参照)。

メニューから「Window」→「Asset Store」を開き、その中にある「Steam VR Plugin」を探して「Import」ボタンを押します(次画面(1))。

アセットにはいろいろなコンテンツが含まれているので取り込むものを選択するためのウィンドウが開きますが、全てが選択されている状態で、「Import」ボタンを押します(前画面(2))。

Steam VRを使用するために設定を変更する確認画面が表示されますので「Accept All」ボタンを押します(前画面(3))。

確認ダイアログが出ますので、これも「OK」を押すとSteam VRの導入設定は完了します(前画面(4))。

新規シーンを作成しVR対応にする

次は新規シーンを作成します。

Unityでは一つのプロジェクトで複数のシーンを持たせることができ、切り替えるような仕組みもあります。今回は一つのシーンのみを使いますが、最初はシーンが用意されていないので、新規作成する必要があります。

「Project」タブの「Assets」フォルダを選んでいる状態で、「Project」タブの下にある小さい「Create ▼」ボタンを押します。「Scene」が入っており、それを選ぶと新規シーンが作成されます(前画面(5))。「New Scene」と表示されますが「Blocks」に名前を変えておきます(前画面(6))。その小さいアイコンをダブルクリックするとシーンが開きます。

「Project」タブの「Assets/ SteamVR/Prefabs/[Camera Rig]」を「Hierarchy」タブ内にドラッグします(前画面(7))。

この中にはVR用のカメラが含まれているのですが、デフォルトでもカメラが取り込まれており重複するので、「Hierarchy」タブ内にあった「Main Camera」を選んで削除します。

たったこれだけでVR対応の準備は完了です。

Viveをつないだ状態で、最上部にあるUnityのプレイボタン(前画面(8))を押すと、実際に動きます。何もない空間なので分かりにくいですが、VRコントローラが用意されていればそれも表示されます。よく見るとトリガーなどを動かすたびにVR内のモデルも動いているのがわかると思います。

床と大きい箱を作る

次は床や箱を作ります。

「Hierarchy」タブの「Create ▼」ボタンを押し、「3D Object」→「Cube」を選択します(次画面(9))。作成されたオブジェクトは「Inspector」タブで大きさや名前を変更できるのでここで設定します(次画面(10))。

床のオブジェクトは「Floor」と名前をつけ、「Transform」項目で「Position」に「 (0, -0.05, 0)」、「Scale」に「 (3, 0.1, 3)」と設定します。これで、1辺3m、厚さ10cmの床ができます。

同様にもう一つ「Cube」を作ります。

「Cube」は「Transform」項目で「Position」に「 (0, 1, 1)」、「Scale」に「 (0.5, 0.5, 0.5)」と設定します(次画面(11))。

レーザーポインターを表示する

続いて、空間のオブジェクトを選択できるようにするためにコントローラの先からレーザーが発射されるように設定しましょう。Steam VRプラグインにも「Assets/SteamVR/Extras/SteamVR_LaserPointer」として同様のものがあるのですが、今後の機能追加を考え、自作してきます。

右手に持つコントローラをポインタとするので「[Camera Rig]/Controller (right)」を選び、「Inspector」タブで、下部にある「Add Component」ボタンを押します。出てきたリストから「Effects/Line Renderer」を選びます(前画面(12))。

次のようにLine Rendererのパラメータを設定します(次画面(13))。

  • 「Positions/Element 1」を「(0, 0, 1)」にします。
  • 「Parameters/Start Width」と「Parameters/End Width」を「0.01」にします。
  • 「Use World Space」のチェックを外します。

これで上図のようにコントローラの先端から10mの直線が表示されるようになります。

このレーザーでオブジェクトを選択して、コントローラのトリガーでつかむ処理を実装していくのですが、複雑ですので今回はトリガーを引っ張った時の処理をスクリプトで処理するための準備のところまで実装しておきます。

UnityではC#とJavaScript等が使えますが、本連載ではユーザー数が多いC#を使っていきます。C#は、他のプログラム言語を学んだことがある方なら分かりやすい言語です。プログラムを書いたことがない方は、本連載ではそれほど長いコードはないので、これらをいじりながら試してください。プログラムを少しずつ理解できると思います。まずは、そのまま動くことを目指して手を動かしてみましょう。

トリガークリックイベントを処理するスクリプト

スクリプトを有効にするためには、「Project」タブで、「Assets」以下に「Scripts」フォルダを作ります。そのフォルダを選択している状態で、「Create ▼」ボタンを押し、「C# Script」を選択します。これで新規スクリプトファイルが作成されますので、名前を「VRController」とし、確定します(実際には、VRController.csというファイルが生成されます)。

これを開いて下記のように書き換えます。

using UnityEngine;
using System.Collections;

public class VRController : MonoBehaviour {

   // Use this for initialization
   void Start () {
       var trackedController = gameObject.GetComponent<SteamVR_TrackedController>();
       if (trackedController == null) {
           trackedController = gameObject.AddComponent<SteamVR_TrackedController>();
       }

       trackedController.TriggerClicked += new ClickedEventHandler(DoClick);
       trackedController.TriggerUnclicked += new ClickedEventHandler(DoUnclick);
   }

   // Update is called once per frame
   void Update () {
   }

   void DoClick(object sender, ClickedEventArgs e) {
       Debug.Log("click!!");

   }

   void DoUnclick(object sender, ClickedEventArgs e) {
       Debug.Log("unclick!!");

   }
}

「Project」タブの「Assets/Scripts/VRController」を「Hierarchy」タブの「[Camera Rig]/Controller (right)」に重なるようにドラッグ&ドロップします。

以上で上記スクリプトがコントローラに適用されるようになります。

次回は上記スクリプトを拡張して、オブジェクトを掴んで動かせるように実装しましょう。

事例紹介

2016年6月29日から7月18日まで、お台場にある東京科学未来館で『Bjork Digital ―音楽のVR・18日間の実験』という展示があります。料金は2,500円です。

ビョークはこれまでにもその独特な音楽世界を表現するためにiOSアプリやウェブWebなどを公開してきました。今回もVRというテクノロジーが活かされるのはとても期待できます。

この企画の主催が、フジロックなどを主催しているスマッシュコーポレーションであるというのも興味深いところです。今後のフェス等のイベントでもVRを使った何か仕掛けが出てくるかもしれません。

※ 展示の中心となるVRコンテンツは13歳以上が対象です。
※ 入場時間指定制、整理番号付(VRコンテンツ以外は終日鑑賞可)。
※ 企画展、常設展、ドームシアター(いずれも午後5時まで)の鑑賞には別途料金がかかります。

著者紹介


山田宏道 (YAMADA Hiromichi) - 株式会社トルクス 代表取締役

千葉大学工学部卒業。ゲームプログラマーを経て、2005年よりフリーランス。2012年 株式会社トルクスを設立し、コンシューマー向け、ビジネス向けを問わず、さまざまなアプリを受託開発している。

現在、VR関連技術に注力中。2016年4月より島根県奥出雲町に在住。