UnityでOVRHeadsetEmulatorに前進移動を追加する
はじめに
UnityでOculus向けの環境で壊れたOVRHeadsetEmulatorを直すでOVRHeadsetEmulator
が動くようになり回転と上下移動ができるようになりました。Oculus Questで6DoFな移動をしたいので前進移動を追加してみました。
OVRHeadsetEmulatorHelper
以下のスクリプトを保存してOVRHeadsetEmulator
をアタッチしたコンポーネントに追加するだけです。
https://gist.github.com/shiena/8e1908194144792a2495177389ea053e にも同じソースを用意しています。
OVRHeadsetEmulator
のActivate Keysを押したままマウスの右ボタンを押しっぱなしにすると前進に移動します。
前進はw
、後退はs
も検討したのですがCtrlと組み合わせると保存のショートカットとかぶってしまうので苦肉の策でマウスの右ボタンにしています。
他のキーに変更したい場合はMoveForward
メソッドを書き換えてください。
/************************************************************************************
Copyright (c) 2019 KOGA Mitsuhiro
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
************************************************************************************/
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(OVRHeadsetEmulator))]
public class OVRHeadsetEmulatorHelper : MonoBehaviour
{
[SerializeField] private OVRHeadsetEmulator emulator;
[SerializeField] private Transform head;
[SerializeField] private float forwardScale = 1f;
private OVRManager _manager;
private bool _emulatorHasInitialized = false;
private void Reset()
{
emulator = GetComponent<OVRHeadsetEmulator>();
head = FindMainCamera().transform;
}
private bool MoveForward()
{
return Input.GetMouseButton(1);
}
private void Update()
{
if (!_emulatorHasInitialized)
{
if (OVRManager.OVRManagerinitialized)
{
_manager = OVRManager.instance;
_emulatorHasInitialized = true;
}
else
{
return;
}
}
bool emulationActivated = IsEmulationActivated();
if (emulationActivated)
{
if (emulator.resetHmdPoseByMiddleMouseButton && Input.GetMouseButton(2))
{
return;
}
Vector3 emulatedTranslation = _manager.headPoseRelativeOffsetTranslation;
Vector3 forward = head.forward.normalized * (Time.deltaTime * forwardScale);
forward.y = 0;
if (MoveForward())
{
// move forward
emulatedTranslation -= forward;
_manager.headPoseRelativeOffsetTranslation = emulatedTranslation;
}
}
}
private bool IsEmulationActivated()
{
if (emulator.opMode == OVRHeadsetEmulator.OpMode.Off)
{
return false;
}
if (emulator.opMode == OVRHeadsetEmulator.OpMode.EditorOnly && !Application.isEditor)
{
return false;
}
foreach (KeyCode key in emulator.activateKeys)
{
if (Input.GetKey(key))
return true;
}
return false;
}
private Camera FindMainCamera()
{
GameObject[] objects = GameObject.FindGameObjectsWithTag("MainCamera");
List<Camera> cameras = new List<Camera>(4);
foreach (GameObject obj in objects)
{
Camera camera = obj.GetComponent<Camera>();
if (camera != null && camera.enabled)
{
OVRCameraRig cameraRig = camera.GetComponentInParent<OVRCameraRig>();
if (cameraRig != null && cameraRig.trackingSpace != null)
{
cameras.Add(camera);
}
}
}
if (cameras.Count == 0)
{
return Camera.main; // pick one of the cameras which tagged as "MainCamera"
}
else if (cameras.Count == 1)
{
return cameras[0];
}
else
{
// return the camera with least depth
cameras.Sort((Camera c0, Camera c1) =>
{
return c0.depth < c1.depth ? -1 : (c0.depth > c1.depth ? 1 : 0);
});
return cameras[0];
}
}
}
OVRPlayerController.prefabも悪くない
Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab
はCharacter Controller
とOVRPlayerController
が組込まれているのでWASD、十字キー、Oculus Touchコントローラーのアナログスティックで前後移動できます。
Author And Source
この問題について(UnityでOVRHeadsetEmulatorに前進移動を追加する), 我々は、より多くの情報をここで見つけました https://qiita.com/shiena/items/e70dfa6a61e965b40a52著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .