停止、禁用或暂停头部跟踪谷歌纸板



我正在使用unity3d和谷歌纸板sdk制作一个谷歌纸板游戏。我想知道禁用/启用头部跟踪的最佳方法,这样我就可以在游戏结束或开始前停止游戏。

我刚刚发现如何在当前版本的Google VR:GVR Unity SDK v1.10.0上禁用头部跟踪。

方法是将GvrHead脚本添加到GvrViewerMain序言中。之后,您可以制作一个简单的代码来访问头部跟踪,该跟踪由GvrHead脚本控制。

    GameObject.Find ("VRPlayer").GetComponent<GvrHead> ().trackRotation = false;
    GameObject.Find ("VRPlayer").GetComponent<GvrHead> ().trackPosition = false; 

在触发器或事件上,或者在任何你想禁用头部跟踪的地方写下这段代码。

此代码查找属性public bool trackRotation=true公共布尔trackPosition=true,并将de bool更改为false

要了解为什么这些代码行会在内部禁用headtracking,请查看GvrHead脚本。

要更改回a启用Headtracking,请使用相同类型的代码再次更改GvrHead脚本的布尔值。

    GameObject.Find ("VRPlayer").GetComponent<GvrHead> ().trackRotation = true;
    GameObject.Find ("VRPlayer").GetComponent<GvrHead> ().trackPosition = true; 

脚本和预制脚本来自GVR Unity SDK包中的deffault。

示例

我用它作为触发对象。当玩家向右看对象时,代码就会运行。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StopHeadTrack : MonoBehaviour, IGvrGazeResponder {
public Animator anim;
public void OnGazeEnter () {
    GameObject.Find ("VRPlayer").GetComponent<GvrHead> ().trackRotation = false;
    GameObject.Find ("VRPlayer").GetComponent<GvrHead> ().trackPosition = false; 
}

使用OnHeadUpdated事件

遵循此代码。

CardboardHead head;
void Start () {
    head = GameObject.Find("Head").GetComponent<CardboardHead>();
    head.OnHeadUpdated += Test_OnHeadUpdated;
}
private void Test_OnHeadUpdated(GameObject head_obj)
{
    head_obj.transform.rotation = Quaternion.identity;
    head_obj.transform.position = //the position when you stop cardboard;
}

您可以禁用位置和旋转跟踪。

GameObject.Find("Head").GetComponent<CardboardHead>().trackRotation = false;

2017年9月6日,GvrHead.cs不复存在。我已经能够用以下代码禁用头部跟踪:

VRDevice.DisableAutoVRCameraTracking(Camera.main, true); 

参考页:https://docs.unity3d.com/ScriptReference/VR.VRDevice.DisableAutoVRCameraTracking.html

请注意,只有在构建它之后才能在智能手机中工作。它在Unity游戏预览中不起作用,还有其他问题。我在这里询问了这些问题:https://github.com/googlevr/gvr-unity-sdk/issues/716

因此,长期最佳解决方案可能是:

private void TrackPositionAndRotation (bool track){
    if (track) {
        #if UNITY_EDITOR
        FindObjectOfType<GvrEditorEmulator>().enabled = true;
        #endif  // UNITY_EDITOR
        #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
        VRDevice.DisableAutoVRCameraTracking(Camera.main, false);
        #endif  // (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
        //cardboardHead.GetComponent<GvrHead>().trackPosition = true;
        //cardboardHead.GetComponent<GvrHead>().trackRotation = true;
    } else {
        #if UNITY_EDITOR
        FindObjectOfType<GvrEditorEmulator>().enabled = false;
        #endif  // UNITY_EDITOR
        #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
        VRDevice.DisableAutoVRCameraTracking(Camera.main, true);
        #endif  // (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
        //cardboardHead.GetComponent<GvrHead>().trackPosition = false;
        //cardboardHead.GetComponent<GvrHead>().trackRotation = false;
    }
}

更新2017.11.29上面的代码不起作用,因为VR已经改为XR。检查:https://docs.unity3d.com/ScriptReference/XR.InputTracking-disablePositionalTracking.html