[RESOLU][DB-AL] NullReferenceException sur Scriptable Object

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
Xsephyre
Messages : 7
Inscription : 22 Avr 2020 15:00

[RESOLU][DB-AL] NullReferenceException sur Scriptable Object

Message par Xsephyre » 22 Avr 2020 16:25

Bonjour,

J'ai créer un scriptable object et je veux afficher certaines de ses données a l'écran. Je suis la vidéo explicative de Brackeys a ce sujet (https://www.youtube.com/watch?v=aPXvoWVabPY&t=300s).
Quand je lance le jeux les données s'affiches comme il faut sauf que j'ai l'erreur NullReferenceException qui apparaît et je ne peux rien faire dans le jeux.

Voici les scripts ainsi que les inspectors :

Image


Image

Le message d'erreur :

NullReferenceException: Object reference not set to an instance of an object
BatimentDisplay.Start () (at Assets/Script/gestion/BatimentDisplay.cs:25)

J'ai un peux de mal a comprendre :/ ce message s'affiche car pour Unity je n'ai pas de valeur dans mes variables.
Sauf que si j'avais tout fait dans C# par exemple pour le nom du batiment
Dans le ScriptableObject, public string nomBatiment = "Ferme Agricole";
Du coup quand je vais dans le script du BatimentDisplay et que je dit batimentName.text = batiment.nomBatiment;
c'est comme si je revenait a dire batimentName.text = "Ferme Agricole"; non ?

Merci par avance pour vos réponses et votre attention :)

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

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par boubouk50 » 22 Avr 2020 19:11

Salut Xsephyre,

L'erreur est explicite: à la ligne 25 de ton script nommé BatimentDisplay.cs, il y a une référence nulle.
Donc l'une des variables de cette ligne vaut null.

Pour poster du code, utilise les balises code et pas des images stp. Les images ne peuvent être éditées et en plus tu nous as coupé les numéro de ligne...
"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

Xsephyre
Messages : 7
Inscription : 22 Avr 2020 15:00

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par Xsephyre » 22 Avr 2020 20:17

Désolé :/ , voici les codes :

Code : Tout sélectionner

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

public class BatimentDisplay : MonoBehaviour
{
    public Batiments batiment;

    public TextMeshProUGUI batimentName;
    public TextMeshProUGUI descritionBatiment;

    public TextMeshProUGUI boisDemander;
    public TextMeshProUGUI sousDemander;
    public TextMeshProUGUI foodDemander;

    public Image visuel;


    // Start is called before the first frame update
    void Start()
    {
        batimentName.text = batiment.nomBatiment;
        descritionBatiment.text = batiment.description;
        

        boisDemander.text = batiment.resourceEnBois.ToString();
        sousDemander.text = batiment.resourceEnSous.ToString();
        foodDemander.text = batiment.resourceEnFood.ToString();

    }
}

Code : Tout sélectionner

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

[CreateAssetMenu()]
public class Batiments : ScriptableObject
{
    public Sprite apparance;
    public string nomBatiment;
    public string description;
    public string typeBatiment;
    public float bonus;

    public int resourceEnBois;
    public int resourceEnFood;
    public int resourceEnSous;

    public int tempsConstruction;
    public bool construit;

}

J'ai bien compris qu'il y a une variable qui est considéré comme null, ce que je ne comprend pas c'est pourquoi.
Est-ce que c'est le fait que j'utilise un TextMeshPro et qu'il a besoin que je lui assigne une valeur ? Dans ce cas que faut-il que je fasse ? Je n'ai trouver que des informations sur son utilisation dans Unity ou alors c'est du code pour changer sa typo ou sa couleur, ce qui dans le cas présent ne m'est pas utile.

L'autre piste a laquelle je pense c'est que les valeurs se trouvent dans Unity. Je m'explique, quand on créer un textMesh dans Unity il a des valeurs 'string' incorporer de base, le "New Text". Dans ce cas qu'est-ce qui permettrait de faire le pond entre ces valeurs 'string' dans Unity et le code ?

La dernière possibilité c'est que mes lacunes m’empêches de trouver la solution, surement enfantine :/

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

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par boubouk50 » 22 Avr 2020 21:01

L'erreur est bien à cette ligne?

Code : Tout sélectionner

batimentName.text = batiment.nomBatiment;
Pour avoir cette erreur, soit batimentName est null soit batiment.

De ce que je vois sur ton premier message, batimentName est bien renseigné (avec NBatimentText) et batiment aussi (avec Ferme). Il ne devrait donc pas y avoir d'erreur.

