为啥这会给我一个空引用异常? [复制]

Posted

技术标签:

【中文标题】为啥这会给我一个空引用异常? [复制]【英文标题】:Why is this giving me a Null Reference Exception? [duplicate]为什么这会给我一个空引用异常? [复制] 【发布时间】:2022-01-20 00:05:34 【问题描述】:

我不知道为什么,但这是在抛出

NullReferenceException:对象引用未设置为对象的实例 GridSquareController.Update () (在 Assets/Scripts/GridSquareController.cs:53)

代码:

for (int i = 0; i < numOfPrefabs; i++)

    System.Random rnd = new System.Random();
    int squareValue = rnd.Next(1, 6);
    gridBehaviour = spawnedPrefabs[i].GetComponent<GridBehaviour>();
    gridBehaviour.gridValue = squareValue;
    Debug.Log(gridBehaviour.gridValue);

我正在尝试在一系列预制件的脚本上设置一个值,我也在这段代码的另一部分初始化。

但是每次我按下激活这个 for 循环的键时,它都会抛出相同的错误。

预制件被初始化的部分:

void SpawnPrefabs()

    //will create as many prefabs as I specify in the numOfPrefabs variable
    if (numOfPrefabs > 0)
    
        for (int i = 0; i < numOfPrefabs; i++)
        
            GameObject newSpawnedPrefab;
            //instantiates a new prefab
            newSpawnedPrefab = Instantiate(gridTilePrefab, new Vector3(i, 0, 0), Quaternion.identity);
            //parents the new prefab to the transform of the current object (just parenting it really)
            newSpawnedPrefab.transform.SetParent(transform);
            //adding the prefab to the array
            spawnedPrefabs.SetValue(newSpawnedPrefab, i);
        
    

这也是我定义变量的地方

// the prefab I am instantiating into the gameworld
public GameObject gridTilePrefab;
public GridBehaviour gridBehaviour;

// an array containing all of the spawned prefabs
public GameObject[] spawnedPrefabs;

// the number of prefabs I want spawned calculated from the length of the array containing the prefabs
public int numOfPrefabs;
public bool Jeremy;

【问题讨论】:

这里有很多可能是错误的,但是您没有显示足够多的代码来实际找出您忘记初始化的内容...尝试在调试器中单步执行您的代码并找出您忘记初始化的内容。 不要将 new System.Random() 放入循环中。此外,unity 有一个内置的随机选项,可能对您更有效。 关于 Unity 随机类的提示听起来很有用,我会研究一下。 【参考方案1】:

spawnedPrefabs 未启动。将 spawnedPrefabs= new GameObject[numOfPrefabs] 添加到您的代码中

void SpawnPrefabs()
    
        //will create as many prefabs as I specify in the numOfPrefabs variable
        if (numOfPrefabs > 0)
        

          spawnedPrefabs= new  GameObject[numOfPrefabs] ;

            for (int i = 0; i < numOfPrefabs; i++)
            
                GameObject newSpawnedPrefab;
                //instantiates a new prefab
                newSpawnedPrefab = Instantiate(gridTilePrefab, new Vector3(i, 0, 0), Quaternion.identity);
                //parents the new prefab to the transform of the current object (just parenting it really)
                newSpawnedPrefab.transform.SetParent(transform);
                //adding the prefab to the array
                spawnedPrefabs.SetValue(newSpawnedPrefab, i);

            

        

    

【讨论】:

很可能不是。由于它是公共的并且GameObject 是序列化类型,Unity Inspector/Serializer 通常会自动初始化该数组【参考方案2】:

可能是因为这条线。我不确定。

gridBehaviour = spawnedPrefabs[i].GetComponent<GridBehaviour>();

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 我正在查看该行以尝试查找问题。谢谢你的提示。我可能会尝试使用 foreach 循环。

以上是关于为啥这会给我一个空引用异常? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当我在同一个模型中引用一个类时,为啥 Django 会给我一个 ValueError?

为啥这会给我一个 Java 中的 ClassCastException,而它在 C++ 中运行良好?

为啥在构造函数中抛出异常会导致空引用?

为啥这个 Linq 方法会抛出空引用异常

C# Cognex,为啥他说空引用异常 [重复]

为啥我在这里得到微调器的空引用错误? [复制]