もぐりの日記

雑日記

技科大祭展示VRゲーム製作記録

adventar.org

TUT-AdC 2日目の記事です。 「UnityでVRをとりあえず動かした話」改め、「技科大祭展示VRゲーム製作記録」です。
本年度技科大祭のコンピュータークラブで展示していたVRゲームの製作記録になります。
開発環境はWindows10、Unity5、Oculus Rift + Touchです。

つくったもの

杖と盾で戦うVRシューティングゲームを作りました。 敵を倒し尽くせばゲームクリアという単純なものです。


UnityでVRをとりあえず動かした話

製作記録

大まかなスケジュール

製作は、4人グループで行いました。大まかな流れは、

  • 5月:企画決定
  • 6,7,8月:モックを作りつつ、仕様を詰める
  • 9月:完成させる

です。この記事では、8-9月中に行われたVR対応機能の実装について触れていきます。

VR対応

対応させる段階別に、それぞれ見て行きます

  • ヘッドトラック
  • 手の表示
  • 触る/握る/使う
  • 握られる/使われる

ヘッドトラック

UnityはVRをサポート*1していて、ヘッドトラックはチェックボックス一つで実現できます。
客注リンク先の「VR サポートを有効にする」を参考に“Virtual Reality Supported” オプションを有効にすると、VRヘッドセットに合わせて、メインカメラの回転とポジションが上書きされるようになります。

手の表示…の前に

Touchコントローラーを使っていくために、Oculus Utilities for Unity*2,Oculus Avatar SDK*3,VRTK*4というアセットを導入します。
前者2つはOculus developersのサイトから、VRTKはアセットストアから入手できます。

インポートできたら、VRTKについているサンプルシーンや、ドキュメントなどを参考にセットアップをしていきます。

手の表示

  1. 空のシーンに、空オブジェクトを2つ作成
  2. 一方の子要素に、Oculus Utilities と Avatar SDK からインポートした、OVRCameraRigとLocalAvatarをおく
  3. OVRCameraRigにアタッチされている、OVR Manager の Tracking Origin TypeをFloor Levelに変更
  4. 2.で子要素を追加したオブジェクトに、VRTK_SDKSetupをアタッチ,Quick SelectをOculusに設定
  5. 2.で選ばなかった方のオブジェクトに、VRTK_SDKManagerをアタッチ,Auto Populateを押す

これでコントローラーに追従する手が表示されるはずです。

触る/握る/使う

前項で表示した手に、握る/使うといったアクションができるようにしていきます。

  1. 前項で、VRTK_SDKManagerをアタッチしたオブジェクトの子要素に、Left,Rightという名前で空オブジェクトを作る
  2. それぞれを、VRTK_SDKManagerのScript Aliasesに設定

ここまでの作業でヒエラルキーはこのようになります。ここでVRTKがSDKManager、VRPlayerがSDKSetupをアタッチしたオブジェクトです。

f:id:sumogri:20171202022554p:plain

ここで追加した、Left,Rightに手で行えるアクション機能を乗せていきます。
たとえば、触る/握る/使うの機能を乗せたLeftのInspactorは

f:id:sumogri:20171202023516p:plain

となります。

ここまでの設定で、手の側の設定が一通り完了します。試しに、サンプルシーンの16番にある剣をもってきてみると、握れるはずです。

握られる/使われる

最後に、サンプルシーンにあるような、握れる/使えるオブジェクトを作っていきます。
例として、今回作ったゲームの杖にアタッチしたスクリプトを見てみます。

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using VRTK;

public class IntaractableStick : VRTK_InteractableObject{
    [Header("Stick Option")]
    [SerializeField] private int magicIndex = 0;
    [SerializeField] private Transform magicGeneratePoint;
    [SerializeField] bool followToEnemy = true;
    private Raycaster raycaster;
    private VRTK_ControllerReference controllerReference;
    private MagicManager magicManager;

    protected void Start()
    {
        raycaster = gameObject.GetComponent<Raycaster>();
        magicManager = AurorPlayerController.PlayerObject.GetComponent<MagicManager>();
    }

    public override void StartUsing(VRTK_InteractUse currentUsingObject = null)
    {
        var magic = Instantiate(magicManager.MagicPrefabs[magicIndex],
            magicGeneratePoint.position,
            magicGeneratePoint.rotation);

        if (followToEnemy) FollowToEnemy(magic);

        VRTK_ControllerHaptics.TriggerHapticPulse(controllerReference, 0.5f, 0.5f, 0.01f);

        base.StartUsing(currentUsingObject);
    }

    public override void Grabbed(VRTK_InteractGrab currentGrabbingObject = null)
    {
        controllerReference = VRTK_ControllerReference.GetControllerReference(currentGrabbingObject.controllerEvents.gameObject);
        VRTK_ControllerHaptics.TriggerHapticPulse(controllerReference, 0.7f, 0.25f, 0.01f);
        base.Grabbed(currentGrabbingObject);
    }

    public override void Ungrabbed(VRTK_InteractGrab previousGrabbingObject = null)
    {
        controllerReference = null;

        base.Ungrabbed(previousGrabbingObject);
    }
}

肝心なのは、VRTK_InteractableObjectを継承している点です。 これを継承し、StartUsingやGrabbedといったメソッドをオーバーライドすると、それらに対応したアクションがなされたときに実行されます。

inspectorから見てみると、こんな感じになっています。

f:id:sumogri:20171202025254p:plain

掴みについての設定や、使えるタイミングなど設定できることが見て取れます。
これ以外の機能、たとえば、左手でつかんだものをそのまま右に持ち変える、持った時の手とオブジェクトの位置関係を調節するなどは、別のスクリプト(VRTK_SwapControllerGrabAction等)をアタッチすることで実現していきます。

このようにして、もろもろ実装していくと、とりあえず動くものが出来上がります。

まとめ

長々と Oculus Rift + Touch でとりあえず動かす話を書き連ねてきました。
VRTKにはすぐに使えるサンプルが多数収録されているので、それらを見て行くことでもいろいろできることがわかっていくと思います。
VRというと、ハイスペックPCとお高いHMDが欲しくてなんとなく敷居が高いイメージかもしれません。 しかし、このように気軽に動かすものが作れるとなると、ちょっと近くに感じませんか?感じますよね? Oculus Rift + Touchも当初の価格から随分値下げされ今では5万円とお手頃(?)になっているので、これを機に買ってみるのもいいかもですね!
といったところで、記事を終えたいと思います。

ちなみに、今回紹介したゲームを含めた技科大祭展示作のゲームCDを、コミックマーケット93[金曜日 東地区 "ク" 34a]とよぎぃそふとにて頒布します!どうぞよろしくお願いします!

明日は@naruhodo2015さんによる、「JRA銀行から出金する方法について(中京2日目11R)」です! お楽しみに!
果たして昨年の預金を引き出せるんでしょうか!?私気になります!