Accesso errato ad una variabile di un altra classe Unity, C#

di il
3 risposte

Accesso errato ad una variabile di un altra classe Unity, C#

Salve a tutti, 
è da un po' di tempo che sto lavorando ad un videogioco su piattaforma Unity in linguaggio c#. 
Dopo una valutazione su quale pattern utilizzare, ho optato per la classica ereditarietà, ma senza costruttori in quanto in Unity, da quel che ho visto in rete, non sembrano servire.
Una delle priorità è quella di poter accedere alle variabili da altre classi in modo da poterne prendere i valori e usarli per fare verifiche sul corretto funzionamento del codice. 
Ma proprio mentre lavoravo su questo, mi sono imbattuto in un bug davvero strano. 
Ogni volta che tento di accedere al nome del giocatore o altre variabili, mi esce in output un nome che non centra nulla con la classe e nel caso di variabili numeriche mi dà il valore 0.
Premetto che ho provato tutti i modi per accedere alle variabili: dal "gameObject.Addcomponent<Protagonista>()"; al “gameobject.FindObjectOfType<Protagonista>();”, ma col medesimo risultato.
Mentre con alcune variabili riesco accedere correttamente ai valori contenuti nelle altre classi, in altre parti di codice, l'accesso alle variabili sembra essere afflitto da questo problema.
Condivido una parte del codice partendo dalla classe “Base”, ereditando la classe Unity MonoBehaviour (secondo alcuni sarebbe questo il problema):

public abstract class Base: MonoBehaviour
{

private static string nome;

 public string Nome
 {

 get{return nome;}
 set{ nome = value;}

 }

//...

}
public sealed class Protagonista : AltreClassi
{

//ereditano variabili da una classe base 

Vivo = true;
Nome = "Eroe";
Hp= 100;
//...

 public override void Stats()
 {

 base.Stats();

 }

}

La classi dei personaggi ereditano anche un Metodo chiamato “Stats()”, che permette di vedere le statistiche di quest'ultimi, dove il nome del giocatore, in questo caso, viene mostrato correttamente!

public class Nemico : AltreClassi
{

//ereditano variabili da una classe base 

Vivo = true;
Nome = "Nemico Base";
Hp= 100;
//...


 public override void Stats()
 {

  base.Stats();

 }

}

Questo sotto, è un pezzo del codice di "attacco", dove cerco di accedere alla variabile “Nome” che dovrebbe dare come risultato “Eroe”:

//Accedo alla classe del protagonista per visualizzare info sul suo nome

public class Attacco : MonoBehaviuor
{

//...

Protagonista accessEroe = new Protagonista();

//...

Debug.log ($@ "Il nome del protagonista è:" {accessEroe.Nome};

//...

}
____________________________________________________
Output: "Il nome del protagonista è: Nemico Base"

Salvo una mia distrazione, l'accesso ad altre variabili sembra funzionare, tanto che ho sviluppato un rudimentale codice di attacco dove il nemico riesce a sottrarre la vita all'eroe e mi da il valore giusto.
E di fatto anche il Metodo “Stats()”, sembra funzionare, mostrando  correttamente del giocatore, ma nel momento in cui cerco di accedere al di fuori di quel metodo, in alcuni casi mi rimanda sempre al nome del nemico, e nel caso di variabili numeriche, da valore 0.
Vi ringrazio in anticipo per il vostro aiuto, chiedete se vi servono altri dettagli sul codice.

3 Risposte

  • Re: Accesso errato ad una variabile di un altra classe Unity, C#

    Non si è capito molto bene, ma perché static il nome? Sai cosa implica dichiararlo static?

  • Re: Accesso errato ad una variabile di un altra classe Unity, C#

    29/02/2024 - Weierstrass ha scritto:


    Non si è capito molto bene, ma perché static il nome? Sai cosa implica dichiararlo static?

    SI, e francamente sono confuso quanto te, ma su i forum di Unity, più di una persona insisteva sul mettere le variabili “static” per poter accedere da un altra classe, il che mi è sempre sembrato strano. 
    Addirittura, uno portava l'esempio di una variabile privata “static” e Property "public".
    Poi alcuni hanno cominciato a dare diverse soluzioni per accedere ad un una variabile su Unity: dal gameobject.AddComponent<Classe>(); al FIndObjectOfType<Classe>();.
    Condividendo la tua perplessità ho provato a togliere la parola chiave “static” (come giusto che sia), ed ora e riesco ad accedere alle variabili di altre classi senza problemi, ma solo con “FindObjectOfType”.
    Qualcuno suggerisce anche di accedere tramite "GetComponent", proverò anche quest'altra soluzione.
    Meno male che mi hai fatto venire il dubbio, che poi in realtà ho sempre avuto.

  • Re: Accesso errato ad una variabile di un altra classe Unity, C#

    Static genera una variabile praticamente uguale a una variabile globale con lo scope limitato. È una variabile unica e,  se la tocca un'istanza di una classe, la modifica vale per tutti.

    I forum sono utilissimi,ma purtroppo ogni tanto bisogna scremare le informazioni. Rifletti bene su quello che vuoi fare e poi implementalo. Il compilatore seguirà comunque le regole del linguaggio, quale che sia la piattaforma utilizzata.

Devi accedere o registrarti per scrivere nel forum
3 risposte