Дождитесь завершения сопрограммы, прежде чем переходить к функции C# Unity.

Я работал над перемещением юнита по сетке в Unity2d. У меня движение заработало без проблем. Я бы хотел, чтобы функция MovePlayer дождалась завершения сопрограммы, прежде чем двигаться дальше, поэтому программа будет ждать, пока игрок завершит движение, прежде чем выдавать новые приказы.

Вот мой код: открытый класс Player: MonoBehaviour {

public Vector3 position;
private Vector3 targetPosition;

private float speed;

void Awake ()
{
    speed = 2.0f;
    position = gameObject.transform.position;
    targetPosition = position;
    GameManager.instance.AddPlayerToList(this);                     //Register this player with our instance of GameManager by adding it to a list of Player objects. 
}

//Function that moves the player, takes a list of nodes as path
public void MovePlayer(List<Node> path)
{
    StartCoroutine(SmoothMovement(path));
    //Next step should wait until SmoothMovement is finished
}

private IEnumerator SmoothMovement(List<Node> path)
{
    float step = speed * Time.deltaTime;

    for (int i = 0; i < path.Count; i++)
    {
        targetPosition = new Vector3(path[i].coordinatesX, path[i].coordinatesY, 0f);

        float sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;

        while (sqrRemainingDistance > float.Epsilon)
        {
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
            sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
            yield return null;
        }

        position = transform.position;
    }

}

person Paco Martos Triguero    schedule 04.06.2017    source источник


Ответы (1)


Нельзя ждать сопрограммы в функции в основном потоке, иначе ваша игра зависнет, пока ваша функция не завершится.

Почему бы вам не назвать свой следующий шаг в конце вашей сопрограммы?

private IEnumerator SmoothMovement(List<Node> path)
{
    float step = speed * Time.deltaTime;

    for (int i = 0; i < path.Count; i++)
    {
        targetPosition = new Vector3(path[i].coordinatesX, path[i].coordinatesY, 0f);

        float sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;

        while (sqrRemainingDistance > float.Epsilon)
        {
            transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
            sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
            yield return null;
        }

        position = transform.position;
    }
    //Next Step
}
person itectori    schedule 04.06.2017
comment
спасибо, то, что вы сказали, дало мне представление о том, как справиться с моей проблемой, спасибо :) - person Paco Martos Triguero; 05.06.2017
comment
Старый пост, но я думаю, что плохо писать функцию несколько раз для одной сопрограммы. - person ForceVII; 15.03.2021