Unity中向数组添加GameObject报错ArgumentNullException求助
问题分析与解决
错误原因
cardsSelected未初始化:你调用的Append是LINQ扩展方法,它要求调用的源集合(即cardsSelected)不能为null。如果cardsSelected是未实例化的集合或null状态的数组,就会触发空引用错误。- 生命周期方法名称错误:你的初始化方法写的是
private void start(),Unity的生命周期方法要求大写开头的Start(),小写的方法不会被Unity自动调用,导致集合初始化逻辑完全没执行。 - 集合类型使用不当:如果
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
相关产品推荐
相关产品推荐

