Арена
Часть раздела Физика и игровой процесс путешествия по 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 без трения: если бы к сопротивлению добавилось трение пола, максимальная скорость была бы ниже.
Задание
СреднеНачни Arena Escape: игрок скользит под действием сил.
- В
Start(), после строки сGetComponent, задайrb.linearDamping = accel / topSpeed;, чтобы скорость стабилизировалась околоtopSpeed. - В
FixedUpdate()создайnew Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")). - Передай в
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()
{
// задай затухание, затем перемещай игрока стрелками
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity