Преследование игрока
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 52 из 71.
Врагу, который преследует игрока, нужен Rigidbody, чтобы стены останавливали его, а он мог толкать и сам подвергаться толчкам. Само преследование — это скорость, направленная на игрока и задаваемая один раз за шаг физики. Этот зомби движется к тому, что находится в его слоте player:
[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}player.position - rb.position задаёт направление от зомби к игроку. Его y устанавливается в 0, чтобы зомби двигался по ровной поверхности, даже если игрок стоит выше или ниже, а normalized задаёт вектору длину 1, поэтому зомби движется со скоростью speed, независимо от того, находится игрок в 2 или в 20 единицах от него. Новая скорость сохраняет прежнюю скорость по y, поэтому гравитация по-прежнему тянет зомби вниз со ступеньки. У его Rigidbody включён параметр Freeze Rotation, поэтому зомби не опрокидывается во время движения.
Заданная скорость позволяет создать ходока, который сразу начинает движение и поворачивает. Тяжёлого врага, например катящуюся бочку, вместо этого толкают с помощью AddForce в том же FixedUpdate: он постепенно набирает скорость, сохраняет импульс и проскальзывает мимо, когда игрок отступает в сторону.
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);Не перемещай Transform преследователя: так он с той же лёгкостью окажется внутри стены, как и в любом другом месте, и физический движок сможет лишь вытолкнуть его обратно.
Задание
СреднеЗаставь валун катиться за игроком.
- В
FixedUpdate()задайVector3 toPlayer = player.position - rb.position;иtoPlayer.y = 0f;, чтобы толчок оставался направленным вдоль земли. - Вызови
rb.AddForce(toPlayer.normalized * force);— толчок будет одинаковым и вблизи, и вдали. Не блокируй вращение, чтобы трение заставляло валун катиться.
Нажми «Играть» и бегай кругами вокруг валуна. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
public class Boulder : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float force = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// толкнуть валун по земле в сторону игрока
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity