Unity Vector2.MoveTowards на определенное количество времени - PullRequest
0 голосов
/ 16 февраля 2019

У меня проблемы с настройкой AI для моего NPC.Я хотел, чтобы он обходил случайные точки на моей карте и убегал от игрока, когда он рядом.Когда я гоняюсь за своим NPC, все хорошо.Я помещаю runToRandomLocation () в метод Update ().

void runAway()
{
    if (!isDead)
    {
        transform.position = Vector2.MoveTowards(transform.position, player.transform.position, -movementSpeed * 1.5f * Time.deltaTime);            
    }
}

void runToRandomLocation()
{
    if (!isDead) {

        if (Vector2.Distance(transform.position, player.transform.position) > 3)    // if player is not near
        {
            if (Vector2.Distance(transform.position, randomDestination) <= 2)   // when NPC is close to destination he sets another
            {
                randomDestination = new Vector2(Random.Range(-11, 11), Random.Range(-5, 5));
            }
            else
            {
                transform.position = Vector2.MoveTowards(transform.position, randomDestination, movementSpeed * Time.deltaTime);   // NPC is just walking from point to point
            }
        }
        else
        {
            runAway();  // if player is near
        }
    }
}

1 Ответ

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

Вы генерируете новый случайный пункт назначения только при достижении предыдущего пункта назначения.Кажется, что здесь происходит то, что после того, как NPS убежал достаточно далеко, он продолжит движение к последнему случайному пункту назначения, который у него был до , и поэтому он вернется.Возможно в направлении игрока.Таким образом, после одного кадра он снова приближается к игроку и снова убегает.Затем снова возвращается к старому месту назначения и т. Д. В цикле.Что вам нужно, это просто восстановить случайный пункт назначения, когда он убежит. Для этого вам понадобится какой-то конечный автомат, как отметил @Retired Ninja, но на самом деле он очень примитивный.Например, что-то вроде этого должно работать:

private bool onTheRun = false;

void regenDestination() {
    randomDestination = new Vector2(Random.Range(-11, 11), Random.Range(-5, 5));
}

void runAway() {
    if (!isDead) {
        transform.position = Vector2.MoveTowards(transform.position, player.transform.position, -movementSpeed * 1.5f * Time.deltaTime);
        onTheRun = true;
    }
}

void runToRandomLocation() {
    if (!isDead) {

        if (Vector2.Distance(transform.position, player.transform.position) > 3)    // if player is not near
        {
            if (onTheRun)
            {
                regenDestination();
                onTheRun = false;
            }
            if (Vector2.Distance(transform.position, randomDestination) <= 2)   // when NPC is close to destination he sets another
            {
                regenDestination();
            } else {
                transform.position = Vector2.MoveTowards(transform.position, randomDestination, movementSpeed * Time.deltaTime);   // NPC is just walking from point to point
            }
        } else {
            runAway();  // if player is near
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...