【发布时间】:2018-10-10 07:35:25
【问题描述】:
我使用 Unity 和适用于 Android 的 Google VR SDK 开发了一款 VR 游戏。我希望游戏也可以在没有 VR 耳机的情况下玩。我应该如何实现从 VR 到普通模式的切换,反之亦然?我想在正常模式下使用手机陀螺仪保持 360 度旋转。我在网上浏览了许多脚本,但找不到任何可以实现这一点的东西。
我发现可以使用 XRSettings.enabled = true/false(取决于模式)来完成切换模式,但是在 Normal(非 VR 模式)下如何保持 360 度旋转
这是我写的脚本:
公共类 GyroToggleManager : MonoBehaviour {
private int flag = 0;
private Quaternion offset;
IEnumerator SwitchToVR() {
string desiredDevice = "cardboard";
XRSettings.LoadDeviceByName(desiredDevice);
yield return null;
XRSettings.enabled = true;
transform.localRotation = Quaternion.identity;
}
IEnumerator SwitchTo2D() {
Input.gyro.enabled = true;
// couldn't figure out how to find this.
offset = ;
XRSettings.LoadDeviceByName("");
yield return null;
transform.localRotation = Quaternion.identity;
}
// Use this for initialization
void Start () {
if(XRSettings.enabled == false){
Input.gyro.enabled = true;
}
}
// Update is called once per frame
void Update () {
if (XRSettings.enabled) {
return;
}
//Also tried different combinations here nothing worked.
transform.localRotation = Input.gyro.attitude ;
}
public void StartVR(){
if(XRSettings.enabled == false){
StartCoroutine (SwitchToVR ());
}
}
public void StartN(){
if(XRSettings.enabled == true){
StartCoroutine(SwitchTo2D());
}
}
}
更新脚本:
公共类 GyroToggleManager : MonoBehaviour {
Quaternion offset;
IEnumerator SwitchToVR() {
string desiredDevice = "cardboard";
XRSettings.LoadDeviceByName(desiredDevice);
yield return null;
XRSettings.enabled = true;
transform.rotation = Quaternion.identity;
}
IEnumerator SwitchTo2D()
{
Input.gyro.enabled = true;
//Get offset.. Subtract Camera rotation from Gyro rotation
offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude));
XRSettings.LoadDeviceByName("");
yield return null;
XRSettings.enabled = false;
}
private static Quaternion GyroToUnity(Quaternion q)
{
return new Quaternion(q.x, q.y, -q.z, -q.w);
}
// Use this for initialization
void Start () {
if(XRSettings.enabled == false){
Input.gyro.enabled = true;
}
}
void Update()
{
if (XRSettings.enabled)
{
return;
}
//Add the gyro value with the offset then apply to the camera
transform.rotation = offset * GyroToUnity(Input.gyro.attitude);
}
public void StartVR(){
if(XRSettings.enabled == false){
StartCoroutine (SwitchToVR ());
}
}
public void StartN(){
if(XRSettings.enabled == true){
StartCoroutine(SwitchTo2D());
}
}
}
【问题讨论】:
-
我更改了标题,因为它使您的问题重复,而不是真正的问题。对于您的问题,请在切换模式之前进行旋转。切换模式后,将相机旋转设置为之前的旋转。
-
@Programmer 感谢标题更改。但是,即使我在切换到正常模式之前获得了旋转,只要 XRSettings.enabled 设置为 false,360 度移动就会停止。如何保持这种 360 度旋转?
-
我可能误会了你。从 VR 切换到普通模式时,您希望相机保持相同的旋转吗?面对与切换之前相同的方式?如果是,请查看我的第一条评论
-
@Programmer 是的,我希望相机保持相同的旋转,但与此同时,我想在正常模式下使用移动陀螺仪保持头部跟踪。
-
我错过了陀螺仪部分。在切换之前,获取相机位置并减去当前陀螺仪值。该值是偏移量。每一帧,(
Update函数)获取陀螺仪值并将其应用到具有该偏移量的相机上。试试这个。如果您遇到问题,请发布您的尝试代码,包括切换代码,如果可能,我会提供修复。
标签: c# unity3d google-vr game-development google-vr-sdk