[RESOLU] NullReferenceException

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Carfaure
Messages : 6
Inscription : 04 Juin 2018 18:33

[RESOLU] NullReferenceException

Message par Carfaure » 04 Juin 2018 18:56

Bonjour,
je suis un débutant qui est bloqué par ce script :(

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class test : MonoBehaviour
{
    public parcoursballe boolball;
    [TagSelector]
    public string TagFin = "<NoTag>";
    Vector3 positionDepart;
    private Rigidbody rb;
    public GameObject TrucAEnable = new GameObject { };
    public GameObject TrucAdeenable = new GameObject { };
    public MonoBehaviour Script;


    void Start()
    {
        positionDepart = transform.position;
    }




    void OnTriggerEnter(Collider truc)
    {
        if (truc.tag == TagFin)
        {
            Debug.Log("le truc est normalement activé");
            TrucAEnable.SetActive(true);
            TrucAdeenable.SetActive(false);
            transform.position = positionDepart;
            boolball.spherefinit = true;
            rb.constraints = RigidbodyConstraints.FreezePosition;
            

            if (!Script.enabled)
            {
                Script.enabled = false;
                Debug.Log("le script est normalement desactivé");
            }

        }
    }
}
Le 1er débug.log s'active bien alors que le 2eme non, de plus les objets que je veux (des)activer ne changent pas. :gene:
si quelqu'un pouvait m'aider cela m'arrangerait :-D
Merci d'avance

Avatar de l’utilisateur
Scozor
Messages : 46
Inscription : 17 Oct 2014 12:56
Contact :

Re: Je suis bloqué sur un script

Message par Scozor » 04 Juin 2018 21:52

Dans ta condition tu vérifies si ton Script.enabled est désactivé, si oui tu l'as désactive. Ce qui n'est pas logique, il faut vérifier si ton Script est activé, si oui tu peux le désactiver.

Change ta condition en :
if(Script.enabled)

Carfaure
Messages : 6
Inscription : 04 Juin 2018 18:33

Re: Je suis bloqué sur un script

Message par Carfaure » 05 Juin 2018 20:49

Je vous remercie de votre réponse logique (mb j'ai mal relu :triste1: ) malheureusement le script ne se désactive toujours pas et l'objet ne s'active pas et ne se desactive pas non plus. Il y a d'ailleur un truc bizarre : j'ai refait un test en changeant un peu le script :

Code : Tout sélectionner

void Start()
    {
        positionDepart = transform.position;
    }


    void OnTriggerEnter(Collider truc)
    {
        if (truc.tag == TagFin)
        {
            Debug.Log("le truc est normalement activé");
            TrucAEnable.SetActive(true);
            TrucAdeenable.SetActive(false);
            transform.position = positionDepart;
            boolball.spherefinit = true;
            rb.constraints = RigidbodyConstraints.FreezePosition;

            Debug.Log("le script est normalement desactivé");
            if (Script.enabled)
            {
                Script.enabled = false;
                Debug.Log("le script est normalement desactivé");
            }

        }
    }
or apres que mon objet ait été teleporté grâce à transform.position = positionDepart je ne vois que le premier message debug.log dons ma console comme si le script s'était arreté à l'étape boolball.spherefinit = true; car mon objet ne se freeze pas.
N'y a-t-il pas juste une erreur basique dans mon TrucAdeenable.SetActive ?
Merci d'avance pour la réponse :merci:

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: Je suis bloqué sur un script

Message par Autodidactelife » 06 Juin 2018 01:33

Bonjour ... La variable code n'est pas facultatif !

Déjà le Enable pour ma part je n'utilise surtout pas !

Code : Tout sélectionner

if (Script.activeInHierarchy) {
	Script.SetActive(false);
	Debug.Log("le script est normalement desactivé");
}
D'ailleurs en lisant mieux le code "boolball" on n'a aucune information dessus, faudrait peut être nous donner la classe "parcoursballe" car c'est sûr qu'il y à une erreur on utilise pas les variables comme ça des autres class!

Je pense plutôt à : "GetComponent<parcoursballe>().spherefinit = true;"
Si jamais la class est sur le même GameObject, sinon il faudra d'abord pointé celui-ci pour GetComponent.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Je suis bloqué sur un script

Message par boubouk50 » 06 Juin 2018 09:01

Si le script s'arrête sans raison, il est fort à parier qu'une erreur soit apparue, dans ce cas, elle est décrite dans l'onglet Console en rouge. Merci de nous les faire parvenir.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Carfaure
Messages : 6
Inscription : 04 Juin 2018 18:33

Re: Je suis bloqué sur un script

Message par Carfaure » 06 Juin 2018 12:42

boubouk50 a écrit :
06 Juin 2018 09:01
Si le script s'arrête sans raison, il est fort à parier qu'une erreur soit apparue, dans ce cas, elle est décrite dans l'onglet Console en rouge. Merci de nous les faire parvenir.
Effectivement il y a ca :
Internal_CreateGameObject is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour 'test' on game object 'Sphere'.
See "Script Serialization" page in the Unity Manual for further details.

ca :
UnityException: Internal_CreateGameObject is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour 'test' on game object 'Sphere'.
See "Script Serialization" page in the Unity Manual for further details.
UnityEngine.GameObject..ctor

et ça:
NullReferenceException: Object reference not set to an instance of an object
test.OnTriggerEnter (UnityEngine.Collider truc) (at Assets/test.cs:44)

En une partie j'ai reçu 3 fois ces messages d'erreurs avec des changement au niveau de la 2eme ligne " on game object 'Sphere'."qui n'apparait pas dans cerains cas.
J'étais allé sur le site recommandé mais je n'ai rien compris :triste1: puis ça m'est sorti de la tête.
Au niveau de mon Boolball je ne l'utilise pas dans mon autre script et, de plus j'ai testé le script sans et cela ne marchait toujours pas. Mon script a toujours l'air de s'arreter avant rb.constraints = RigidbodyConstraints.FreezePosition.
J'ai verifié en mettant des debug.log dans les boucles if (TrucAdeenable.activeInHierarchy) et je recevais bien les 4 premiers message.
Là je vous avoue que je ne comprends plus la logique d'unity. si cela vous interesse je vous met la derniere version avec les changements

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class test : MonoBehaviour
{
    [TagSelector]
    public string TagFin = "<NoTag>";
    Vector3 positionDepart;
    private Rigidbody rb;
    public GameObject TrucAEnable = new GameObject { };
    public GameObject TrucAdeenable = new GameObject { };
    public MonoBehaviour Script;


    void Start()
    {
        positionDepart = transform.position;
    }

    void OnTriggerEnter(Collider truc)
    {
        if (truc.tag == TagFin)
        {

            Debug.Log("le truc est normalement activé1");
            if (!TrucAEnable.activeInHierarchy)
            {
                TrucAEnable.SetActive(true);
                Debug.Log("lobjet est normalement activé2");
            }

            Debug.Log("lobjet est normalement desactivé1");
            if (TrucAdeenable.activeInHierarchy)
            {
                TrucAdeenable.SetActive(false);
                Debug.Log("lobjet est normalement desactivé2");
            }

            transform.position = positionDepart;
            
            rb.constraints = RigidbodyConstraints.FreezePosition;

            Debug.Log("le script est normalement desactivé1");
            if (Script.enabled)
            {
                Script.enabled = false;
                Debug.Log("le script est normalement desactivé2");
            }

        }
    }
}
Je m'en remet à vous :merci:
.
 ! Message de : Max
Utilisez les balises code SVP
Merci de lire la Netiquette.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Je suis bloqué sur un script

Message par boubouk50 » 06 Juin 2018 13:38

D'où tu sors ça?

Code : Tout sélectionner

new GameObject { };
Ensuite, NullReference Exception signifie qu'un objet à la ligne 44 n'est pas référencé donc est null et tu essaies d'y accéder. Donc ta ligne

Code : Tout sélectionner

rb.constraints = RigidbodyConstraints.FreezePosition;
rb ne doit donc pas être renseigné. Et effectivement, tu le déclares mais ne l'assigne jamais, donc il est null. S"il s'agit du Rigidbody du gameObject en cours, alors il faut l'assigner au Start ()

Code : Tout sélectionner

rb = GetComponent <Rigidbody>();
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Carfaure
Messages : 6
Inscription : 04 Juin 2018 18:33

Re: Je suis bloqué sur un script

Message par Carfaure » 06 Juin 2018 14:29

Un mb de plus pour moi... :-/ . Après l'avoir assigné, le code va jusqu'à "Debug.Log("le script est normalement desactivé2")" :cote: . Pour ce qui est de

Code : Tout sélectionner

 new GameObject { }; 
je l'ai misérablement copié collé d'un script qui marche que m'a passé une personne d'un atelier de programmation (Magik Maker). J'ai essayé de faire sans et je n'ai remarqué aucune différence.
Comme d'habitude la petite émoticone :merci:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Je suis bloqué sur un script

Message par boubouk50 » 06 Juin 2018 14:48

Et donc? Problème résolu?

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour //Préférer une Majuscule pour le nommage d'une classe
{
    [TagSelector]
    //Préférer des minuscules pour les noms de variables
    public string tagFin = "<NoTag>";
    Vector3 positionDepart;
    private Rigidbody rb;
    public GameObject trucAEnable;
    public GameObject trucAdeenable;
    public MonoBehaviour script;


    void Start()
    {
        positionDepart = transform.position;
        rb = GetComponent <Rigidbody> ();  //Ou bien assignation publique, je ne sais pas ce que tu souhaites
    }

    void OnTriggerEnter(Collider truc)
    {
        if (truc.tag.Equals (tagFin)) //Préférer la fonction de comparaison de la classe String
        {

            Debug.Log("le truc est normalement activé1");
	   //Dans tous les cas, il faut l'activer, pas besoin de le tester
                trucAEnable.SetActive(true);
                Debug.Log("lobjet est normalement activé2");


            Debug.Log("lobjet est normalement desactivé1");
            //Encore, pas besoin de tester, il faut le désactiver
                trucAdeenable.SetActive(false);
                Debug.Log("lobjet est normalement desactivé2");

            transform.position = positionDepart;
         
            rb.constraints = RigidbodyConstraints.FreezePosition;

            Debug.Log("le script est normalement desactivé1");
		//3e fois: désactiver
                script.enabled = false;
                Debug.Log("le script est normalement desactivé2");
        }
    }
}
Tu peux, s'ils ne sont plus utiles, supprimer les Debug.Log () qui sont gourmands.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Carfaure
Messages : 6
Inscription : 04 Juin 2018 18:33

Re: Je suis bloqué sur un script

Message par Carfaure » 06 Juin 2018 16:16

PROBLEME RESOLU
Je vous remercie, au final le problème n'était pas le script mais bien moi :hehe: J'avais laissé un objet avec un script qui faisait l'inverse que celui que vous m'avez aidé à creer. Il ne faisait que repeter la commande on trigger enter à l'infini et annulait mon script(et de un mb de plus ::d )Je vous remercie de votre aide et de votre patience pour un débutant comme moi
:merci: :merci: :merci: :merci: :merci: :merci:

Répondre

Revenir vers « (C#) CSharp »