Menu
CoddyTech

Преследование игрока

Часть раздела Физика и игровой процесс путешествия по 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 преследователя: так он окажется внутри стены так же легко, как где угодно ещё, и физический движок сможет вытолкнуть его обратно только после этого.

challenge icon

Задание

Средне

Валун катится за игроком. Напиши скрипт 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()
    {
        // толкай валун по земле в сторону игрока
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс