今回は、VR空間内を自由に歩き回ったり、飛び回ったりできるアプリを実装。
◆事前準備
1.https://www.durovis.com/en/sdk.html から「Dive Unity Plugin Package」をダウンロード。
2.MainCameraの代わりにステージ上にダウンロードしたパッケージの中からDiveCameraを配置
デバイス上で、Gyroセンサーを感知、またDiveCamera自身を動かすために以下のScriptを用意します。
GyroScriptWalk.cs
using UnityEngine;
using System.Collections;
public class GyroScriptWalk : MonoBehaviour {
public GameObject diveCamera;
// 移動速度を数パターン設定(後進は-で定義)
public float moveSpeed = 10.0f;
public float moveSpeed2 = 30.0f;
public float moveSpeed3 = -10.0f;
public float moveAngleX = 10.0f;
public float moveAngleXX = 20.0f;
public float moveAngleXXX = 350.0f;
public float moveAngleXXXX = 340.0f;
float yOffset;
Quaternion currentGyro;
void Start(){
Input.gyro.enabled = true;
yOffset = gameObject.transform.position.y;
}
void Update () {
// Gyroセンサーを感知
currentGyro = Input.gyro.attitude;
this.transform.localRotation =
Quaternion.Euler (90, 90, 0) * (new Quaternion (-currentGyro.x, -currentGyro.y, currentGyro.z, currentGyro.w));
// 1.カメラの傾きを取得
float angle = diveCamera.transform.eulerAngles.x;
// 2.ある角度以内であれば前進させる
if (moveAngleX < angle && angle < moveAngleXX) {
moveForward ();
} else if (moveAngleXX < angle && angle < 45.0f) {
runForward ();
} else if (moveAngleXXX > angle && angle > moveAngleXXXX) {
moveBackward ();
}
}
// 2.速度に合わせて移動(moveForward,runForward,moveBackward)を定義
public void moveForward() {
Vector3 direction = new Vector3 (diveCamera.transform.forward.x, 0, diveCamera.transform.forward.z).normalized * moveSpeed * Time.deltaTime;
Quaternion rotation = Quaternion.Euler (new Vector3 (0, -diveCamera.transform.rotation.eulerAngles.y, 0));
diveCamera.transform.Translate (rotation * direction);
diveCamera.transform.position = new Vector3 (diveCamera.transform.position.x, yOffset, diveCamera.transform.position.z);
}
public void runForward() {
Vector3 direction = new Vector3 (diveCamera.transform.forward.x, 0, diveCamera.transform.forward.z).normalized * moveSpeed2 * Time.deltaTime;
Quaternion rotation = Quaternion.Euler (new Vector3 (0, -diveCamera.transform.rotation.eulerAngles.y, 0));
diveCamera.transform.Translate (rotation * direction);
diveCamera.transform.position = new Vector3 (diveCamera.transform.position.x, yOffset, diveCamera.transform.position.z);
}
public void moveBackward() {
Vector3 direction = new Vector3 (diveCamera.transform.forward.x, 0, diveCamera.transform.forward.z).normalized * moveSpeed3 * Time.deltaTime;
Quaternion rotation = Quaternion.Euler (new Vector3 (0, -diveCamera.transform.rotation.eulerAngles.y, 0));
diveCamera.transform.Translate (rotation * direction);
diveCamera.transform.position = new Vector3 (diveCamera.transform.position.x, yOffset, diveCamera.transform.position.z);
}
}