Вы генерируете новый случайный пункт назначения только при достижении предыдущего пункта назначения.Кажется, что здесь происходит то, что после того, как 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
}
}
}