Menu
CoddyTech

Арена

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 56 из 63.

В этой главе мы создадим Arena Escape. Ты уворачиваешься от охотников на арене, окружённой стенами, пока на тебя накатывают их волны; три попадания завершают забег, а когда последняя волна закончится, откроется выход. В проекте с самого начала есть пять скриптов: Player, Hunter, Spawner, Health и Exit. Последние четыре пока пустые, и в каждом уроке мы заполним один из них.

Игрок движется за счёт сил, а не заданной ему скорости, поэтому отбрасывание охотником добавляется к его движению, а не обнуляется. Одно лишь толкание разгоняло бы его бесконечно, поэтому linearDamping отнимает часть его скорости на каждом шаге: при постоянном толчке скорость выходит на плато примерно на уровне ускорения, делённого на демпфирование. Эти ховер-санки толкаются вперёд, пока зажата клавиша Space:

[SerializeField] private float accel = 12f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
    rb.linearDamping = 2f;
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.Space))
    {
        rb.AddForce(transform.forward * accel, ForceMode.Acceleration);
    }
}

При ускорении 12 и демпфировании 2 санки развивают максимальную скорость около 6 единиц в секунду, а когда клавишу Space отпускают, демпфирование останавливает их, не давая им скользить бесконечно. ForceMode.Acceleration не учитывает массу, поэтому тяжёлые санки разгоняются точно так же, как лёгкие. У коллайдера санок материал PhysicsMaterial без трения: трение пола в сочетании с демпфированием снизило бы их максимальную скорость.

challenge icon

Задание

Средне

Запусти Arena Escape с игроком. В Inspector для скрипта Player заданы значения accel (18) и topSpeed (6). Масса игрока — 2, материал не имеет трения, а остальные четыре скрипта пока остаются пустыми.

  • В Start установи для Rigidbody значение linearDamping равным accel / topSpeed, чтобы скорость игрока стабилизировалась примерно на уровне topSpeed.
  • На каждом шаге физики толкай игрока с помощью стрелок: влево и вправо вдоль x, вверх и вниз вдоль z, используя ForceMode.Acceleration и ускорение accel.
  • Нормализуй направление стрелок, чтобы движение по диагонали не было быстрее движения по прямой.

Нажми Play и покатайся по арене, затем нажми Check.

Попробуйте сами

using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] private float accel = 18f;
    [SerializeField] private float topSpeed = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // установи демпфирование, затем перемещай игрока клавишами со стрелками
    }
}
quiz iconПроверьте себя

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

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