[RÉSOLU] [DB-AL] Modifier la variable d'un script instancié en jeu à l'aide d'un autre script.

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
Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

[RÉSOLU] [DB-AL] Modifier la variable d'un script instancié en jeu à l'aide d'un autre script.

Message par Beogus » 29 Mars 2021 19:04

Bonjour, j'ai lu différents sujets à propos de la modification de la variable d'un script via un autre script mais je pense que mon problème est un peu différent donc je me suis permis d'en créer un nouveau (navré si je me suis trompé).

Alors voila, mon but final est d'arroser une petite parcelle de terre à l'aide d'un arrosoir.
le problème, c'est que cette parcelle est crée directement en jeu (via une pelle) et on peut en créer autant que l'on veut.

je bloque donc sur la modification d'une variable boolean (qui change la texture de la terre lorsqu'elle passe à true et inversement)

j'utilise donc deux script, un sur l'arrosoir et l'autre sur ma parcelle de terre (donc chacun sur un gameObject différent).

donc, au début je pensais simplement faire :

Code : Tout sélectionner

public class PlanteControler : MonoBehaviour
    {
         public bool water = false;
         
    }
(je n'affiche que du Boolean parce que les autres fonctions fonctionnent parfaitement lorsque j'active se boolean manuellement)

et dans l'autre script

Code : Tout sélectionner

public class ArmAnimations : MonoBehaviour
    {
        public PlanteControler test;
        
	public void Event_Arroser()
        {
            RaycastHit hit = Inventory.instance.player.fpsCamera.RaycastHit();

            if (hit.collider && hit.collider.sharedMaterial
                && (hit.collider.GetComponent<Interact>()
                && hit.collider.GetComponent<Interact>().canHitObject))
            {
                Debug.Log("il y a un collider");
                test.water = true;
            }
            else
            {
                Debug.Log("il n'y a pas de collider");
            }
  }
(ici encore je n'affiche que ce qui semble poser problème, dites moi si vous souhaitez en voir plus du script en question) j'active cette fonction via un event ajouté sur l'animation de mon objet)

du coups, le debug.log m'annonce qu'il détecte bien le collider de la parcelle, mais m'annonce ensuite qu'il manque une référence et me renvoi à la ligne "test.water = true;"

je me suis donc dit que c'est parce qu'il s'agit d'un objet instancié et qu'il fallait que je renseigne autre chose?



ps :j'ai également tenter avec la variante

Code : Tout sélectionner


private PlanteControler test;

private void Start()
        {
            test = GetComponent<PlanteControler>();
        }
Mais je pense que ça revient au même. et que le problème ne vient pas de là? je me dis donc qu'il faut utiliser une autre méthode ou que je référencie mal mon script?

Navré encore si la réponse vous semble simple, je ne suis pas vraiment expérimenté ^^'.
Dernière édition par Beogus le 30 Mars 2021 11:34, édité 1 fois.

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

Re: [DB-AL] Modifier la variable d'un script instancié en jeu à l'aide d'un autre script.

Message par boubouk50 » 29 Mars 2021 19:20

Salut,

NullReference est la plus classique des erreurs. Elle dit simplement que tu essaies d'accéder à quelque chose au sein d'une variable alors que celle-ci n'existe pas. Tu ne peux donc pas y accéder puisqu'il n'y a rien -> Erreur.

Ici, tu essaies d'accéder à la variable water de test, mais test vaut null et ça plante.
Donc, le problème est: pourquoi test vaut null?

S'agissant d'une variable publique, je suppose qu'elle doit être affectée depuis l'inspecteur.
Si tu l'as renseigné et que test vaut null, alors quelque chose rend test null. Soit c'est dans le code que tu n'as pas mis ici, soit ton objet est détruit à un moment avant d'y accéder.
"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

Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

Re: [DB-AL] Modifier la variable d'un script instancié en jeu à l'aide d'un autre script.

Message par Beogus » 29 Mars 2021 19:44

Merci pour ta réponse, alors, autant pour moi, au niveau du null référence, j'ai régler le problème, (j'avais en effet affécté la variable mais sans Overrides --' donc a chaque fois que je lancer le jeu , le clone de l'arrosoir ne la renseignait plus (erreur de débutant, en effet).

Cela dit, même une fois la variable bien référencé, je n'ai plus d'erreur mais le boolean n'est pas modifié. (j'ai ajouté un autre debug.log en dessous de la ligne de code "test.water = true;" et il est bien lu.

je me dis que c'est peut être parce dans l'état actuel des choses, il lui est impossible de détecter le script lié à la parcelle précise que je souhaite modifier? étant donné que je peux en créer plusieurs identique, je me dis qu'actuellement, rien ne peut lui permettre de savoir à quelle parcelle je fais allusion? peut être qu'il modifie le script d'origine (donc non instancié) et pas celui de la parcelle avec lequel j'interagie via mon raycast?

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

Re: [DB-AL] Modifier la variable d'un script instancié en jeu à l'aide d'un autre script.

Message par boubouk50 » 29 Mars 2021 20:46

Vu que je n'ai pas tout ton code, il m'est impossible de te donner la réponse exacte, mais je peux néanmoins te donner des pistes.
Ici, seul le booléen water du Component PlanteControler test est modifié. Aucun autre. Donc celui que tu as affecté depuis l'inspecteur.
Maintenant, qu'est ce que cela implique:
- Si test n'est pas dans la scène (ex: prefab), je ne peux pas affirmer le comportement, mais je pense que l'affectation ne fonctionne pas mais ne génère pas d'erreur.
- Si test est dans la scène, alors son booléen est modifié et c'est autre chose le problème (Je n'ai pas tout le code).

A aucun moment, tu ne changes test, donc tu as beau cliquer sur n'importe quoi, si la condition le permet, ce sera toujours le component test qui sera modifié.
Si tu veux celui du hit, il te faut récupérer le component PlanteControler du hit.

Ensuite, comment fais-tu pour que la modification de water soit perçue?
Tu peux appeler une fonction publique pour le faire au lieu de la variable, ou encore utiliser un accesseur qui appelle une fonction ou déclenche une action lors de l'affectation de water.
https://docs.microsoft.com/fr-fr/dotnet ... properties
"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

Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

Re: [DB-AL] Modifier la variable d'un script instancié en jeu à l'aide d'un autre script.

Message par Beogus » 30 Mars 2021 10:46

Merci beaucoup pour ton aide, j'ai réglé le problème.

il est vrai qu'avec une ref de l'item ça passe beaucoup mieux. voila ce que j'ai fait.


J'ai placer 3 script sur mon gameobject "parcelle de terre"
-un qui permet de récupérer le scriptable item lié au gameobject (donc la ref item)
-un qui permet de modifier les propriétés du gameobject en fonction de diverses variables.
- et un qui permet de modifier les variable du second script en fonction du nom de l'item, de son type ou des ses attribues et qui stock la référence de l'item que je tiens en main afin de savoir si il peut interagir ou non avec la parcelle de terre(que j'utiliserais sans doute également pour d'autres ressources dans le jeu, pour miner ou couper du bois par exemple en ajoutant d'autres conditions ).



et j'ai le script sur l'arrosoir qui me permet de lancer certaines fonctions lorsque mon animation touche le collider. (faire diminuer la quantité d'eau qu'il y a dedans entre autre (que j'utiliserais sans doute également pour les autres outils afin de réduire leurs durabilité à chaque coups donné et finir par les casser).

Mon problème est donc résolu, merci encore et bonne journée.

Répondre

Revenir vers « (C#) CSharp »