modifier la variable publique d'un script depuis un autre script

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Xann_71
Messages : 93
Inscription : 23 Juin 2015 22:25
Localisation : Le puy en velay

modifier la variable publique d'un script depuis un autre script

Message par Xann_71 » 10 Fév 2022 12:40

Bonjour.
Je vais commencer par exposer mon objectif car peut être aurez vous une meilleure solution que la mienne.
En suivant un cours sur unity, on me propose de créer un système de récolte de pièces. Le cours propose de créer 2 scripts. le premier: collisionPieces, va gérer la récupération de la pièce au contact du joueur (jouer un son + supprimer le gameObject). Le second: decompteScript, dois gérer l'affichage, dans l'IU, du nombre de pièce récoltées. Avec le recul je me dis que je dois pouvoir tout faire dans un seul script ce qui résoudra mon problème. Mais dans le but d'acquérir des compétences qui pourront m'être utile dans d'autres cas, je vais quand même poser ma question.

Jusque là, le sujet est plutôt simple mais dans le cours, la solution proposée pour actualiser L'IU est d'utiliser la fonction update du script decompteScript pour récupérer la valeur de la variable nbPieces du script collisonPieces (qui indique le nombre de pièces récupérées). Ce qui veut dire qu'à chaque frame (en principe 60 fois par seconde du coup), on va récupérer la valeur d'une variable pour la remplacer dans l'IU. Je préférais donc n'effectuer cette action que lorsque je récolte une pièce donc dans la fonction OntriggerEnter() de collisionPiece qui gère déjà le reste du contact avec le joueur. Je crée donc une fonction public static countNbPieces() dans decomptePieces que j'appel dans collisonPiece. cette fonction doit incrémenter la variable nbrePieces (pour dire que l'on vient d'en ramasser une) puis fait appel à la fonction afficherNbPieces() qui elle s'occupe d'actualiser l'IU.
Mais comme countPieces() est statique, afficherNbPieces() doit être statique aussi pour pouvoir l'appeler dans countPieces() et les variables que ces 2 fonctions traitent doivent également être passées en statique. Et c'est là qu'arrive mon problème:

J'utilise une variable publique txtNbPieces de type text qui me permet, depuis unity de lier mon objet texte qui affiche le nombre de pièces récoltées. Cette variable me permet donc d'actualiser l'IU mais si je veux l'utiliser dans le script afficherNbPieces(), il faut aussi que je la passe en statique sinon j'ai une erreur de compilation. Et en passant cette variable en statique, son lien avec le texte de l'IU est détruit et je ne peux donc pas afficher mon nombre de pièces.

Existe t il un moyen de traiter une variable publique ou privée d'un script depuis un autre script? Je parvenais à le faire il y'a quelques années mais je codais alors en javascript et en retrouvant mes scripts, j'ai constaté que je n'avais pas besoin de déclarer les variables ni les fonctions en tant que statiques, les fonctions appelées depuis un autre script (déclarées juste en function countNbPieces() ) ne créaient pas d'erreur de compilation et pouvaient traiter les variables publiques et privées.

Pour mes script, comme dit plus haut, je vais faire un sorte de tout inclure dans le script collisionPieces ce qui devrait me permettre de résoudre mon soucis mais si quelqu'un sait comment travailler sur les fonctions et variables privées et publiques d'un script depuis un autre script, je serais intéressé par la solution.
Merci d'avance.

megablast2
Messages : 152
Inscription : 15 Août 2013 16:47

Re: modifier la variable publique d'un script depuis un autre script

Message par megablast2 » 10 Fév 2022 17:15

Bonjour, je n'ai peut être pas tout comprit, mais pourquoi ne fait tu pas un event au moment ou tu récupère une pièce? Apres libre a chaque classe de s'y inscrire et de modifier ce qui doit l'être dans le domaine qui la concerne. Apres est ce que c'est pertinent si tu ramasse d'un seul coup des millions de pièce, ça je ne sais pas, c'est un truc dans les evnents qu'il faut que je teste.

Xann_71
Messages : 93
Inscription : 23 Juin 2015 22:25
Localisation : Le puy en velay

Re: modifier la variable publique d'un script depuis un autre script

Message par Xann_71 » 10 Fév 2022 17:25

Merci pour la réponse. Dans le cas de mon cours, il s'agit de ramasser des pièces une par une comme dans les jeux mario. Je vais jeter un oeil aux event pour voir si je peux trouver mon bonheur.
Encore merci pour cette réponse.

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

Re: modifier la variable publique d'un script depuis un autre script

Message par jmhoubre » 11 Fév 2022 02:28

Ta solution avec OnTrigger est viable. Dans le script du joueur, tu références le champ texte de ton UI, champ que tu mets à jour depuis OnTrigger.

