1

我必须从这个类访问变量 ammoMagazine

public class Pistol : MonoBehaviour {
    public int ammoMagazine = 7;
}

然后我尝试了这段代码:

public class AmmoCounter : MonoBehaviour {

    public int ammo;
    private Pistol _pistol;     

    void Start () {
        _pistol = GetComponentInChildren<Pistol>();
    }

    void Update () {
        ammo = _pistol.ammoMagazine;
        guiText.text = "Pistol: " + ammo + "/7";
    }
}

为什么会有 NullReferenceException: Object reference not set to an instance of an object ?谢谢,我是 C# 新手

4

4 回答 4

7

可能没有为该_pistol字段分配值,因此您在调用Start之前没有调用Update,或者GetComponentInChildren<Pistol>()返回null

于 2013-11-05T15:21:32.950 回答
2
public class AmmoCounter : MonoBehaviour {

    public int ammo;
    private Pistol _pistol = GetComponentInChildren<Pistol>();     

    void Update () {
        ammo = _pistol.ammoMagazine;
        guiText.text = "Pistol: " + ammo + "/7";
    }
}

在调用更新函数之前初始化 _pistol 变量(检查 GetComponentInChildren() 函数是否返回 null)

于 2013-11-05T15:44:06.307 回答
1

请注意,它是 NullReferenceException。我认为出于某种原因在 Start() 之前调用了 Update()。

于 2013-11-05T15:20:46.367 回答
1

我知道这已经得到了回答..但是我认为如果您使用私有变量(如已接受的答案)编写所有内容,那么您将面临一些障碍。通常要在 Unity 中获得参考,您需要在场景中有一个带有所需附加脚本的对象。所以首先你要重写脚本:

public class AmmoCounter : MonoBehaviour {
    public int ammo;
    public GameObject _pistol;     
    void Start( ){
        ammo = _pistol.GetComponent< Pistol >( );
    }
    void Update( ) {
        guiText.text = "Pistol: " + ammo + "/7";
    }
}

在场景中,您想要一个附加了 Pistol 脚本的对象,然后在编辑器 (inspector) 中,您应该将该对象拖到 _Pistol 插槽中。这样做有几个原因,但两个重要的原因是 1)您正在缩短代码并引用脚本一次(当前答案是重复引用)和 2)使用 GetComponentInChildren 效率低下;Unity 搜索父级下的每个游戏对象以获取您的组件。因此,直接对象引用更好。同样使用这种类型的对象引用将在将来为您省去一些麻烦,最明显的是易于引用,并且将来更容易遵循您自己的代码(您可以在编辑器中查看引用而不是查看代码 - 相信我神奇的引用可能是一场噩梦)。

如果您不想通过在 C# 中读取静态类型的对象来引用,这允许您在不使用 GameObjects 的情况下引用项目。然而,静态类型是挑剔的生物,所以在使用它们之前要小心并知道你在做什么

编辑:语法

于 2013-11-05T22:34:27.930 回答