我在 Unity 2D 的碰撞体 2D 中收到空引用异常

I'm getting a null reference Exception in my collider 2D in Unity 2D

提问人:Aromatic Arthur 提问时间:6/2/2022 更新时间:9/18/2023 访问量:548

问:

所以我正在制作一个飞扬的鸟游戏,但除了,玩家只有在撞到后墙时才会死亡。如果他撞到墙上,它应该访问我的 GameManager 中的一个函数(空对象),该函数会重新调整场景。

public void OnTriggerEnter2D(Collider2D Doom)
    {
        Debug.Log("Collider works");
        GetComponent<GameManager>().EndGame();
    }

在这种情况下,Doom 是后墙。当我运行游戏时,我收到错误 NullReferenceException: Object reference not set to an instance of an object。

你能帮我吗?

unity-game-engine nullreferenceexception flappy-bird-clone

评论

2赞 Iggy 6/3/2022
GameManager 脚本是否附加到此代码所在的同一游戏对象?你可以试试.FindObjectOfType<GameManager>().EndGame();
0赞 limserhane 6/3/2022
请注意,查找附加到当前游戏对象的组件。GetComponent

答:

0赞 sakaibats 9/17/2023 #1

当您指向 null 的内容时,会发生 NullReferenceException。在本例中,为 GetComponent()。EndGame() 为 null。

就像 imserhane 提到的,当你使用 GetComponent<>() 时,你试图从这个脚本附加到的游戏对象中检索组件。在您的例子中,这两个脚本可能附加到不同的游戏对象。

您可以改用 FindObjectOfType,就像 Iggy 提到的一样。唯一的问题是,您可以保存对 gameManager 的引用,使其更加优化,而不是每次调用 OnTriggerEnter2D 时都调用 FindObjectOfType。在这个游戏中,这可能无关紧要,但这样做是一个很好的做法。

这就是你的做法。

GameManager gameManager;

// Save a reference to your GameManager
void Awake()
{
    gameManager = FindObjectOfType<GameManager>();
}

// Modify your code like this
public void OnTriggerEnter2D(Collider2D Doom)
{
    Debug.Log("Collider works");
    gameManager.EndGame();
}

如果您想了解有关 NullReferenceException 的更多信息,可以观看此视频,该视频通过示例详细解释了该错误,希望这对您有所帮助!