2016-01-26 3 views
0

L'objet contient le composant de script.Unity3D: Incompatibilité des variables de script avec OnTriggerEnter2D

public class TeleportReference : MonoBehaviour { 
    private GameObject reference; 

    void Start() { 
     reference = null; 
    } 

    public void SetReference(GameObject other){ 
     reference = other; 
    } 

    public GameObject GetReference(){ 
     return reference; 
    } 

Maintenant, si je recherche d'un objet et tester les variables de script

GameObject test = GameObject.FindGameObjectWithTag("Water"); 
print(test); 
print(test.GetComponent<TeleportReference>()); 
print(test.GetComponent<TeleportReference>().GetReference()); 

cela fonctionne très bien et getReference() renvoient la variable I emmagasinés.

Mais maintenant, si je l'utilise whithin OnTriggerEnter2D

private void OnTriggerEnter2D(Collider2D other) 
{ 
    if (other.tag == "Water") 
    { 
     print(other); 
     print(other.gameObject); 
     print(other.GetComponent<TeleportReference>()); 
     print(other.GetComponent<TeleportReference>().GetReference()); 
    } 
} 

getReference() return null (ou une autre variable que je dû au démarrage() de la classe TeleportReference). Toutes les autres sorties de test restent les mêmes.

Est-ce que quelqu'un pourrait donner un indice pourquoi cela pourrait arriver? Cela signifie-t-il que GetComponent a créé une nouvelle instance de TeleportReference dans le second cas?

+0

Où est votre code OnTriggerEnter2D? il est attaché à l'objet avec l'étiquette "Eau"? c'est attaché à un objet différent de "Water"? –

+0

Lorsque des collisionneurs entrent l'un dans l'autre (et s'ils sont tous les deux déclencheurs), on appelle OnPiggerEnter2D sur chacun d'entre eux. Je vous suggère 'Debug.Log (other.gameObject.name);' pour s'assurer que seuls les objets voulus ont ce code appelé. J'espère que ça aide! – andeart

Répondre

0

a trouvé le problème. C'était dans l'ordre d'attribution des variables. C'est-à-dire que des changements ont été apportés avant que la fonction Start() ne soit appelée. Ainsi, à un certain point du code, la valeur stockée a été remise à zéro.

Cela fonctionne très bien:

public class TeleportReference : MonoBehaviour { 
    private GameObject reference; 

    void Awake() { 
     reference = null; 
    } 

    public void SetReference(GameObject other){ 
     reference = other; 
    } 

    public GameObject GetReference(){ 
     return reference; 
    } 

Merci à tous pour les commentaires, qui m'a vraiment aidé dans le débogage.

1

GetComponent n'a pas créé une nouvelle instance de TeleportReference dans le second cas. J'ai un code similaire dans l'un de mes projets et je n'ai eu aucun problème. Donc, dans ce cas, je chercherais à voir si le problème est ailleurs. Êtes-vous sûr que c'est le même objet "Eau"? Avez-vous plusieurs objets avec l'étiquette "Eau"? Êtes-vous en collision avant que la référence ne soit attribuée? Il pourrait y avoir une myriade de choses qui se passent. Juste tester pour l'affiner. Par exemple, essayez d'effectuer une action sur l'objet other.gameObject pour vérifier qu'il s'agit du bon objet, par exemple en le désactivant. Essayez aussi d'utiliser other.gameObject.GetComponent (je ne sais pas si cela fait une différence).

+0

Merci Paul, je l'ai testé dur. Dans ce cas, il n'y a qu'un seul objet "Eau". Et le premier test qui a bien fonctionné a été fait avant la collision. Je me bats car je ne vois pas ce qui pourrait mal se passer ici. – Alex