一次只有一个对象实例

Only one instance of an object at a time

我正在 Unity 中创建一个简单的 2D 游戏。当您按下 space 条时,游戏将射出一个球,当您再次按下 space 条时,球应该 "reset"。在任何给定时间屏幕上都应该只有一个球。这是我现在用来检查场景中是否存在某个 GameObject 的条件逻辑。我知道 Destroy(cannonBall); 将它变成 null,但我似乎无法弄清楚我应该如何以不同的方式执行此逻辑。现在我收到错误消息,在条件逻辑删除第一个球后我试图访问已删除的对象。 (我是 Unity 的新手,我还没有发布我的整个脚本。)

if (Input.GetKeyDown(KeyCode.Space) && GameObject.Find("Projectile(Clone)")) {
    Destroy(cannonBall);
}
else if (Input.GetKeyDown(KeyCode.Space) && GameObject.Find("Projectile(Clone)") == null )
{
    cannonBall = Instantiate(cannonBall, barell.position, barell.rotation);
    cannonBall.GetComponent<Rigidbody2D>().AddForce(degree * ballVelocity);
}

你的问题是你用实例的引用覆盖了预制件的cannonBall引用!

然后你 Destroy 实例所以 cannonBall 现在(等于)null 并且不能再被实例化。


=> 您应该将实例存储在不同的字段中!

然后简单地 Destroy 当前 cannonBall 如果它存在。您已经有了参考!

private GameObject cannonBallInstance;

...

    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (cannonBallInstance) 
        {
            Destroy(cannonBallInstance);
        }
        else
        {
            cannonBallInstance= Instantiate(cannonBall, barell.position, barell.rotation);
            cannonBallInstance.GetComponent<Rigidbody2D>().AddForce(degree * ballVelocity);
        }
    }

实际上我什至不会一直销毁和实例化它,而是创建它一次然后像这样重新使用它

private Rigidbody2D cannonBallInstance;

...

    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (cannonBallInstance) 
        {
            // stop the ball and deactivate it
            cannonBallInstance.velocity = Vector2.zero;
            cannonBallInstance.isKinematic = true;
            cannonBallInstance.gameObject.SetActive(false);
        }
        else
        {
            // Create it once
            // get the component once
            if(!cannonBallInstance) cannonBallInstance = Instantiate(cannonBall, barell.position, barell.rotation).getComponent<Rigidbody2D>();

            // activate the ball and allow movement
            cannonBallInstance.gameObject.SetActive(true);
            cannonBallInstance.isKinematic = false;

            // assign the transforms and reset the velocity
            cannonBallInstance.position = barell.position;
            cannonBallInstance.rotation = barell.rotation.eulerAngles.z;
            cannonBallInstance.velocity = Vector2.zero;

            cannonBallInstance.AddForce(degree * ballVelocity);
        }
    }

然后我什至不会使用 AddForce 作为子弹,而是直接分配目标速度,如

            cannonBallInstance.velocity = degree * ballVelocity;