C# 谷歌纸板-如何面对同样的方式改变场景?
我正在创建一个虚拟现实游戏,如果用户看到一个按钮,场景就会改变 问题是,如果我使用C# 谷歌纸板-如何面对同样的方式改变场景?,c#,unity3d,google-cardboard,virtual-reality,C#,Unity3d,Google Cardboard,Virtual Reality,我正在创建一个虚拟现实游戏,如果用户看到一个按钮,场景就会改变 问题是,如果我使用SceneManager加载新场景,用户面对的方向将重置,使其成为新的前进方向。例如,我在用户后面有一个退出按钮。如果他们看到它,一个新的场景将加载,但新的“前进”将在他们后面,导致他们必须完全转身,以便他们的身体再次面向前方 我在网上看到了这篇文章,但这是在Unity 4中。它讨论注释掉Recenter()和device.Reset() 我已经重复了Unity 5(我正在使用的版本)中的步骤,但这没有效果。在Un
SceneManager
加载新场景,用户面对的方向将重置,使其成为新的前进方向。例如,我在用户后面有一个退出按钮。如果他们看到它,一个新的场景将加载,但新的“前进”将在他们后面,导致他们必须完全转身,以便他们的身体再次面向前方
我在网上看到了这篇文章,但这是在Unity 4中。它讨论注释掉Recenter()
和device.Reset()
我已经重复了Unity 5(我正在使用的版本)中的步骤,但这没有效果。在Unity 5 Google硬纸板脚本中,我也看不到device.Reset()
一段代码
在播放模式下从当前场景加载新场景时,如何保持朝向同一方向
谢谢 Recenter()
是Google VR SDK最新版本上的类GvrViewer
的一种方法,它是Google Cardward SDK的替代品
要访问它,请使用singleton实例GvrViewer.instance
。在Carboard SDK上,可以使用carboard.SDK.Recenter()
执行相同的任务
只需在退出时存储所有相机的位置和旋转值。在
Start
功能中加载它们。大约一年前,我做了类似的事情,并将与大家分享剧本。只需将其附加到场景中的任何游戏对象。确保将摄像头放在每个插槽中。移动摄影机,然后退出场景。下次你再玩时,它应该保持所有摄像机的位置
如果它停止工作,请调用reset()
函数一次重置保存的数据,然后将其注释掉。只有当它停止工作时才应该调用它,这在我身上从未发生过
#define USEWITHSECENE
using UnityEngine;
using System.Collections;
public class VRCAMRESTORE : MonoBehaviour
{
[System.Serializable]
class VRInfo
{
//Transform Info
[SerializeField]
public Vector3 mainCameraPos;
[SerializeField]
public Vector3 mainCameraLeftPos;
[SerializeField]
public Vector3 mainCameraRightPos;
[SerializeField]
public Vector3 reticleUnderMainCameraPos;
[SerializeField]
public Vector3 PreRenderCameraUnderStereoRenderPos;
[SerializeField]
public Vector3 PostRenderCameraUnderStereoRenderPos;
//Rotation Info
[SerializeField]
public Quaternion mainCameraRot;
[SerializeField]
public Quaternion mainCameraLeftRot;
[SerializeField]
public Quaternion mainCameraRightRot;
[SerializeField]
public Quaternion reticleUnderMainCameraRot;
[SerializeField]
public Quaternion PreRenderCameraUnderStereoRenderRot;
[SerializeField]
public Quaternion PostRenderCameraUnderStereoRenderRot;
}
public Camera mainCamera;
public Camera mainCameraLeft;
public Camera mainCameraRight;
public GameObject reticleUnderMainCamera;
public Camera PreRenderCameraUnderStereoRender;
public Camera PostRenderCameraUnderStereoRender;
private VRInfo vrInfo = null;
private Transform c1, c2, c3, c4, c5, c6;
//Use this for initialization
void Start()
{
intitTransform();
vrInfo = new VRInfo();
//check if vrInfo exist
string savedJsonValue = PlayerPrefs.GetString("vrInfo");
if (savedJsonValue == null)
{
updateCamTransform();
return;
}
//Convert back to class
vrInfo = JsonUtility.FromJson<VRInfo>(savedJsonValue);
//If Null, dont load the saved location
if (vrInfo == null)
{
updateCamTransform();
return;
}
//Load Aettings from the Savings
loadTransform();
}
public void reset()
{
PlayerPrefs.DeleteKey("vrInfo");
}
void intitTransform()
{
c1 = mainCamera.GetComponent<Transform>();
c2 = mainCameraLeft.GetComponent<Transform>();
c3 = mainCameraRight.GetComponent<Transform>();
c4 = reticleUnderMainCamera.GetComponent<Transform>();
c5 = PreRenderCameraUnderStereoRender.GetComponent<Transform>();
c6 = PostRenderCameraUnderStereoRender.GetComponent<Transform>();
}
private void loadTransform()
{
c1.position = vrInfo.mainCameraPos;
c1.rotation = vrInfo.mainCameraRot;
c2.position = vrInfo.mainCameraLeftPos;
c2.rotation = vrInfo.mainCameraLeftRot;
c3.position = vrInfo.mainCameraRightPos;
c3.rotation = vrInfo.mainCameraRightRot;
c4.position = vrInfo.reticleUnderMainCameraPos;
c4.rotation = vrInfo.reticleUnderMainCameraRot;
c5.position = vrInfo.PreRenderCameraUnderStereoRenderPos;
c5.rotation = vrInfo.PreRenderCameraUnderStereoRenderRot;
c6.position = vrInfo.PostRenderCameraUnderStereoRenderPos;
c6.rotation = vrInfo.PostRenderCameraUnderStereoRenderRot;
}
bool firstRun = true;
private void updateCamTransform()
{
//Prevents vrInfo == null from running every frame
if (firstRun)
{
firstRun = false;
if (vrInfo == null)
{
vrInfo = new VRInfo();
}
}
vrInfo.mainCameraPos = c1.position;
vrInfo.mainCameraRot = c1.rotation;
vrInfo.mainCameraLeftPos = c2.position;
vrInfo.mainCameraLeftRot = c2.rotation;
vrInfo.mainCameraRightPos = c3.position;
vrInfo.mainCameraRightRot = c3.rotation;
vrInfo.reticleUnderMainCameraPos = c4.position;
vrInfo.reticleUnderMainCameraRot = c4.rotation;
vrInfo.PreRenderCameraUnderStereoRenderPos = c5.position;
vrInfo.PreRenderCameraUnderStereoRenderRot = c5.rotation;
vrInfo.PostRenderCameraUnderStereoRenderPos = c6.position;
vrInfo.PostRenderCameraUnderStereoRenderRot = c6.rotation;
}
void saveToDrive()
{
string json = JsonUtility.ToJson(vrInfo);
PlayerPrefs.SetString("vrInfo", json);
PlayerPrefs.Save();
Debug.Log(json);
Debug.Log("Quit");
}
#if USEWITHSECENE
void Update()
{
updateCamTransform();
}
void OnDisable()
{
saveToDrive();
}
#else
//For iOS
#if UNITY_IOS
public void OnApplicationPause(bool pauseStatus)
{
if (pauseStatus)
{
//Convert to Json and Save
updateCamTransform();
saveToDrive();
}
}
#else
//For Other Devices
public void OnApplicationQuit()
{
//Convert to Json and Save
updateCamTransform();
saveToDrive();
}
#endif
#endif
}
#定义USEWITHSECENE
使用UnityEngine;
使用系统集合;
公共类:单行为
{
[系统可序列化]
类别VRInfo
{
//转换信息
[序列化字段]
公共矢量器3主摄像机;
[序列化字段]
公共矢量器3主摄像机;
[序列化字段]
公共Vector3主摄像机右位;
[序列化字段]
公共矢量3网线摄像机;
[序列化字段]
公共矢量3预渲染器渲染器渲染器立体渲染器;
[序列化字段]
公共矢量3后期渲染器渲染器立体渲染器;
//轮换信息
[序列化字段]
公共四元数主摄像机;
[序列化字段]
公共四元数主摄影机快步;
[序列化字段]
公共四元数主摄像机;
[序列化字段]
公共四元数网线;
[序列化字段]
公共四元数预渲染器;
[序列化字段]
公共四元数PostRenderCameraunderStereRenderRot;
}
公共摄像机;
公共摄像机;
公共摄像机;
公共游戏对象网线摄像头;
公共摄像机预渲染器摄像机立体渲染器;
公共相机后渲染;渲染器;立体渲染;
私有VRInfo VRInfo=null;
私有变换c1、c2、c3、c4、c5、c6;
//用于初始化
void Start()
{
初始化转换();
vrInfo=新的vrInfo();
//检查vrInfo是否存在
string savedJsonValue=PlayerPrefs.GetString(“vrInfo”);
if(savedJsonValue==null)
{
updateCamTransform();
返回;
}
//返回课堂
vrInfo=JsonUtility.FromJson(savedJsonValue);
//如果为空,则不加载保存的位置
如果(vrInfo==null)
{
updateCamTransform();
返回;
}
//从存储中加载设置
loadTransform();
}
公共无效重置()
{
PlayerPrefs.DeleteKey(“vrInfo”);
}
无效初始化转换()
{
c1=mainCamera.GetComponent();
c2=mainCameraLeft.GetComponent();
c3=mainCameraRight.GetComponent();
c4=网线UnderMainCamera.GetComponent();
c5=PreRenderCameraUnderStereoRender.GetComponent()的预渲染器;
c6=PostRenderCameraUnderStereoRender.GetComponent();
}
私有void loadTransform()
{
c1.position=vrInfo.mainCameraPos;
c1.旋转=vrInfo.mainCameraRot;
c2.position=vrInfo.mainCameraLeftPos;
c2.旋转=vrInfo.main摄影机快步;
c3.position=vrInfo.mainCameraRightPos;
c3.旋转=vrInfo.mainCameraRightRot;
c4.position=vrInfo.reticleUnderMainCameraPos;
c4.旋转=vrInfo.reticleUnderMainCameraRot;
c5.position=vrInfo.prerenderCameraunderStereoreRenderPos;
c5.旋转=vrInfo.PreRenderCameraUnderStereRenderRot;
c6.position=vrInfo.PostRenderCameraUnderStereoRenderPos;
c6.rotation=vrInfo.PostRenderCameraUnderStereoRenderRot;
}
bool firstRun=true;
私有void updateCamTransform()
{
//防止vrInfo==null运行每一帧
如果(首次运行)
{
firstRun=false;
如果(vrInfo==null)
{
vrInfo=新的vrInfo();
}
}
vrInfo.mainCameraPos=c1.position;
vrInfo.mainCameraRot=c1.旋转;
vrInfo.mainCameraLeftPos=c2.position;
vrInfo.mainCameraLeftRot=c2.旋转;
vrInfo.mainCameraRightPos=c3.position;
vrInfo.mainCameraRightRot=c3.0旋转;
vrInfo.reticleUnderMainCameraPos=c4.position;
vrInfo.reticleUnderMainCameraRot=c4.0旋转;
vrInfo.PreRenderCameraUnderStereoRenderPos=c5.position;
vrInfo.PreRenderCameraUn