Il nous reste donc d'autres possibilités, soit ce script est affecté ailleurs et ces champs ne sont pas renseignés, soit une de ces deux variables est rendue nulle ailleurs (dans ce code ou un autre).

Pour tester cela, utilise Debug.Log () pour afficher en console les valeurs de tes variables incriminées.
"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

Xsephyre
Messages : 7
Inscription : 22 Avr 2020 15:00

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par Xsephyre » 22 Avr 2020 22:55

L'erreur est bien a cette ligne, par contre fait étonnant, après avoir mis des Debug.Log la ligne sur laquelle l'erreur se produit reste inchangée. Ça voudrait dire que le problème viendrait de mes déclarations de variables ?

j'ai suivit ton conseil et mis des Debug.Log partout ^^

Code : Tout sélectionner

Debug.Log("batimentName.text est : " + batimentName.text + " et batiment.nomBatiment est : " + batiment.nomBatiment);
        Debug.Log("batimentName est : " + batimentName + " et batiment est : " + batiment);
        batimentName.text = batiment.nomBatiment;
        Debug.Log("batimentName.text est : " + batimentName.text + " et batiment.nomBatiment est : " + batiment.nomBatiment);
        Debug.Log("batimentName est : " + batimentName + " et batiment est : " + batiment);

        Debug.Log(descritionBatiment.text + " " + batiment.description);
        descritionBatiment.text = batiment.description;
        Debug.Log(descritionBatiment.text + " " + batiment.description);

        Debug.Log(boisDemander.text + " " + batiment.resourceEnBois);
        Debug.Log(sousDemander.text + " " + batiment.resourceEnSous);
        Debug.Log(foodDemander.text + " " + batiment.resourceEnFood);
        boisDemander.text = batiment.resourceEnBois.ToString();
        sousDemander.text = batiment.resourceEnSous.ToString();
        foodDemander.text = batiment.resourceEnFood.ToString();
        Debug.Log(boisDemander.text + " " + batiment.resourceEnBois);
        Debug.Log(sousDemander.text + " " + batiment.resourceEnSous);
        Debug.Log(foodDemander.text + " " + batiment.resourceEnFood);
J'ai vérifier pour chaque objet s'il avait bien une valeur avant et après les changements sur la variable et elles avaient toutes les valeurs attendues avant/après.
Veux-tu une capture d’écran de la Console ?

J'avais fait attention que ces deux scripts ne soient pas appeler dans d'autres et qu'a part l'aspect purement visuel sur Unity (texte et image) ils n’interagisses pas avec d'autres scripts via Unity.
Est-ce que le problème pourrait venir d'Unity du coup ?

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par jmhoubre » 22 Avr 2020 23:13

Bonsoir,
j'ai relu ta présentation.
Tu as quelle expérience en programmation et en C# ? Il me semble que s'attaquer d'emblée à des Scriptable Objects si tu n'as rien fait avant, risque de te décourager plus qu'autre chose.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par Max » 23 Avr 2020 09:09

Salut,

Perso je ne vois pas non plus ce qui peut clocher. Au vu des éléments que tu donnes, il n'y a pas de raison effectivement.
J'ai fait un copié/collé de tes codes, et essayé sans rencontrer de soucis. Donc...
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par boubouk50 » 23 Avr 2020 09:25

Non, ça veut dire que l'erreur a été déplacée dans le Debug.Log () parce que tu utilises les mêmes variables qui font planter.
Pense à nous donner les infos des erreurs à chaque fois.
Aussi, vu que l'erreur est dans une des deux variables, tu ne peux accéder à ses propriétés donc tes Debug.Log sont inutiles.
Le premier debug devrait-être:

Code : Tout sélectionner

Debug.Log("batimentName : " + batimentName + " et batiment : " + batiment);
Ainsi, en console, tu devrais avoir l'un des deux écrit comme null et donc savoir quelle variable est incriminée.

@Max, oui le code semble juste, c'est pour cela que je pense à une mauvaise affectation des données publiques. Et vu qu'il les a remplies, ce devrait être un problème de duplication de ce component ailleurs avec des variables non affectées.
"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

Xsephyre
Messages : 7
Inscription : 22 Avr 2020 15:00

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par Xsephyre » 23 Avr 2020 13:38

Bonjour

jmhoudre : J'ai surtout une expérience théorique, j'ai beaucoup vue, lut et écouter mais pas vraiment pratiquer. Avec ce projet je tente de remédier à ça :)

