【问题标题】:Unity C# Wait then doUnity C# 等待然后做
【发布时间】:2015-08-01 21:30:09
【问题描述】:

我正在学习 Unity 的 Space Shooter 课程,并且我已经达到了小行星向我袭来并且我可以摧毁它们的地步。

当小行星检测到触发碰撞时,它会触发“showExplosion”方法。问题是,在我们销毁游戏对象并实例化爆炸后,爆炸仍然是一个对象。

这显然是一种不好的做法。

我需要做的(我认为)是等待该动画完成然后销毁该对象。

现在我假设有一个我可以监听的事件...知道这也很高兴..

但是我怎么简单地说等待X秒然后销毁爆炸对象。

【问题讨论】:

  • void OnTriggerEnter(Collider other) { if (other.tag == "Boundry" || other.tag == "Player") { return; } Destroy (other.gameObject); Destroy (gameObject); GameObject exp = Instantiate (explosion, transform.position, transform.rotation) as GameObject; StartCoroutine (DestroyObjectAfterSeconds(exp,1)); } IEnumerator DestroyObjectAfterSeconds(Object objectToDestroy, float waitTime) { yield return new WaitForSeconds (waitTime); Destroy (objectToDestroy); }
  • 以上不行
  • 这对我有用,检查你是否会犯任何其他错误。

标签: c# animation unity3d


【解决方案1】:

通过使用协程,你可以做这样的事情。

IEnumerator DestroyObjectAfterSeconds()
{
   yield return new WaitForSeconds(timeInSeconds);
   //DestroyObject here
}

在你的 showExplosion 方法调用中

 StartCoroutine("DestroyObjectAfterSeconds");

如果您想等待动画完成然后销毁游戏对象,您可以在统一的销毁动画中添加一个事件。为此,单击具有破坏动画的游戏对象,然后转到顶部栏的窗口或按 command + 6 并打开动画窗口,现在您选择动画的最后一帧,您可以将事件添加到动画的最后一帧。通过这种方式,您可以在动画完成时销毁您的游戏对象。 :)

【讨论】:

  • 这对我不起作用..我可能错了,但如果你在做某事之前返回,它不会不做下面的事情吗?
  • 这对我不起作用..我可能错了,但如果你在做某事之前返回,它不会不做下面的事情吗?
  • 它不是简单的返回它的收益返回.. 当你调用 StartCoroutine("DestroyObjectAfterSeconds") 它将执行上面编写的任何代码 yield return new WaitForSeconds(timeInSeconds);语句然后返回等待秒然后回到这个函数执行yield之后写的语句 return new WaitForSeconds(timeInSeconds);这就是它的工作原理。
【解决方案2】:

有几种方法可以做到这一点,但最简单的一种是使用Destroy中的第二个参数,也就是销毁的时间。

例如Destroy(myGameObject,5F);会在5秒后销毁游戏对象。

所以,在小行星脚本中,在你实例化爆炸的那一刻,调用Destroy(explosionObject,10F);(给足够的时间让爆炸完成,在场景中停留的时间长一点也没关系)

我认为它应该可以正常工作,如果没有,你可以在爆炸中使用一个独立的脚本,它在 Start() 方法中调用Destroy(this.gameobject,10F)

如果你想要一个 Wait 然后做更通用的(不仅仅是为了 Destroy)你可以使用Coroutines

【讨论】:

  • 5f 这是什么意思。我假设 5 帧?
  • 时间以秒为单位 5f 表示 5 秒 f 用于浮点数。
猜你喜欢
  • 2017-11-09
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
相关资源
最近更新 更多