Unity Ai GameObject Увеличивает скорость при движении - PullRequest
0 голосов
/ 08 февраля 2019

Я сделал некоторый код, выполняя поиск врага, если игрок существует или нет, и если игрок существует, иди, чтобы убить его, код работает нормально, но каждый раз, когда враг движется, скорость увеличивается, и я не хочуСкорость вообще увеличилась, так как заставить ее двигаться с той же начальной скоростью без какого-либо увеличения, это мой код

void Update () {
    if (target == null) {
        if (!searchingForThePlayer) {
            searchingForThePlayer = true;
            StartCoroutine (searchForPlayer ());
        }
        return;
    }

    if (Vector3.Distance (target.position, transform.position) < 20) {

        transform.position = Vector2.MoveTowards (transform.position, target.position, 1f * Time.deltaTime);
        if (target.position.x < transform.position.x && !facingRight) 
            Flip ();
        if (target.position.x > transform.position.x && facingRight)
            Flip ();

    } else {

    }

    StartCoroutine (UpdatePath ());
}
IEnumerator searchForPlayer () {
    GameObject sRusult = GameObject.FindGameObjectWithTag ("Player");
    if (sRusult == null) {
        yield return new WaitForSeconds (0.5f);
        StartCoroutine (searchForPlayer ());
    } else {
        target = sRusult.transform;
        searchingForThePlayer = false;
        StartCoroutine (UpdatePath ());
        yield return null;
    }

}
IEnumerator UpdatePath () {
    if (target == null) {
        if (!searchingForThePlayer) {
            searchingForThePlayer = true;
            StartCoroutine (searchForPlayer ());
        }
        yield return null;
    } else {
        if (Vector3.Distance (target.position, transform.position) < 20) {

            transform.position = Vector2.MoveTowards (transform.position, target.position, 1f * Time.deltaTime);
            if (target.position.x < transform.position.x && !facingRight)
                Flip ();
            if (target.position.x > transform.position.x && facingRight)
                Flip ();

        } else {

        }
    }
    // Start a new path to the target position, return the result to the OnPathComplete method

    yield return new WaitForSeconds (1f / 2f);
    StartCoroutine (UpdatePath ());
}

void Flip () {
    Vector3 scale = transform.localScale;
    scale.x *= -1;
    transform.localScale = scale;
    facingRight = !facingRight;
}

1 Ответ

0 голосов
/ 08 февраля 2019

Каждый кадр, в вашем методе Update(), вы запускаете сопрограмму UpdatePath().Затем в UpdatePath() вы запускаете другую сопрограмму UpdatePath().Ни в коем случае вы не запускаете его, так что это гарантирует, что UpdatePath() будет работать вечно.

Поскольку вы также продолжаете запуск нового в Update(), это означает, что вы продолжаете накапливать все больше и больше сопрограмм, что означает, что чем больше запускается игра, тем больше UpdatePath() вызывается в каждом кадре.

другими словами, скорость вашего объекта технически не увеличивается, это просто количество времени, которое вызывается MoveTowards(), что имеет тот же конечный результат.

Что касаетсяисправить, я бы порекомендовал реструктурировать ваш код.Например, я нахожу весьма подозрительным, что Update() и UpdatePath() являются почти идентичными копиями друг друга.Я также нахожу странным, что UpdatePath() начинается в конце своего запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...