Instruction SetActive

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous, tout d'abord désolé si je poste pas au bon endroit mais je pense que c'est ce qui correspond le mieux, vous pouvez déplacer si c'est pas le cas.

Alors voila je réalise un petit jeu de plateforme 2D avec Unity, et je suis confronté à deux problèmes, dont un que je peux contourner mais que j'aimerai bien comprendre l'origine.

J'ai un système de récolte de petites pièces, dans un script Coin.cs, et un script Door.cs dont voici le code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class Door : MonoBehaviour 
{

    void Start () {

        //door.gameObject.SetActive (false);
                // ça marche pas non plus ça, alors j'ai désactivé manuellement dans Unity

    }

    void Update () 
    {
        if (Global.score == 10)
        {
            GameObject.FindGameObjectWithTag ("Door").SetActive (true);
            GameObject.Find("door").SetActive (true);
            //door.gameObject.SetActive(true);
        }
    }
}

Dans mon Gold.cs j'ai ma variable score que j'incrémente, et je demande à ce que "quand j'ai ramassé toutes mes pièces", l'objet door que j'avais désactivé par défaut s'active. et pour cela j'ai mis deux instructions, vu que la première ne marchait pas, qui sont

1
2
GameObject.FindGameObjectWithTag ("Door").SetActive (true);
GameObject.Find("door").SetActive (true);

Pour tenter d'activer l'objet door, ou l'objet qui portait le tag Door (qui est ma porte dans les deux cas). Et dans les deux cas, on m'affiche une erreur : NullReferenceException : Object reference not set to an instance of an object.

Alors j'ai aussi tenté de faire comme mes pièces, c'est à dire dans une fonction comme celle-ci :

1
2
3
4
5
6
7
8
9
    void OnTriggerEnter2D(Collider2D obj) {
        switch (obj.tag) {
            case "Coin":
                Global.score++;
                Destroy(obj.gameObject);
                break;
        }
    }
}

Ce qui donnerait selon mes essais ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
OnTriggerEnter2D(Collider2D door); 
{
     if (Global.score == 10 /*&& door.gameObject.tag == "door"*/) 
     {
    switch (obj.tag) 
        {
    case "Door":
        ;
        door.gameObject.SetActive (true);
        break;
        }
     }
}

Sauf que là il me dit que la fonction existe déjà, celle des pièces :( Du coup j'ai du loupé quelque chose de "simple" mais je ne vois pas quoi, j'ai du m'embrouiller alors j'aimerai savoir ou ^^

Et second problème (plus court), dans mon script PlayerController je fais avancer mon personnage a gauche ou a droite selon si on appuie sur a ou d. J'essaye donc dans ma scène numéro deux d'utiliser le prefab player, avec le même script, et je me suis dit que ça ferait pareil. Sauf que quand je lance le jeu, le player "pivote" a 180 degrés aucun soucis, sauf qu'il se déplace pas et qu'il saute pas. Et je vois pas pourquoi non plus ?

Alors si quelqu'un a le temps de lire et de m'aider, ce serait gentil :)

Merci d'avance.

+0 -1

Salut,

Pour ton premier problème avec la référence null. L'erreur dit simplement que GameObject.FindGameObjectWithTag ("Door") ne renvoie rien et tu essais de l'utiliser. Si ton objet se nomme bien Door, essais de vérifier qu'il existe bien :

1
2
3
4
5
GameObject test = GameObject.FindGameObjectWithTag("Door")`;
if (test == null)
{
    Debug.Log("Il y a un problème.");
}

Effectivement il y a un problème, donc ça c'est résolu, avec ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    void OnTriggerEnter2D(Collider2D obj) 
    {

        if (Global.score == 10) 
        {
            switch (obj.tag) 
            {
                case "Door":
                    Application.LoadLevel(2);
                    break;
            }
        }
    }

Impeccable ça fonctionne, merci :D 1/2 de résolu ^^

EDIT : résoudre ce problème à résolu l'autre, il suffit de charger le level pour que le script fonctionne :s Post résolu.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte