You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中向数组添加GameObject报错ArgumentNullException求助

问题分析与解决

错误原因

  1. cardsSelected未初始化:你调用的Append是LINQ扩展方法,它要求调用的源集合(即cardsSelected)不能为null。如果cardsSelected是未实例化的集合或null状态的数组,就会触发空引用错误。
  2. 生命周期方法名称错误:你的初始化方法写的是private void start(),Unity的生命周期方法要求大写开头的Start(),小写的方法不会被Unity自动调用,导致集合初始化逻辑完全没执行。
  3. 集合类型使用不当:如果cardsSelected是普通数组(GameObject[]),数组长度固定,LINQ的Append不会修改原数组,只会返回新序列,且原数组为null时直接调用必然报错。

解决步骤

1. 修正生命周期方法名称

把小写的start()改为Unity标准的Start(),确保初始化逻辑能被执行:

private void Start() // 大写S,符合Unity生命周期规范
{
    // 初始化集合
    cardsSelected = new List<GameObject>();
    for (int i = 0; i < 5; i++) 
    {
        GameObject card = Instantiate(deck[i], playersHandContent.transform);
        card.GetComponent<Button>().onClick.AddListener(delegate { AddCardToUse(card); });
    }
}

2. 改用List<GameObject>存储选中卡牌

将cardsSelected声明为List<GameObject>类型,它支持动态添加元素:

// 类内部声明集合
private List<GameObject> cardsSelected;

3. 使用List的Add方法替代LINQ的Append

List.Add()会直接修改集合添加元素,而LINQ的Append仅返回新序列,不会改变原集合:

void AddCardToUse(GameObject cardSelected)
{
    Debug.Log(cardSelected.name);
    cardsSelected.Add(cardSelected); // 用Add实现元素追加
}

额外提示

如果必须使用数组存储,可通过转List再转回数组的方式实现,但效率低于直接用List:

// 假设cardsSelected原本是GameObject[]类型
cardsSelected = cardsSelected?.ToList().Append(cardSelected).ToArray() ?? new GameObject[] { cardSelected };

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:25:20