C# 我如何将第一人称控制器与VROneSDK和VROneSDKHead结合起来?

C# 我如何将第一人称控制器与VROneSDK和VROneSDKHead结合起来?,c#,vrone,C#,Vrone,我想将Unity standard assets的第一人称控制器与VROneSDK和VROneSDKHead的摄像头结合起来,其中角色的旋转由VROneSDK的头部跟踪控制 如何使用SDK实现这一点?Unity的FPS控制器使用脚本MouseLook.cs来控制摄像头。脚本在此perfab中附加了两次。在根对象上,脚本控制水平旋转,在摄影机上,脚本控制垂直旋转 从FPS控制器中删除两个脚本 禁用FPS控制器中的主摄像头。将VROneSDK预置连接到FPS控制器(作为FPS控制器的子对象),并从上

我想将Unity standard assets的第一人称控制器与VROneSDK和VROneSDKHead的摄像头结合起来,其中角色的旋转由VROneSDK的头部跟踪控制


如何使用SDK实现这一点?

Unity的FPS控制器使用脚本MouseLook.cs来控制摄像头。脚本在此perfab中附加了两次。在根对象上,脚本控制水平旋转,在摄影机上,脚本控制垂直旋转

从FPS控制器中删除两个脚本

禁用FPS控制器中的主摄像头。将VROneSDK预置连接到FPS控制器(作为FPS控制器的子对象),并从上一个摄影机复制位置和旋转值

创建具有以下内容的新C#脚本VROneHeadLook.cs:

using UnityEngine;
using System.Collections;

public class VROneHeadLook : MonoBehaviour {
    public bool useAngleX = true;   
    public bool useAngleY = true;
    public bool useAngleZ = true;
    public bool useRealHorizontalAngle = false;
    public bool resetViewOnTouch = true;

    private Quaternion initialRotation = Quaternion.identity;
    private Quaternion currentRotation;
    private static Vector3 gyroAngles; // original angles from gyro
    private static Vector3 usedAngles; // converted into unity world coordinates

    private int userSleepTimeOut; // original device SleepTimeOut setting
    private bool gyroAvail = false;

    // Use this for initialization
    void Start () {
        Input.compensateSensors = true;
    }

    // Update is called once per frame
    void FixedUpdate () {
        if (gyroAvail == false) {
            if (Input.gyro.attitude.eulerAngles != Vector3.zero && Time.frameCount > 30) {
                gyroAvail = true;
                initialRotation = Input.gyro.attitude;
            }
            return; // early out
        }

        // reset origin on touch or not yet set origin
        if(resetViewOnTouch && (Input.touchCount > 0))
            initialRotation = Input.gyro.attitude;

        // new rotation
        currentRotation = Quaternion.Inverse(initialRotation)*Input.gyro.attitude;

        gyroAngles = currentRotation.eulerAngles;

        //usedAngles = Quaternion.Inverse (currentRotation).eulerAngles;
        usedAngles = gyroAngles;

        // reset single angle values
        if (useAngleX == false)
            usedAngles.x = 0f;
        if (useAngleY == false)
            usedAngles.y = 0f;
        if (useAngleZ == false)
            usedAngles.z = 0f;

        if (useRealHorizontalAngle)
            usedAngles.y *= -1;
        transform.localRotation = Quaternion.Euler (new Vector3(-usedAngles.x, usedAngles.y, usedAngles.z));
    }
    void OnEnable() {
        // sensor on
        Input.gyro.enabled = true;
        initialRotation = Quaternion.identity;
        gyroAvail = false;

        // store device sleep timeout setting
        userSleepTimeOut = Screen.sleepTimeout;
        // disable sleep timeout when app is running
        Screen.sleepTimeout = SleepTimeout.NeverSleep;
    }

    void OnDisable() {
        // restore original sleep timeout
        Screen.sleepTimeout = userSleepTimeOut;
        //sensor off
        Input.gyro.enabled = false;
    }
}
将此脚本附加到FPS控制器和VROneSDK预置。对于FPS控制器,将所有脚本变量设置为false,但“使用角度Y”应为true

对于附加到VROneSDK预置的脚本,请将所有脚本变量设置为false,除了“使用角度X”

谢谢,Harry。我还将FPS控制器和VROneSDK预置上的“使用真实水平角度”设置为true。但是,脚本没有将相机设置为正确的初始设备旋转。它总是期待着0,0,0,这会导致当应用程序启动时,陀螺仪旋转关闭,设备平放在桌子上。如何使相机在启动时旋转到初始设备旋转?