2015-11-04 1 views
0

Je travaille sur le système de sauvegarde d'un jeu coopératif local sur lequel je travaille. Le but du code est d'établir une classe statique sérialisable qui a des instances des quatre joueurs et les données pertinentes qu'ils doivent stocker pour l'enregistrement en binaire.Erreur NullReferenceException dans Unity lorsque j'essaie d'obtenir des données d'une classe statique

[System.Serializable] 
public class GameState { 
//Current is the GameState referenced during play 
public static GameState current; 
public Player mage; 
public Player crusader; 
public Player gunner; 
public Player cleric; 

public int checkPointState; 

//Global versions of each player character that contains main health, second health, and alive/dead 
//Also contains the checkpoint that was last activated 
public GameState() 
{ 
    mage = new Player(); 
    crusader = new Player(); 
    gunner = new Player(); 
    cleric = new Player(); 

    checkPointState = 0; 
    } 
} 

La classe juste Player contient les ints qui suivent les statistiques des joueurs et un bool pour s'ils sont à l'état vivant ou non. Mon problème vient quand une de mes classes dans la scène de jeu doit obtenir des données de cette classe statique. Lorsque la classe statique est référencée, elle renvoie l'erreur.

void Start() { 
    mageAlive = GameState.current.mage.isAlive; 
    if (mageAlive == true) 
    { 
     mageMainHealth = GameState.current.mage.mainHealth; 
     mageSecondHealth = GameState.current.mage.secondHealth; 
    } else 
    { 
     Destroy(this); 
    } 
} 

Je suis nouveau au codage, donc je ne sais pas comment l'unité interagit avec les classes statiques qui ne héritent pas de MonoBehaviour. J'ai basé ce code sur un didacticiel qui a fonctionné de manière similaire, donc je ne suis pas sûr de la nature du problème.

+0

S'il vous plaît assurez-vous de lire http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it –

Répondre

4

Rien n'initialise current.

Une solution rapide est d'initialiser current comme ceci:

public static GameState current = new GameState(); 

C'est le modèle Singleton, vous pouvez lire tout cela sur le web, mais this post par Jon Skeet est un endroit assez décent pour commencer.

j'envisager de faire le constructeur privé GameState, et faire current (alias Instance normalement) dans une propriété avec seulement un getter:

private static GameState current = new GameState(); 
public static GameState Current 
{ 
    get { return current; } 
} 

Il y a beaucoup d'autres façons de le faire, surtout si multi le filetage est une préoccupation, alors vous devriez lire le post de Jon Skeet.

1

Pour donner une autre perspective: Si vous voulez mettre en œuvre que comme alors cela fonctionne, classe statique différemment, à partir de référence à la classe et de ses données et ne se termine pas avec le constructeur:

public class GameState { 
    // not needed here, because static 
    // public static GameState current; 
    public static Player mage; 
    public static Player crusader; 
    public static Player gunner; 
    [...] 
    public static GameState() { 
[...] 

de Bien sûr, vos méthodes renverrait cette classe statiques données statiques différentes maintenant trop:

void Start() { 
    mageAlive = GameState.mage.isAlive; 
    if (mageAlive == true) { 
     mageMainHealth = GameState.mage.mainHealth; 
     mageSecondHealth = GameState.mage.secondHealth; 

Si vous voulez un (! sérialisable) Singleton - voir DaveShaws answer.