GLUE

暮らしと仕事にちょっと役立つかも知れないエンタメ系情報サイト

  • 株式会社アジャスト

初心者向けVRゲーム開発
移動方法(テレポート移動)

VRゲーム開発講座 VR編

はじめまして、VRアプリケーションが大好きなVR太郎です。

Unityを使用したVRゲーム開発をしたいけど、何から手をつけていいのか分からない
とお困りの方はいらっしゃいますか?

私自身も開発する際にゲームの根本となる「移動」方法をどう実装するべきかとても悩みました。
そこで、VR酔いを抑えることができ、初心者の方にも安心してVR体験を提供できるオススメの移動方法「テレポート」について解説したいと思います。

Unityでプログラムを作成してコントローラに機能を適応するため、コントローラ間の情報操作の流れを掴むことができ、様々なアクションに応用できるので是非挑戦してみてください。プログラミングができない方でもソースコードがあるので安心して取り組めますよ。

今回の開発では、下記の動画を参考にしました。
海外クリエイターのため日本語ではないですが、作業工程を動画で確認できるので、とてもオススメの動画です。
(ご本人に紹介許可を頂いております!)

目次

1. 開発機材と開発環境

2. SteamVRを使えるようにしよう!

3. VR空間に床を作ろう

4. VR専用のカメラを設定しよう

5. テレポートしよう

6. さいごに

1.開発機材と開発環境

まずは開発機材と開発環境を用意しましょう。

VR機材
HTC VIVE
プラットフォーム
Unity(ユニティ)
https://store.unity.com/ja#plans-individual
SteamVR 2.0を使用します。
https://store.steampowered.com/?l=japanese
開発PCのスペック
Core i7-7700/CPU 3.60GHz/RAM 16GB

2.SteamVRを使えるようにしよう!

SteamVRの機能をUnityで扱えるようにしましょう。
Unityを起動し、上の段にある【 Window -> 「Asset Store」】を開きます。

上記の画面がアセットストアです。

アセットストアが表示されました。
アセットストアとはゲーム開発に必要な素材やシステムの販売、流通システムです。

今回使用するSteamVRは無料なので、安心してインポートしてください。

SteamVR」と検索すると上記の画像のようにアセットが表示されるので、インポートをクリック。

検索入力欄はアセットストアの上部にあります。

3.VR空間に床を作ろう

VR空間に床となるオブジェクトを生成してみましょう。

まず【 GameObject -> Create -> 3D Object 】で 「Plane」 を選択してください。

【 GameObject -> Create -> 3D Object 】で 「Plane」 を選択。
赤枠がHierarchyビューです。

VR空間に床が生成されました。

Unityで作成したオブジェクトは「Hierarchy」ビューに表示されます。
プレイヤーや敵、壁や床からカメラなど、ゲーム制作に使う道具が詰め込んである場所です。

同じ要領で、テレポート先を指し示すポインターを作成しましょう。
メニューバーの【 GameObject -> Create -> 3D Object 】で 「Cube」 を選択してください。
大きさは「Inspector」の「Scale」から変更可能です。

【 GameObject -> Create -> 3D Object 】 から「Cube」を選択
Hierarchy」ビューに「Cube」が追加されていればOKです。

このままだと床と同じ色で識別しにくいため、色をつけるためのマテリアル設定を行います。
マテリアルを例えるなら「服」です。オブジェクトに設定することで様々な色を反映できます。

赤線枠内の【 Assets内で右クリック -> Create -> 「Material」】 を選択しましょう。

「Assets」は赤線枠内の「project」ビュー内にあります。
生成されたマテリアルです。

生成されたマテリアルをクリックして選択後、Inspector内の「Main Maps」から「Albedo」でマテリアル色の設定が可能です。

完成したマテリアルをポインターへドラックアンドドロップで適応できます。

赤枠内に「Albedo」の項目があります。
先ほど生成した「Cube」に対してマテリアルをドラッグアンドドロップしましょう。

4.VR専用のカメラを設定しよう

VR専用のカメラを設定します。
このカメラを通して、プレイヤーはゲーム内を見通すことができます。

Projectビューから 【 Assetsフォルダ -> SteamVR -> Prefabs -> [CameraRig] 】を「Hierarchy」ビューへドラッグアンドドロップしましょう。

