我收到一个带有统一冲突的 NullReferenceException

I am getting a NullReferenceException with unity collisions

这是我的代码,在 playerScore 增量行上收到错误。代码在多次生成的预制件中,如果它击中玩家,它就会被摧毁,玩家的分数会增加。目前,一旦执行 if 语句,代码将在与任何不具有名称“Player”的对象发生碰撞时销毁。

private void OnCollisionEnter2D(Collision2D collisionInfo)
    {
        
        
        Debug.Log($@"Collision name = {collisionInfo.collider.name}");
        
        if (collisionInfo.collider.name == "Player")
        {
            GetComponent<GameMechanics>().playerScore++;

        }

       
        GameObject e = Instantiate(explosion) as GameObject;
        e.transform.position = transform.position;
        Destroy(gameObject);
    }

这是我引用变量的代码,我只是不知道我在做什么错被摧毁阻止对玩家分数进行更改?

public class GameMechanics : MonoBehaviour
{
   public int playerScore;
   // Start is called before the first frame update
   void Start()
   {
       playerScore = 0;
   }

   // Update is called once per frame
   void Update()
   {
       
       Debug.Log($@"Player Score = {playerScore} ");

   }
}

提前致谢!

当代码尝试访问未正确初始化的变量时,会发生 NullReferenceExceptions。在您的情况下,这可能是由于多种原因造成的。

确保游戏对象在场景中设置为活动 确保在游戏对象上启用了脚本对象

如果这些没有帮助,您可以尝试将变量设置为静态,并将其初始值设置为 0。

静态变量在其他所有内容之前加载,并且大多数其他 类 都可以访问,因此这可能能够解决您的问题。

这是因为你在 class 中使用了 GetComponent 而没有它并且应该在其中找到 GameMechanics,但结果是 null

GetComponent<GameMechanics>().playerScore++; // GameMechanics dosen't found..


一种方法是通过检查器将 GameMechanic 给另一个对象:

public GameMechanics Mechanics;
private void OnCollisionEnter2D(Collision2D collisionInfo)
{
    if (collisionInfo.collider.name == "Player") Mechanics.playerScore++;
}

不过还有其他方法可以在其他对象中引用GameMechanicManager classes,其中最好的是Singleton。这里有一个简单的方法可以轻松解决您的问题,那就是使用 FindObjectOfType。更改下面的代码,它可能会被修复。

if (collisionInfo.collider.name == "Player")
{
    FindObjectOfType<GameMechanics>().playerScore++; // replace it with this way
}