Xann_71
Messages : 93
Inscription : 23 Juin 2015 22:25
Localisation : Le puy en velay

Re: modifier la variable publique d'un script depuis un autre script

Message par Xann_71 » 11 Fév 2022 20:37

Merci pour ta réponse, effectivement, en restant dans l'idée du cours, je n'ai pas pensé à tout simplement passer le script sur le personnage. En faisant comme ça, je n'ai plus qu'un seul script et le problème ne se pose plus. merci beaucoup.

Si toute fois, quelqu'un sait comment interagir sur un variable publique ou privée d'un script depuis un autre script, je suis preneur.

Pour donner l'idée de ce que je recherche, j'avais travaillé sur un projet (similaire a mario kart au niveau du game play) il y'a quelques années, en javascript, dans lequel j'avais utilisé plusieurs fois ce système:

script1: canon.js (ce script permettait de gérer les projectiles que le canon allait tirer selon si il restait des munitions ou non)
je déclare donc une variable privée en l'initialisant à false:

Code : Tout sélectionner

private var TirOk: boolean = false;	// Variable autorisant ou non le tire;
puis j'ai une fonction qui va autoriser le tir lorsque l'on y fera appel:

Code : Tout sélectionner

function ActiveTir()
{
	TirOk = true;
}
script2: gsnBonusActif (script qui gérait les projectiles que le joueur avait ramassé):
Dans ce script, lorsque le joueur récoltait des munitions au sol, on ajoutait les munitions à son stock et on autorisait le tir en faisant appel à la fonction ActiveTir() du premier script:

Code : Tout sélectionner

function ActiveCanons()
{
	
	Canon.GetComponent.<Canon>().ActiveTir();
	CanonAR.GetComponent.<Canon>().ActiveTir();
}
Avec ces exemples, on voit que je pouvais à l'époque, en javascript, travailler les variables privées et publique d'un script via une fonction interne que l'on pouvait ensuite appeler depuis un autre script.

Mais aujourd'hui, lorsque j'essaye de faire ça en C#, ca fonctionne si je déclare les fonctions appelées, ainsi les variables que l'on utilise dedans, en statique. Mais encore une fois, dans la plupart des cas, ce n'est pas gênant mais si je dois utiliser une variable publique (pour pouvoir lui lier un prefab, un son, une image, ... dans unity), en laissant la variable en publique, je peux lier l'élément mais je ne peux pas utiliser la variable dans la fonction statique et si je passe la variable en statique elle perd son "atout" publique et je ne peux donc plus lui lier un élément depuis unity.

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

Re: modifier la variable publique d'un script depuis un autre script

Message par jmhoubre » 12 Fév 2022 12:58

Bonjour,
je ne connais pas trop java...

Pour accéder à une variable privée depuis un autre script :
* pas possible directement
* le plus simple est de créer une fonction publique qui retourne la valeur de la variable privée

Code : Tout sélectionner

private int exemple;
public int GetExemple => exemple;
Pour accéder à une variable publique Test du script A depuis un autre script B :
* rendre Test statique, et y accéder par la classe ;

Code : Tout sélectionner

public class A
{
    public static int test;
}

public class B
{
    private void GetTest ()
    {
        A.test++;
    }
}
* dans B, référencer A, accéder à Test par cette référence.

Code : Tout sélectionner

public class A
{
    public int test;
}

public class B
{
    public A classA = new A();
    private void GetTest ()
    {
        classA.test++;
    }
}
* faire de la classe A un singleton.

Code : Tout sélectionner

using UnityEngine;
public class A
{
    public static A instance;

    private void Awake ()
	{
        if (instance == null)
		{
            instance = this;
		}
	}

    public int test;
}

public class B
{
    private void GetTest ()
    {
        A.instance.test++;
    }
}
Et d'autres, moins évidentes.

Xann_71
Messages : 93
Inscription : 23 Juin 2015 22:25
Localisation : Le puy en velay

Re: modifier la variable publique d'un script depuis un autre script

Message par Xann_71 » 14 Fév 2022 18:27

Merci pour ta réponse. Pour la déclaration en variable static, je l'avais testé mais comme je l'expliquais plus haut, j'avais un problème à ce niveau, la variable étant statique, je ne pouvais plus lui assigner un élément depuis unity (dans mon cas il s'agissait d'y faire glisser un panel pour accéder et modifier la valeur de son texte).
En revanche, la solution de référencer la class A dans la class B pourrait fonctionner j'imagine. Je vais tester ça à la fin de mon chapitre et confirmer (ou pas :'( ) que j'ai pu faire ce à quoi je pensais.
Encore merci pour tes réponses.

Répondre

Revenir vers « Scripting »