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.