一次只有一个对象实例
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;
我正在 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;