Unity3d 一次只能有一个对象实例

Unity3d 一次只能有一个对象实例,unity3d,if-statement,2d,Unity3d,If Statement,2d,我正在Unity中创建一个简单的2D游戏。当你按下空格键时,游戏将射出一个球,当你再次按下空格键时,球将“重置”。在任何给定的时间,屏幕上只能有一个球。下面是我现在用来检查场景中是否有某个游戏对象的条件逻辑。我知道摧毁(炮弹)将其转换为null,但我似乎不知道该如何以不同的方式执行此逻辑。现在我得到一个错误,在条件逻辑删除第一个球之后,我试图访问一个已删除的对象。(我是Unity的新手,我还没有发布我的全部脚本。) if(Input.GetKeyDown(KeyCode.Space)和&Game

我正在Unity中创建一个简单的2D游戏。当你按下空格键时,游戏将射出一个球,当你再次按下空格键时,球将“重置”。在任何给定的时间,屏幕上只能有一个球。下面是我现在用来检查场景中是否有某个
游戏对象的条件逻辑。我知道
摧毁(炮弹)
将其转换为
null
,但我似乎不知道该如何以不同的方式执行此逻辑。现在我得到一个错误,在条件逻辑删除第一个球之后,我试图访问一个已删除的对象。(我是Unity的新手,我还没有发布我的全部脚本。)

if(Input.GetKeyDown(KeyCode.Space)和&GameObject.Find(“射弹(克隆)”){
摧毁(炮弹);
}
else if(Input.GetKeyDown(KeyCode.Space)和&GameObject.Find(“射弹(克隆)”)==null)
{
炮弹=实例化(炮弹,barell.position,barell.rotation);
cannonBall.GetComponent().AddForce(度*球速);
}

您的问题是您用实例的引用覆盖了
炮弹的引用

然后您
销毁
该实例,使
炮弹
现在(等于)
null
并且不能再实例化


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

然后简单地销毁当前的炮弹(如果存在)。你已经有了参考资料

私有游戏对象cannonBallInstance;
...
if(Input.GetKeyDown(KeyCode.Space))
{
if(炮弹实例)
{
摧毁(炮弹);
}
其他的
{
cannonBallInstance=实例化(cannonBall,barell.position,barell.rotation);
cannonBallInstance.GetComponent().AddForce(度*球速);
}
}

实际上,我甚至不会一直销毁和实例化它,而是创建一次并像以前一样重复使用它

private Rigidbody2D cannonBallInstance;
...
if(Input.GetKeyDown(KeyCode.Space))
{
if(炮弹实例)
{
//停止球并使其失效
cannonBallInstance.velocity=Vector2.0;
cannonBallInstance.isKinetic=true;
cannonBallInstance.gameObject.SetActive(false);
}
其他的
{
//创建一次
//获取组件一次
如果(!cannonBallInstance)cannonBallInstance=实例化(cannonBall,barell.position,barell.rotation).getComponent();
//激活球并允许移动
cannonBallInstance.gameObject.SetActive(true);
cannonBallInstance.isKinetic=false;
//指定变换并重置速度
cannonBallInstance.position=barell.position;
cannonBallInstance.rotation=barell.rotation.eulerAngles.z;
cannonBallInstance.velocity=Vector2.0;
cannonBallInstance.AddForce(度*球速);
}
}

然后我甚至不会对子弹使用
AddForce
,而是直接指定目标速度,如

cannonBallInstance.velocity=度*ballVelocity;

谢谢您的帮助!
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);
}