Арена
Часть раздела Физика и игровой процесс путешествия по 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 без трения: трение пола в сочетании с демпфированием снизило бы их максимальную скорость.
Задание
СреднеЗапусти 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()
{
// установи демпфирование, затем перемещай игрока клавишами со стрелками
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора