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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:30:43