2017-03-02 2 views
1

Je crée un projet à l'aide de Gear VR, dans lequel vous pouvez faire pivoter un objet et afficher des informations en fonction des commandes de balayage et de frappe sur le côté du casque.Unity3D - Gear VR L'entrée ne fonctionne pas entre les scènes

Tout fonctionne très bien, je peux tourner et sélectionner des choses quand j'utilise le pavé tactile sur le côté de la Gear VR, mais quand je change de scène et retourne au menu principal, puis revenir dans la scène j'étais juste , la fonctionnalité cesse de fonctionner.

J'utilise ce script, je l'ai fait:

using UnityEngine; 
using UnityEngine.SceneManagement; 
using System.Collections; 
using System; 

public class GearVRTouchpad : MonoBehaviour 
{ 
    public GameObject heart; 

    public float speed; 

    Rigidbody heartRb; 

    void Start() 
    { 
     OVRTouchpad.Create(); 
     OVRTouchpad.TouchHandler += Touchpad; 

     heartRb = heart.GetComponent<Rigidbody>(); 
    } 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.W)) 
     { 
      SceneManager.LoadScene("Main Menu"); 
     } 
    } 


    void Touchpad(object sender, EventArgs e) 
    { 
     var touches = (OVRTouchpad.TouchArgs)e; 

     switch (touches.TouchType) 
     { 
      case OVRTouchpad.TouchEvent.SingleTap:     
       // Do some stuff  
       break;  

      case OVRTouchpad.TouchEvent.Up: 
       // Do some stuff 
       break; 
       //etc for other directions 

     } 
    } 
} 

J'ai remarqué que quand je commence mon jeu, un OVRTouchpadHelper est créé. Je ne sais pas si cela a quelque chose à voir avec mon problème.

L'erreur que je reçois est:

MissingReferenceException: The object of type 'GearVRTouchpad' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

MAIS Je n'ai pas référencé ce script nulle part ailleurs.

Lorsque je vérifie ma scène en mode de lecture, le script est toujours là avec les assignations de variables encore présentes.

Toute aide serait géniale!

+0

Votre erreur ne se trouve pas dans la classe GearVRTouchpad, c'est dans la classe qui utilise GearVRTouchpad. Si vous pouviez fournir ceux qui lancent cette exception, ce serait bien. –

+0

Je pensais que cela pourrait être le cas, mais je n'ai pas utilisé ce script dans d'autres scripts ou fichiers? – Tom

Répondre

2

OVRTouchpad.TouchHandler est un static EventHandler (donc il va persister pendant la durée de vie du jeu). Votre script s'y abonne lorsqu'il est créé mais ne se désinscrit pas lorsqu'il est détruit. Lorsque vous rechargez la scène, l'ancien abonnement est toujours dans l'événement mais l'ancienne instance GearVRTouchpad a disparu. Cela se traduira par la MissingReferenceException la prochaine fois les feux d'événement TouchHandler. Ajoutez ceci à votre classe:

maintenant
void OnDestroy() { 
    OVRTouchpad.TouchHandler -= Touchpad; 
} 

, chaque fois qu'un GameObject avec le comportement GearVRTouchpad est détruit, l'événement static dans OVRTouchpad ne seront plus une référence.

+1

Brillant, fonctionne parfaitement. Merci! – Tom

+0

@Tom Heureux de vous aider! – Foggzie