2016-05-22 1 views
0

私はVRゲームを作成しています。ユーザーがボタンを見るとシーンが変わります。Google Cardboard - シーンを変更するときに同じように向き合う方法は?

SceneManagerを使用して新しいシーンを読み込むと、ユーザーが向いている方向がリセットされ、新しい前方になります。たとえば、ユーザーの後ろに終了ボタンがあります。彼らがそれを見ると、新しいシーンがロードされますが、新しい "前方"がそれらの背後にあり、彼らの体が再び前方を向くように完全に回り込む必要があります。

私はオンラインを見て、この記事hereに出くわしたが、これは、それは私がユニティ5(私が使用しているバージョン)の手順を繰り返してきたRecenter()device.Reset()

をコメントアウトについて語っユニティ4にあったが、これは持っています無効。 Unity 5のGoogle Cardboardスクリプトでもdevice.Reset()のコードが表示されません。

再生モードで現在のシーンから新しいシーンを読み込むと、同じ向きに向けることができますか?

ありがとうございます!

+0

私の解決策を試しましたか?それは動作しましたか? – Programmer

+0

@Programmerはちょうどあなたの答えを見た、私に時間を与え、私はそれを試してみましょう! – Tom

答えて

1

単に終了時にすべてのカメラの位置と回転値を格納します。それらをStart関数にロードします。私は1年前に似たようなことをして、スクリプトを共有します。シーン内のGameObjectに添付してください。各スロットにカメラを設置してください。カメラを動かしてシーンを終了します。次に再生するすべてのカメラの位置を保持する必要があります。

機能が停止した場合は、reset()ファンクションONCEを呼び出して保存したデータをリセットし、コメントアウトしてください。それは私に起こったことがない仕事をやめるときにだけ呼び出されるべきです。

#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 
} 
+0

これはUnityエディタで再生しても機能しますか?私はあなたの踏み台に従ってきましたが、私は再集中し続けています – Tom

+0

@Tomはい。エディタでも動作するはずです。動作しない場合は、Start関数からresetを呼び出して呼び出します。一度それをコメントしてください。もう一回やってみよう。それが失敗した場合、Googleは新しいVRコードを大幅に変更しました。今日は非VRシーンで動作しましたが、私はそれをテストしました。私は今日起こっていることを見るために、今日遅く新しいVRシーンを作成しようとします。 – Programmer

+0

ええと、これは直面している方法を保存して再ロードしますが、終了して再生モードに入ったときに限ります - 私はシーン間で直面している方法を保存できるようにしたいです – Tom

0

Recenter()は、Google Cardboard SDKの代替品であるGoogleVR SDKの最新バージョンのクラスGvrViewerのメソッドです。

これにアクセスするには、シングルトンインスタンスGvrViewer.Instanceを使用します。 Cardboard SDKでは、Cardboard.SDK.Recenter()を使用して同じタスクを実行できます。

https://developers.google.com/vr/unity/reference/class/gvr-viewer#recenter

関連する問題