Unity C# 颜色分配显示错误。说它是一个空

Unity C# color assigning showing error . Saying it is a null

  private Material NewMat;
  private Color[] oldColor;
  private Color[] newColor;

for(int i=0; i<6; i++)
            { 
                NewMat = dropObj.transform.GetChild(0).gameObject.transform.GetChild(i).GetComponent<MeshRenderer>().material;
                var tempcolor = NewMat.color;
                print(tempcolor);
                oldColor[i] = new Color(tempcolor.r,tempcolor.g,tempcolor.b,tempcolor.a); //the problem is here
                print ("Position="+i);
                newColor[i] = oldColor[i];
                dropObj.transform.GetChild(0).gameObject.transform.GetChild(i).GetComponent<MeshRenderer>().material.SetColor("_Color", newColor[i]);
            }

这行代码显示错误(空):- oldColor[i] = new Color(tempcolor.r,tempcolor.g,tempcolor.b,tempcolor.a); 如何解决这个问题

我怀疑问题是 oldColornewColor 数组没有初始化。该错误指出一个空值。 Color 是结构体,是值类型,不能指向null。但是Color类型的数组可以指向null,因为它是引用类型。

解决方案是在使用之前初始化所述数组:

oldColor = new Color[size]; //6?
newColor = new Color[size]; //6?
for(int i = 0; i < 6; i++) 
{...}

size当然需要在使用前声明和初始化。

一些与问题没有直接关系的注释:

  1. 如果您不知道数组应该有多大,请考虑使用通用的 List<Color>。您可以使用 Add 方法向其中添加元素:

    oldColor = new List<Color>();
    newColor = new List<Color>();
    for(int i = 0; i < 6; i++) 
    {
       ..
       .. 
       oldColor.Add(new Color(..));
       ..
       ..  
    }
    
  2. for 循环中的第一行可能会出错很多。我建议把它分成多行,这样调试起来会更容易。直接引用有问题的游戏对象可能会有所帮助,如果它总是相同的游戏对象。

  3. 将值硬编码到 for 循环减速的条件部分是一种不好的做法。如果 for 循环应该遍历整个旧颜色数组,请像这样声明循环:

    for(int i = 0; i < oldColor.Length; i++)
    

这将确保对于任何给定大小的 oldColor,for 循环仍将迭代整个数组。