NullRefExc 尝试在类数组中设置类的值时,为什么?[复制]

NullRefExc when trieing to set value of class in an array of classes, why? [duplicate]

提问人:Argual Leothon 提问时间:8/16/2017 最后编辑:Argual Leothon 更新时间:8/16/2017 访问量:49

问:

我正在开发一款 2D 太空射击游戏,我制作了一个不起作用的道具。

玩家的飞船上附有 3 个游戏对象,3 门火炮。powerUp 脚本存储枪支配置,当 PowerUp 与玩家发生碰撞时,玩家从 PowerUp 获取枪支配置,然后销毁它。

PowerUp 正在发生永久性变化,因此该过程。CyclePowers()

我将配置存储在创建 PowerUp 时执行的过程中。它们设置相应类的值。

问题是,当它尝试设置值时,会引发 NullReferenceExeption。

错误是:

NullReferenceException: Object reference not set to an instance of an object PowerUp.SetupGunLaserSettings () (at Assets/PowerUp.cs:131) PowerUp.Start () (at Assets/PowerUp.cs:30)

我认为问题在于,当类尝试设置其值时,该类并不存在。为什么,我不知道。

我是 C# 的初学者,所以我的假设可能是错误的。代码如下:

using UnityEngine;
using System.Collections;

public class PowerUp : MonoBehaviour {  
    // Use this for initialization
    void Start () {         
        SetupGunLaserSettings();
        SetupGunLaser2Settings();

        powerType = powerCount;
        InvokeRepeating("CyclePowers", 0.000001f, cycleRate);       
    }

    public class gunSettings{
        public string name;
        //ETC
    }

    public class gunS{
        public gunSettings gunSNose = new gunSettings();
        //ETC       
    }


    private gunS[] gunLaser = new gunS[3]; //powerType '0'
    void SetupGunLaserSettings(){
        for (int i = 0; i <= 2; i++) {
            gunLaser[i].gunSNose.weaponActive = true; //This is where the exception is thrown.
            //ETC               
        }
    }

}
C# 数组类 unity-game-engine nullreferenceexception

评论

1赞 Jon Skeet 8/16/2017
请将其简化为最小的可重现示例。这里有很多代码,几乎所有代码都可能无关紧要。但是我没有看到您填充数组的任何代码。(您永远不会创建该类的任何实例。gunS
0赞 Sach 8/16/2017
请发布最小、完整和可验证的示例。换句话说,请缩小您的问题范围,消除所有混乱。
0赞 Chris Dunaway 8/16/2017
在循环的顶部,您需要实际创建类的实例。尝试在循环中添加以下行:forgunSforgunLaser[i] = new gunsS();

答:

0赞 oerkelens 8/16/2017 #1

声明一个数组,但当您开始设置其成员的属性时,该数组为空。尝试创建您的项目:GunS

for (int i = 0; i <= 2; i++) 
{
    gunLaser[i] = new GunS();
    gunLaser[i].gunSNose.weaponActive = true; 

顺便说一句,试着把你的声明放在你的班级的顶部。这就是人们会寻找它们的地方。通过将它们分散在代码中,您会使任何试图理解您的代码的人感到困惑:)

评论

0赞 Argual Leothon 8/16/2017
多谢!我以为数组是用默认值创建的。是的,我通常把我的声明放在顶部,我这样做只是为了使代码更易于阅读和更改:D
0赞 oerkelens 8/16/2017
它创建时充满了默认值,但在本例中,该默认值为 .如果你创建一个数组,它们将是(但布尔值?[]将包含s!)nullboolfalsenull