尝试从静态类中获取数据时Unity中的NullReferenceException错误

时间:2015-11-04 22:21:43

标签: c# unity3d static nullreferenceexception serializable

我正在研究我正在进行的本地合作游戏的保存系统。代码的目标是建立一个Serializable Static类,它包含四个播放器的实例以及它们存储所需的相关数据,以便以二进制形式保存。

[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;
    }
}

Player类只包含跟踪玩家统计数据的整数和一个bool,如果他们处于生存状态。我的问题出现在游戏场景中的一个类需要从这个静态类中获取数据时。引用静态类时,它会抛出错误。

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

我是编码的新手,所以我不确定Unity如何与不从MonoBehaviour继承的静态类进行交互。我的代码基于一个非常相似的教程,因此我不确定问题是什么。

2 个答案:

答案 0 :(得分:4)

没有任何内容正在初始化current

一个快速的解决方案是像这样初始化current

 public static GameState current = new GameState();

这是单身人士模式,您可以通过网络阅读有关它的信息,但this post Jon Skeet是一个相当不错的起点。

我会考虑将GameState构造函数设为私有,并将current(通常也称为Instance)放入只有getter的属性中:

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

还有很多方法可以做到这一点,特别是如果需要考虑多线程,那么你应该阅读Jon Skeet的帖子。

答案 1 :(得分:1)

提供另一个视角:如果要将其实现为 static 类,那么这种方式的工作方式不同,从引用类及其数据开始,而不是以构造函数结束:

 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() {
[...]

当然,你的方法现在也会引用这个静态类的静态数据:

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

如果你想要一个(可序列化的!)单身人士 - 请参阅DaveShaws answer