Преследование игрока
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 50 из 63.
Враг, преследующий игрока, должен иметь 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: он набирает скорость, сохраняет инерцию и пролетает мимо, когда игрок отходит в сторону. Не перемещай Transform преследователя: так он окажется внутри стены так же легко, как где угодно ещё, и физический движок сможет вытолкнуть его обратно только после этого.
Задание
СреднеВалун катится за игроком. Напиши скрипт Boulder для валуна — шара с компонентом Rigidbody. В Inspector назначь ему player (объект Player) и force (6). Скрипт Player уже готов: стрелки перемещают игрока.
- На каждом физическом шаге толкай валун к игроку с помощью
AddForce, прикладывая силуforce, независимо от того, близко игрок или далеко. - Толкай только вдоль земли, без составляющей вверх или вниз, даже если игрок стоит на краю платформы.
- Не перемещай его Transform и не замораживай вращение: трение заставляет его катиться.
Нажми Play, побегай кругами вокруг валуна, затем нажми Check.
Попробуйте сами
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 для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора