#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); } }