You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中数组元素无法赋值及空引用异常问题求助

解决Unity中数组空引用异常的问题

嘿,这个问题我太熟了——你踩了C#数组初始化的经典坑!咱们一步步拆解清楚:

为什么会出现这些问题?

1. 绿色下划线的原因

你声明的Color[] oldColor;只是告诉编译器“这是一个Color类型的数组引用”,但根本没有给它分配实际的内存空间。在C#里,引用类型(包括数组)的默认值是null,所以编译器会提示你只能给它赋值默认的null——本质是在提醒你:“这个变量现在啥都没指向呢!”

2. 运行时NullReferenceException的原因

当你在循环里写oldColor[i] = targets[i].color;时,oldColor还是null,相当于你要往一个不存在的容器里塞东西,程序自然会抛出空引用异常。

怎么解决?

核心就是:在给数组赋值之前,先初始化它,分配足够的内存空间

方案一:手动初始化数组再循环赋值

在你执行赋值循环的函数开头,先根据targets的长度创建数组实例,再进行赋值:

// 假设这是你用来赋值的函数
void SaveOriginalColors()
{
    // 关键步骤:先初始化数组,长度和targets保持一致
    oldColor = new Color[targets.Length];
    
    // 现在再循环赋值就没问题了
    for (int i = 0; i < targets.Length; i++)
    {
        oldColor[i] = targets[i].color;
    }
}

注意:要确保这段代码执行时,targets已经通过Inspector完成赋值(你说已经设置好了,所以这一步没问题)。建议把这个初始化+赋值的逻辑放在Start()函数里,确保在游戏启动时就完成。

方案二:用Linq简化赋值(可选)

如果你觉得写循环麻烦,可以用Linq一行搞定,不过记得在脚本顶部引用System.Linq

using System.Linq;
using UnityEngine;

public class YourScript : MonoBehaviour
{
    SpriteRenderer[] targets;
    Color[] oldColor;

    void Start()
    {
        // 一行完成初始化+赋值
        oldColor = targets.Select(renderer => renderer.color).ToArray();
    }
}

Linq会自动帮你遍历targets,提取每个元素的color,然后转换成Color数组,非常简洁。

小提醒

永远记住:在C#里,数组是引用类型,声明不等于初始化。声明只是创建了一个“指向数组的指针”,而初始化(new Color[长度])才是真正在内存里开辟一块空间来存储元素。

内容的提问来源于stack exchange,提问作者NicknEma

火山引擎 最新活动