HTC VIVE、ルームスケールで移動できて楽しいです。
ただ、コントローラーを使って一人称視点でゲームを作ろうとすると工夫が必要です。ルームスケール+一人称視点でのキャラクター操作は酔いやすいので注意が必要です。またUnityのStandard AssetのFirst Person Controllerはそのままではうまく動きません。
今回はHTC VIVEを用いて
- X-Boxコントローラーおよびキーボードでの操作に対応
VIVEのHMDで向いている先を中心にコントロール - VIVEコントローラーではトリガーを引くと視線の先に移動する
を実装します。(もっと適切な仕様もあるかも)
1、まずはSteamVR Pluginをインポートします。(Unity5.4からVirtualReality SupportだけでVIVEの利用が可能になりましたがコントローラーが使えません。)
2,UnityのStandard AssetのCharactersをインポートします。First Person Controllerが利用可能になります。
3,インポートしたスタンダードアセットからRigidBodyFPSControllerをシーンに追加します。
4,先ほど追加したRigidBodyFPSControllerの子オブジェクトとしてSteamVRの[CameraRig]をシーンに追加します。
5,不要なカメラを削除します。シーンに初めからあるMainCameraとRigidBodyFPSController内のMainCameraを削除
インスペクタービューでRigidBodyFPSControllerのRigidbodyFirstPersonControllerスクリプトのCamに[CameraRig]内のカメラCamera(eye)を設定します。
6,Unityのゲームビューでマウスによる誤動作防止のため、InspectorでRigidbodyFirstPersonControllerのMouseLookのSensitivityを0に設定しておきます。
これで、XBOXコントローラーおよびキーボードを用いたFirst Person ControllerがVIVEで利用可能になりました。
7,では次にVIVEのコントローラーでも移動できるようにしましょう。今回は、トリガーを引くことで前方に移動するという機能を実装します。
(トラックパッドでの移動など誰か実装したら教えてください)
using UnityEngine; using System.Collections; public class vive_firstpersoncontroller : MonoBehaviour { SteamVR_TrackedObject trackedObj; public GameObject ViveCameraHead; public GameObject FPSController; public float speed = 3; void Awake() { trackedObj = GetComponent<SteamVR_TrackedObject>(); } void Update() { var device = SteamVR_Controller.Input((int)trackedObj.index); //トリガーを浅く握る if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) { //Debug.Log("GetTouch Trigger"); float slowSpeedFactor = 0.5f; Vector3 moveDistance = ViveCameraHead.transform.TransformDirection(Vector3.forward); Vector3 moveDistance2 = new Vector3(moveDistance.x * Time.deltaTime * speed* slowSpeedFactor, 0, moveDistance.z * Time.deltaTime * speed* slowSpeedFactor); FPSController.transform.position += moveDistance2; } //トリガーを深く握る if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger)) { //Debug.Log("GetPress Trigger"); Vector3 moveDistance = ViveCameraHead.transform.TransformDirection(Vector3.forward); Vector3 moveDistance2 = new Vector3(moveDistance.x * Time.deltaTime * speed, 0, moveDistance.z * Time.deltaTime * speed); FPSController.transform.position += moveDistance2; } } }
上記コードをvive_firstpersoncontroller.csとして保存し、Controllerにアタッチします。
Inspectorビューで
・VIVE Camera HeadにCameraを
・FPS ControllerにRigidBodyFPSControllerを
を設定します。
ここで要注意なのが
Unity5.3系ではCamera(head)
Unity5.4系ではCamera(eye)
を設定してください。
(Unity5.4では実行時にCamera(head)が消えるという謎仕様)
パッケージダウンロード
上記をまとめたパッケージを用意しました。SteamVRを手動でインポートした後にパッケージのインポートを行ってください。(Unityスタンダードアセットは再配布OKとのことで下記パッケージに含めています)
RigidBodyFPSController_VIVE_5.3.unitypackage
RigidBodyFPSController_VIVE_5.4.unitypackage