В функции Update определенно есть что-то подозрительное, потому что вы присваиваете (=
) вместо проверки на равенство (==
) в условии.
Разве вы не имели в виду playerInTerritory == true
?
void Update()
{
if (playerInTerritory)
{
basicenemy.MoveToPlayer();
}
else
{
basicenemy.Rest();
}
}
Если это не помогает, добавьте несколько операторов Debug.Log
в функции входа / выхода триггера, чтобы увидеть, когда они выполняютсязвонил.
Edit
Хорошо, я посмотрел на спиннинг.Если вы хотите, чтобы противник следовал за игроком до тех пор, пока он не окажется в пределах диапазона атаки, у вас будет неправильное вращение и неправильный перевод.
Вращение
// Rotate to look at player
transform.LookAt(target.position);
transform.Rotate(new Vector3(0, -90, 0), Space.Self);
Что это делает, он делаетВраг поворачивается к игроку (который вы хотите), и вторая линия делает вражеский поворот (90 ° против часовой стрелки каждого кадра).Если вы не хотите, чтобы противник вращался, вам не нужна линия.Просто сохраните функцию «Взгляд на».
Перевод
Проблема перевода заключается в том, что вы двигаетесь в направлении оси X , а не в направленииигрок.Вы должны сначала рассчитать вектор направления и перевести его вдоль него.
Суть его всегда:
// normalized, so the vector affects only direction, not speed
Vector3 direction = (FROM.position - TO.position).normalized;
Итак, там:
Vector3 enemyToTargetDirection = (target.position - transform.position).normalized;
enemyToTargetDirection.y = 0; // stay in the same height
transform.Translate(enemyToTargetDirection * speed * Time.deltaTime);
Вы могли бы сделать это так, но я думаю, что это выглядит лучше, когда враг поворачивается к вам постепенно, вместо того, чтобы просто «щелкать» в вашем направлении.В этом случае результирующая функция будет выглядеть следующим образом:
public void MoveToPlayer()
{
Vector3 upwardsAxis = Vector3.up;
float distanceToPlayer = Vector3.Distance(transform.position, target.position);
if (distanceToPlayer > attack1Range)
{
float step = Time.deltaTime * speed;
Vector3 lookDirection = target.position - transform.position;
if (lookDirection != Vector3.zero) // Prevents rotation errors
{
// Rotate over time
Quaternion lookRotation = Quaternion.LookRotation(lookDirection, upwardsAxis);
transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, step * 2);
}
transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}
}
О, и, кстати, для движения / вращения / физики в целом, вы должны использовать FixedUpdate()
вместо обычного Update()
(это делает движение более плавным) и не держите методы «Пробуждение», «Пуск», «Обновление» рядом, если они пусты, поскольку это может повлиять на производительность (незначительно).