boubouk50: Désolé, comme le message d'erreur n'avait strictement pas changer, je n'avait pas penser nécessaire de le retransmettre.

Du coup voici les messages affichés dans la console :
NullReferenceException: Object reference not set to an instance of an object
BatimentDisplay.Start () (at Assets/Script/gestion/BatimentDisplay.cs:25)

batimentName.text est : NomBatiment et batiment.nomBatiment est : Ferme Agricole
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:25)

batimentName est : NBatimentText (TMP) (TMPro.TextMeshProUGUI) et batiment est : Ferme (Batiments)
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:26)

batimentName.text est : Ferme Agricole et batiment.nomBatiment est : Ferme Agricole
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:28)

batimentName est : NBatimentText (TMP) (TMPro.TextMeshProUGUI) et batiment est : Ferme (Batiments)
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:29)

description, description, Joli petite bicoque qui boustera vos recoltes
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:31)

Joli petite bicoque qui boustera vos recoltes Joli petite bicoque qui boustera vos recoltes
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:33)

000 5
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:35)

000 0
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:36)

000 10
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:37)

5 5
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:41)

0 0
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:42)

10 10
UnityEngine.Debug:Log(Object)
BatimentDisplay:Start() (at Assets/Script/gestion/BatimentDisplay.cs:43)
Et le code correspondant :

Code : Tout sélectionner

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

public class BatimentDisplay : MonoBehaviour
{
    public Batiments batiment;

    public TextMeshProUGUI batimentName;
    public TextMeshProUGUI descritionBatiment;

    public TextMeshProUGUI boisDemander;
    public TextMeshProUGUI sousDemander;
    public TextMeshProUGUI foodDemander;

    public Image visuel;


    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("batimentName.text est : " + batimentName.text + " et batiment.nomBatiment est : " + batiment.nomBatiment);
        Debug.Log("batimentName est : " + batimentName + " et batiment est : " + batiment);
        batimentName.text = batiment.nomBatiment;
        Debug.Log("batimentName.text est : " + batimentName.text + " et batiment.nomBatiment est : " + batiment.nomBatiment);
        Debug.Log("batimentName est : " + batimentName + " et batiment est : " + batiment);

        Debug.Log(descritionBatiment.text + " " + batiment.description);
        descritionBatiment.text = batiment.description;
        Debug.Log(descritionBatiment.text + " " + batiment.description);

        Debug.Log(boisDemander.text + " " + batiment.resourceEnBois);
        Debug.Log(sousDemander.text + " " + batiment.resourceEnSous);
        Debug.Log(foodDemander.text + " " + batiment.resourceEnFood);
        boisDemander.text = batiment.resourceEnBois.ToString();
        sousDemander.text = batiment.resourceEnSous.ToString();
        foodDemander.text = batiment.resourceEnFood.ToString();
        Debug.Log(boisDemander.text + " " + batiment.resourceEnBois);
        Debug.Log(sousDemander.text + " " + batiment.resourceEnSous);
        Debug.Log(foodDemander.text + " " + batiment.resourceEnFood);

    }
}
De ce que je vois aucune de mes variables n'a de valeur null.
J'ai vérifier que je n'avait pas au moins deux fois le script du bâtiment Display dans ma scène, ce n'est pas le cas et je n'ai créer qu'un seul scriptableObject Batiment, c'est la Ferme.

Par contre j'ai fait un autre scriptableObject Ressource cette fois mais je ne l'appel nulle part que ce soit dans mes scripts ou dans la hierarchy d'Unity. Il devrait pas poser de problème et entre en conflit normalement.

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

Re: [DB-AL] NullReferenceException sur Scriptable Object

Message par boubouk50 » 23 Avr 2020 13:59

Lorsqu'une erreur apparaît, le jeu s'arrête, or ici on voit bien que non. Ce n'est pas normal qu'on est encore des Debug.Log () qui apparaissent. Cette erreur est bien toujours en cours?? Je veux dire, que ce n'est pas juste l'erreur qui traîne en console??

Sinon, vu que toutes les variables sont belles et bien définies (d'après les logs) cela ne laisse plus aucun doute: Ton script est dupliqué! Une autre instance de ce script est présent mais n'est pas renseignée.
Donc tu vas le chercher, le trouver et le supprimer. Pour ce faire, tu fais clic droit sur le script (dans l'onglet project) et tu lances Find References in scene. Seules les références deviendront affichées dans la scène ce qui te permettra de trouver le gameObject incriminé.
"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

Répondre

Revenir vers « (C#) CSharp »