projectビュー内にあるAssetsフォルダを参照してください。
Hierarchyビューで[CameraRig] を確認しましょう。

この[CameraRig]にはプレイヤーのカメラ情報のほかに、コントローラ情報も含んでいます。
【[CameraRig] -> Camera 】の「Inspector」のコンポーネントに「SteamVR_Camera」を追加します。

コンポーネントの検索欄に 「Steam VR_Camera」 と入力しましょう。
選択後、上記の状態になれば追加されています。

5.テレポートしよう

スクリプトを作成して、テレポート機能を作りましょう。

スクリプトを作成するには【 Assetsフォルダ内(右クリック) -> Create -> C# Script 】で作れます。

「Assetsフォルダ内」で右クリックしましょう。
赤枠のものが 「script」 となります。

スクリプトの内容は以下のとおりです。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Valve.VR;
  5. public class Teleporter : MonoBehaviour
  6. {
  7.     public GameObject m_Pointer;
  8.     public SteamVR_Action_Boolean m_TeleportAction;
  9.     private SteamVR_Behaviour_Pose m_Pose = null;
  10.     private bool m_HasPosition = false;
  11.     private bool m_IsTeleporting = false;
  12.     private float m_FadeTime = 0.5f;
  13.     private void Awake()
  14.     {
  15.         m_Pose = GetComponent<SteamVR_Behaviour_Pose>();
  16.     }
  17.     void Update()
  18.     {
  19.         m_HasPosition = UpdatePointer();
  20.         m_Pointer.SetActive(m_HasPosition);
  21.         if(m_TeleportAction.GetStateUp(m_Pose.inputSource))
  22.         {
  23.             TryTeleport();
  24.         }
  25.     }
  26.     private void TryTeleport()
  27.     {
  28.         if(!m_HasPosition || m_IsTeleporting)
  29.            return;
  30.         Transform cameraRig = SteamVR_Render.Top().origin;
  31.         Vector3 headPosition = SteamVR_Render.Top().head.position;
  32.         Vector3 groundPosition = new Vector3(headPosition.x, cameraRig.position.y, headPosition.z);
  33.         Vector3 translateVector = m_Pointer.transform.position - groundPosition;
  34.         StartCoroutine(MoveRig(cameraRig, translateVector));
  35.     }
  36.     private IEnumerator MoveRig(Transform cameraRig , Vector3 translation)
  37.     {
  38.         m_IsTeleporting = true;
  39.         SteamVR_Fade.Start(Color.black, m_FadeTime, true);
  40.         yield return new WaitForSeconds(m_FadeTime);
  41.         cameraRig.position += translation;
  42.         SteamVR_Fade.Start(Color.clear, m_FadeTime, true);
  43.         m_IsTeleporting = false;
  44.     }
  45.     private bool UpdatePointer()
  46.     {
  47.         Ray ray = new Ray(transform.position, transform.forward);
  48.         RaycastHit hit;
  49.         if(Physics.Raycast(ray , out hit))
  50.         {
  51.             m_Pointer.transform.position = hit.point;
  52.             return true;
  53.         }
  54.         return false;
  55.     }
  56. }

冒頭で紹介した動画内でもスクリプトの確認ができますので、そちらと合わせて作業をすると良いと思います。

次に、コントローラに移動処理をアタッチ(適応)します。
【[CameraRig] -> Controller[left]】に作成したスクリプトをアタッチしてください。

適用すると赤枠のように表示されます。

アタッチしたスクリプトに、テレポートで使用する際のコントローラ情報を任意に設定すれば完成です。

さいごに

自作ホラーゲームです。

いかがだったでしょうか。
私はホラーゲームが好きなので、VRホラーゲームを作成してみました。

Unityでは様々なアセットを使用すればゲーム制作も思いのままに進みますので、これをきっかけにチャレンジしてみてください!

また、今回紹介した動画投稿者andrewさんはDiscordというアプリを通して連絡が可能です。
質問やandrewさんを通じて集まったクリエイターの作品を閲覧することも可能なので、英語が得意な方は是非交流してみてください。

(文/VR太郎)

※記事内容はすべて公開日時点の情報となります。

記事をシェアする!