Unity创建新数组时出现NullReferenceException错误求助
问题分析与修复方案
核心错误原因
你遇到的是空引用异常,new WeaponObject[2]仅创建了数组的空容器,数组中的每个WeaponObject元素默认是null,直接访问weapons[i].Attacks自然会触发报错。此外代码还存在数组索引越界的隐患。
修复后的完整代码
[SerializeField] AnimationCollections animationCollections; public WeaponObject[] MakeWeapons() { WeaponObject[] weapons = new WeaponObject[2]; for (int i = 0; i < weapons.Length; i++) { // 实例化ScriptableObject对象,解决空引用问题 weapons[i] = ScriptableObject.CreateInstance<WeaponObject>(); weapons[i].Attacks = new AnimationClip[(Random.Range(2, 5) * 2)]; weapons[i].attackBlends = new float[weapons[i].Attacks.Length / 2]; for (int z = 0; z < weapons[i].Attacks.Length; z++) { weapons[i].Attacks[z] = animationCollections.animations[Random.Range(0, animationCollections.animations.Length)]; // 修正索引判断条件,避免越界 if (z < weapons[i].attackBlends.Length) { weapons[i].attackBlends[z] = Random.Range(0f, 1f); } } } return weapons; }
关键修复点
- 实例化ScriptableObject:
WeaponObject继承自ScriptableObject,必须用ScriptableObject.CreateInstance<WeaponObject>()创建实例,数组初始化仅分配位置,不会生成实际对象。 - 修正索引判断逻辑:原代码
if (weapons[i].attackBlends.Length < z)条件写反,会触发索引越界错误,改为z < weapons[i].attackBlends.Length才能正确赋值。
内容的提问来源于stack exchange,提问作者Madame Pigeon
相关产品推荐
相关产品推荐

