Menu
CoddyTech

Арена

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

В этой главе мы создадим 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: игрок скользит под действием сил.

  1. В Start(), после строки с GetComponent, задай rb.linearDamping = accel / topSpeed;, чтобы скорость стабилизировалась около topSpeed.
  2. В FixedUpdate() создай new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")).
  3. Передай в rb.AddForce его normalized, умноженный на accel, с параметром ForceMode.Acceleration.

Нажми «Играть» и скользи по арене. Затем нажми «Проверить».

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

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()
    {
        // задай затухание, затем перемещай игрока стрелками
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity