IEnumerator OnCollisionEnter2D не ждет

#c# #unity3d

#c# #unity3d

Вопрос:

Я пытаюсь установить игровой объект активным при столкновении, подождите секунду, а затем снова установите его в неактивное состояние, но после WaitForSeconds() строки выполнение, похоже, останавливается. У меня нет опыта работы с C# и Unity, так что это может быть ошибкой новичка. Есть идеи, почему это могло произойти?

 private IEnumerator OnCollisionEnter2D(Collision2D collidedWith) {    if (collidedWith.gameObject.tag == "Shape") {  collidedWith.transform.GetChild(0).gameObject.SetActive(true);  Object.Destroy(this.gameObject);  yield return new WaitForSeconds(1);  Debug.Log("Should have waited for 1 second");  collidedWith.transform.GetChild(0).gameObject.SetActive(false);  } }  

Ответ №1:

Вы делаете

 Object.Destroy(this.gameObject);   

на этом объекте, на котором выполняется сопрограмма -gt; Процедура прерывается в тот же самый момент (когда она достигает первого gt; yield оператора) -gt; она на самом деле никогда не начинает ждать 😉


Вам лучше иметь компонент на объекте, с которым вы сталкиваетесь, и вместо этого убедитесь, что на нем запущена сопрограмма.

Например, как

 // Have this on your Shape objects public class Shape : MonoBehaviour {  private bool isCollided;   public void Collided()  {  if(!isCollided) StartCoroutine(Routine());  }   private IEnumerator Routine()  {  if(isCollided) yield break;   isCollided = true;   var child = transform.GetChild(0).gameObject;    child .SetActive(true);  yield return new WaitForSeconds(1);  child.SetActive(false);   isCollided = false;  } }  

а затем, скорее, сделайте, например

 private void OnCollisionEnter2D(Collision2D collidedWith)  {  if (collidedWith.gameObject.TryGetComponentlt;Shapegt;(out var shape))   {  shape.Collided();  Destroy(gameObject);  } }