VR空間を動き回る!Unityで目線テレポート移動
こんにちは。
製造建設ソリューションサービス部の菱沼です。
VRを利用するために必要なヘッドマウンドディスプレイ(以降:HMD)ですが、最近ではスタンドアロン型の「Oculus Go」、Viveよりも高性能になった「Vive Pro」が発売されています。
さて、色々なHMDが世に出回っていますがコントローラーの有無などそれぞれに特徴があります。
そこで今回は、どのHMDでも利用できるのではないかと思われるVR空間を目線で移動する方法についてご紹介いたします。
なぜ目線移動?
今回、なぜ目線によるテレポート移動を題材にしたかというと、
「どのHMDにも利用できるVR酔いの少ない移動方法」であるからです。
目線による移動はコントローラーの必要性もありませんので、コントローラーのないスマホ向けのコンテンツにも活用することができます。
また、「目線の先に移動します」の簡単な一言だけで、操作方法を説明できることも利点のひとつです。
Unityで開発!
それでは、Unityで目線テレポート移動を作成していきたいと思います。
以下の流れで説明をしていきます。
1.Unityのインストール
2.新規プロジェクトの作成
3.床の配置
4.スクリプトファイルの作成
5.コーディング
6.VRで目線テレポート移動!
1.Unityのインストール
Unityのインストール方法につきましては、以下の公式サイトを参照してください。
Unityマニュアル – Unity のダウンロードとインストール
2.新規プロジェクトの作成
Unityで作業をするためのプロジェクトを作成します。
1.インストール終了後、Unityを起動
2.上部メニューの「NEW」を選択
3.「Project name」にプロジェクト名を記入
4.「Create Project」をクリックし、プロジェクト新規作成
3.床の配置
プロジェクトを作成したら、移動範囲である床を配置します。
1.Unity画面左側の「Hierarchy」の「Scene」内で右クリック
2.「3D Object」から「Plane」を選択
3.Unity画面右側の「Insoector」の「Transform」の「Position」を以下に変更
X:0
Y:0
Z:0
4.スクリプトファイルの作成
コードを記載するためのスクリプトファイルの作成を行います。
今回は「C#」を利用していきます。
1.Unity画面下部の「Project」の「Assets」内で右クリック
2.「Create」から「C# Script」を選択
3.ファイル名を決める(ここでは『RayCast』)
5.コーディング
ここからはコーディングを行っていきます。
コードの詳細はコメントに記載しています。
1.作成したスクリプトファイルをダブルクリックで開く
2.以下のコードをスクリプトファイル『RayCast』に記載
using UnityEngine;
// 目線によるテレポート移動
public class RayCast : MonoBehaviour
{
// 移動対象のオブジェクト
public GameObject moveObject;
// メインカメラ(Rayを出力するカメラ)
public Camera mainCamera;
// タイムカウント
private float timeCount;
// 画面更新ごとに呼び出されます(起動中ずっと呼び出されるイメージです)
void Update() {
// レイ(光線)を飛ばした際に衝突したオブジェクトの情報
RaycastHit hitObject;
// レイ(光線)をカメラから飛ばす
// new Ray(Ray出力の原点, Rayの出力方向)
Ray ray = new Ray(mainCamera.transform.position, mainCamera.transform.forward);
// レイ(光線)がオブジェクトに当たった場合の動作
if (Physics.Raycast(ray, out hitObject)) {
// タイマーカウント開始
timeCount += 0.01f;
// 特定の秒数レイ(光線)が当たり続けると移動
if (timeCount < 2f) {
// 移動対象オブジェクトの座標をレイ(光線)の当たった座標に移動(移動対象オブジェクトの高さY座標は変更しない)
moveObject.transform.position = new Vector3(hitObject.point.x, moveObject.transform.position.y, hitObject.point.z);
// タイマーリセット
timeCount = 0f;
}
} else {
// レイ(光線)がオブジェクトから外れた場合、タイマーリセット
timeCount = 0f;
}
}
}
3.保存し、閉じる
4.「Hierarchy」の「Scene」で右クリック「Empty」を選択
5.「GameObject」が作成される
6.スクリプトファイル『RayCast』を選択
7.「Hierarchy」内の「Empty」にドラッグ&ドロップ
6.「Inspector」内の「RayCast(Script)」にオブジェクトを設定
Move Object:視点移動したいオブジェクトを「Hierarchy」からドラッグ&ドロップ
Main Camera:Ray(視点)を飛ばすカメラを「Hierarchy」からドラッグ&ドロップ
カメラをそのまま移動させたい場合は二つとも同じオブジェクトを設定すると良いです。
6.VRで目線テレポート移動!
以上で設定は完了です。
最後に、HTC Viveで実際に起動してみたいと思います。
ViveをUnityで起動するための設定はこちらをご覧ください。
HTCViveでは、
Move Object:[CameraRig]
Main Camera:Camera(head)
を設定しています。
実際に動き回ることができました。
最後に
こういった移動方法は目線の位置がわかりにくいという点もあるので、目印になるものをカメラの前に配置することも必要になるかと思います。
想定しているシミュレーションにあわせた移動方法を採用することが大切ではないでしょうか。
今後も、このような技術記事を書いていきたいと思います。