我收到一个带有统一冲突的 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++;
}
不过还有其他方法可以在其他对象中引用GameMechanic
和Manager
classes,其中最好的是Singleton。这里有一个简单的方法可以轻松解决您的问题,那就是使用 FindObjectOfType
。更改下面的代码,它可能会被修复。
if (collisionInfo.collider.name == "Player")
{
FindObjectOfType<GameMechanics>().playerScore++; // replace it with this way
}
这是我的代码,在 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++;
}
不过还有其他方法可以在其他对象中引用GameMechanic
和Manager
classes,其中最好的是Singleton。这里有一个简单的方法可以轻松解决您的问题,那就是使用 FindObjectOfType
。更改下面的代码,它可能会被修复。
if (collisionInfo.collider.name == "Player")
{
FindObjectOfType<GameMechanics>().playerScore++; // replace it with this way
}