游戏对象数组在从另一个类调用时返回 null

本文关键字:调用 返回 null 另一个 对象 数组 游戏 | 更新日期: 2023-09-27 18:17:13

我目前处于迷路状态,因为我的游戏对象返回空。

关于这个问题,我不确定是因为我错过了一件小事,还是我直接编程使用多个类完全错误。

我生成游戏对象数组的代码:

public class gridInit : MonoBehaviour {
    const int mapWidth = 33;
    const int mapHeight = -27;
    const float tileSizeUnits = 1.0f / 3;
    public GameObject tile;
    // Use this for initialization
    void Start () {
        GenerateTileMap();
        Screen.fullScreen = true;
    }
    void Awake()
    {
    }
    // Update is called once per frame
    void Update () {
    }
    bool walkable = false;
    [HideInInspector]
    public GameObject[] goTile = new GameObject[892]; 
    void GenerateTileMap()
    {
        int tileNumber = 0;
        for (float y = 0; y > mapHeight; y--)
        {
            for (float x = 0; x < mapWidth; x++)
            {
               float tilePosX = x/3;
               float tilePosY = y/3;
               int layerPos = -2;
               goTile[tileNumber] = Instantiate(tile, new Vector3(tilePosX, tilePosY, layerPos), Quaternion.identity) as GameObject;
               goTile[tileNumber].name = "tile" + tileNumber;
               goTile[tileNumber].tag = "grid";
               RaycastHit2D hit;
               Vector3 fwd = goTile[tileNumber].transform.TransformDirection(Vector3.forward);
               Debug.DrawRay(goTile[tileNumber].transform.position, fwd * 50, Color.green);
               hit = Physics2D.Raycast(goTile[tileNumber].transform.position, fwd, 200);
               if (hit)
               {
                   goTile[tileNumber].tag = "walkableGrid";
               }
               tileNumber++;     
            }
        }
    }

我想使用设置游戏对象的类:

public class gameCalibration : MonoBehaviour {
    bool calibrationComplete = false;
    public gridInit gInit;
    public cam Cam;
    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
        {
            for (int i = 0; i < gInit.goTile.Length; i++)
            {
                if (calibrationComplete == false)
                {
                    gInit.goTile[i].GetComponent<Renderer>().enabled = true;
                }
                else
                {
                    gInit.goTile[i].GetComponent<Renderer>().enabled = false;
                }
            }
            if (calibrationComplete == false)
            {
                Calibrate();
            }
            else
            {
                gInit.GenerateObjects();
                calibrationComplete = true;
            }
        }        
    }

    Vector2[] camTileCenter;
    Vector2 tempCenter;
    void Calibrate()
    {
        for (int i = 0; i < gInit.goTile.Length; i++)
        {
                gInit.goTile[i].GetComponent<SpriteRenderer>().color = Color.red;
                if (Cam.redBlobs[i] != null && camTileCenter[i] != tempCenter)
                {
                    camTileCenter[i] = new Vector2(Cam.redBlobs[i].Width / 2, Cam.redBlobs[i].Height / 2);
                    tempCenter = camTileCenter[i];
                }
        }
    }
}

我尝试弄乱一些值以及如何初始化类,但没有占上风。

我的完整错误:

NullReferenceException: Object reference not set to an instance of an object
gameCalibration.Update () (at Assets/Scripts/gameCalibration.cs:21)

游戏中的错误线校准:gInit.goTile[i].GetComponent<Renderer>().enabled = true;

游戏对象数组在从另一个类调用时返回 null

public gridInit gInit = new gridInit();

而不是

public gridInit gInit;

我没有看到您在任何地方创建对象的实例

问题是类,gridInit尚未实例化,以这种情况为例

public List<string> exS;
public List<string> exS2 = new List<string>();
Console.WriteLine(exS.Count); //The List<string> is null, as it has not been instantiated - errors
Console.WriteLine(exS2.Count); //the List<string> is blank, as it was instantiated with new List<string>() - prints 0

因此,当您遇到这种情况时

public gridInit gInit;
public gridInit gInit2 = new gridInit();
gInit.goTile[i].GetComponent<Renderer>().enabled = false;
gInit2.goTile[i].GetComponent<Renderer>().enabled = false;

现在你认为这里会发生什么? gInit 是 null,因为它没有实例化,而gInit2工作,因为当我们使用 = new gridInit(); 时,它创建了类的新实例,然后创建了它的变量