Задать вопрос
@NickName7331

Unity(C#) — Почему не работают корутины?

Недавно начал изучать корутины. Не совсем понимаю, как они работают. Я писал скрипт босса для игры, и использовал корутины(впервые). Мне нужно было, чтобы, при переходе на вторую стадию, босс двигался по схемы с корутинов, но при переходе на вторую стадию, он продолжает движение так же, как на первой. Вот код:
spoiler
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Boss2 : Monster
{
	[SerializeField]
	private float speed = 2.0F;
	[SerializeField]
	public float PosMax1;
	[SerializeField]
	public float PosMin1;
	[SerializeField]
	public float PosMax2;
	[SerializeField]
	public float PosMin2;
	[SerializeField]
	int HitPoints = 7;
	[SerializeField]
	int Stadium = 1;

	Vector3 direction;

	private SpriteRenderer sprite;

	private Bullet bullet;

	IEnumerator Waiting()
	{
		yield return new WaitForSeconds(5);
	}

	IEnumerator Start1()
	{
		yield return StartCoroutine(Waiting());
		transform.position+=Vector3.left*10*Mathf.Sin(Time.deltaTime);
		Debug.Log ("Complite");
	}

	IEnumerator Start2()
	{
		yield return StartCoroutine(Waiting());
		if (transform.position.x >= PosMax2) 
		{
			direction *= -1.0F;
		} 
		else if (transform.position.x <= PosMin2) 
		{
			direction = transform.right;
		}
		Debug.Log ("Complite");
	}

	IEnumerator Start3()
	{
		yield return StartCoroutine(Waiting());
		transform.position+=Vector3.left*-10*Mathf.Sin(Time.deltaTime);
		Debug.Log ("Complite");
	}

	IEnumerator Start4()
	{
		yield return StartCoroutine(Waiting());
		if (transform.position.x >= PosMax1) 
		{
			direction *= -1.0F;
		} 
		else if (transform.position.x <= PosMin1) 
		{
			direction = transform.right;
		}
		Debug.Log ("Complite");
	}

	void Start5()
	{
		if (transform.position.x >= PosMax1) 
		{
			direction *= -1.0F;
		} 
		else if (transform.position.x <= PosMin1) 
		{
			direction = transform.right;
		}
		Debug.Log ("Complite");
	}

	protected override void Awake()
	{
		sprite = GetComponentInChildren<SpriteRenderer> ();
		bullet = Resources.Load<Bullet>("Bullet");
	}

	protected override void Start()
	{
		direction = transform.right;
		Stadium = 1;
	}

	void Update ()
	{
		Move ();
	}

	public void Damaged()
	{
		HitPoints--;
		if (Stadium == 1 && HitPoints == 0) 
		{
			Stadium = 2;
			HitPoints = 10;
		} 
		else if (Stadium == 2 && HitPoints == 0) 
		{
			Destroy (gameObject);
		}
	}

	protected virtual void OnTriggerEnter2D(Collider2D collider)
	{
		Bullet bullet = collider.GetComponent<Bullet> ();

		if (bullet) 
		{
			Damaged ();
		}

		Character character = collider.GetComponent<Character> ();

		if (character) 
		{
			character.ReceiveDamage ();
		}
	}


	private void Move()
	{
		if (Stadium == 1) 
		{
			if (transform.position.x >= PosMax1) 
			{
				direction *= -1.0F;
			} 
			else if (transform.position.x <= PosMin1) 
			{
				//transform.position+=Vector3.up*10*Time.deltaTime;
				direction = transform.right;
			}
		} 
		else if (Stadium == 2) 
		{
			for (; ;) 
			{
				Start5 ();
				Start1 ();
				Start2 ();
				Start3 ();
				Start4 ();
			}
		}
		transform.position = Vector3.MoveTowards (transform.position, transform.position + direction, speed * Time.deltaTime);
		sprite.flipX = direction.x > 0.0F;
	}
}


Буду рад вашей помощи.
P.S. Я новичок, и это мой первый проект
  • Вопрос задан
  • 1736 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Зачем вы в бесконечный цикл засунули пять стартов? Вы же оттуда не выберетесь никогда.
Корутины запускаются с помощью StartCoroutine, у вас этот метод используется только для запуска Waiting, а старты вы запускаете просто как обычные методы, что есть неправильно. Возьмите лучше пустую сцену и поэкспериментируйте там с корутинами, подключитесь дебаггером и посмотрите, что происходит. И пообождите вкладывайте их друг в друга пока не разберётесь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы