Unity3D-C#数组初始化和填充:Null引用-未设置对象引用

本文关键字:引用 设置 对象引用 Null 数组 初始化 填充 Unity3D-C# | 更新日期: 2023-09-27 18:29:32

我正在尝试保存我的游戏数据。在"将游戏数据复制到可序列化类对象中"的时候,我遇到了一个问题。这是我的代码:

public static void Save()
{
    // set save file
    .
    .
    // import game data to serializable class
    PlayerData data = new PlayerData();
    GameObject[] tiles = GameObject.FindGameObjectsWithTag("Tile");
    int i = 0;
    print (data.tiles.Length);  // prints as expected (initialization in constructor)
    foreach(GameObject tile in tiles)
    {
        data.tiles[i].X = tile.GetComponent<TileScript>().X;
        ^^^^^^^^^^^^^^^
        //null reference: object reference not set to an instance of object
        i++;
    }
    .
    .
    .
    print ("Game Saved!");
}

这是我试图将游戏数据保存到的类:

[Serializable]
class PlayerData
{
    public class Building
    {
        public int index;
    }
    public class Tile
    {
        public int X,Y;
        .
        .
    }
    public Tile[] tiles;
    public PlayerData()
    {
        tiles = new Tile[40];
    }
}

我找不到我犯的错误。[Serializable]类成员初始化是否存在特殊情况?我在哪里犯了错误?我该如何修复它?

Unity3D-C#数组初始化和填充:Null引用-未设置对象引用

tiles的每个元素都初始化为默认值Tile。如果Tile是引用类型(即class而不是struct),则它将是null。除了创建数组之外,还需要将每个元素初始化为一个新的Tile对象:

public Tile[] tiles;
public PlayerData()
{
    tiles = new Tile[40];
    for (int i = 0; i < tiles.Length; i++)
        tiles[i] = new Tile();
}

当你不这样做,你试图访问数据在:

data.tiles[i].X

data.tiles[i]将返回null。尝试访问null引用上的X成员自然会抛出NullReferenceException