Перекат — это базовая механика, которая часто встречается в играх с видом от третьего лица. Она позволяет персонажу быстро перемещаться по локации и избегать повреждений от атак врагов.
В Unity реализовать механику перекатов можно несколькими способами. В этой статье мы рассмотрим один из наиболее простых и эффективных методов.
Оглавление
Создание компонентов
Для реализации механики перекатов нам понадобятся следующие компоненты:
- Rigidbody — отвечает за физическую модель персонажа.
- Animator — отвечает за анимацию персонажа.
- CapsuleCollider — отвечает за коллизию персонажа.
Настройка компонентов
Для начала зададим свойства компонента Rigidbody.
- Mass — масса персонажа. Чем больше масса, тем медленнее будет происходить рывок.
- Drag — сила сопротивления воздуха. Чем больше сила сопротивления, тем медленнее будет происходить перекат.
- AngularDrag — сила сопротивления вращения. Чем больше сила сопротивления, тем медленнее будет происходить вращение персонажа во время переката.
Далее зададим свойства компонента CapsuleCollider.
- Radius — радиус капсулы.
- Height — высота капсулы.
Наконец, зададим свойства компонента Animator.
- Add State — добавим новый стейт под названием Roll.
- Add Transition — добавим переход из состояния Idle в состояние Roll.
- Add AnimationClip — добавим анимацию переката.
Написание скрипта
Для реализации логики рывка нам понадобится следующий скрипт:
using UnityEngine;
public class Roll : MonoBehaviour
{
public float rollSpeed = 5.0f;
public float rollDuration = 1.0f;
private Rigidbody rigidbody;
private CapsuleCollider capsuleCollider;
private void Start()
{
rigidbody = GetComponent<Rigidbody>();
capsuleCollider = GetComponent<CapsuleCollider>();
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Ground")
{
// Останавливаем перекат
rigidbody.velocity = Vector3.zero;
capsuleCollider.isTrigger = true;
// Переходим в исходное состояние
GetComponent<Animator>().SetTrigger("EndRoll");
}
}
private void Update()
{
// Применяем силу, которая заставляет персонажа перекатываться
rigidbody.AddForce(Vector3.down * rollSpeed, ForceMode.Impulse);
// Уменьшаем время переката
rollDuration -= Time.deltaTime;
// Если время переката закончилось, то останавливаем перекат
if (rollDuration <= 0.0f)
{
rigidbody.velocity = Vector3.zero;
capsuleCollider.isTrigger = true;
// Переходим в исходное состояние
GetComponent<Animator>().SetTrigger("EndRoll");
}
}
}
Этот скрипт выполняет следующие действия:
- При инициализации скрипта он получает доступ к компонентам Rigidbody и CapsuleCollider.
- При столкновении с объектом с тегом «Ground» скрипт останавливает перекат и переходит в исходное состояние.
- В каждом кадре скрипт добавляет силу, которая заставляет персонажа перекатываться.
- Скрипт также отслеживает время переката. Если время переката закончилось, то скрипт останавливает перекат и переходит в исходное состояние.
Тестирование
Чтобы протестировать механику перекатов, создайте новый проект в Unity и добавьте в него созданный нами скрипт. Затем создайте объект с этим скриптом и запустите игру.
Для того чтобы выполнить перекат, нажмите и удерживайте клавишу Ctrl и нажмите клавишу Пробел.
Дополнительные возможности
Кроме того, в механику рывков можно добавить следующие возможности:
- Возможность регулировать скорость переката с помощью параметров скрипта.
- Возможность выполнять перекат в любом направлении.
- Возможность выполнять перекат в воздухе.