Поиск по сайту:

Как написать контроллер персонажей на основе физики в Unity3D


Заставьте своего игрока двигаться с помощью встроенного физического кода Unity.

Контроллер персонажа может помочь вам реализовать в игре простую физику движений.

К контроллерам персонажей Unity3D можно подойти с нескольких точек зрения. Если вы используете библиотеку с мощными классами и функциями, создание контроллера персонажа на основе физики может стать интересным началом разработки игры.

Шаг 1. Создайте сцену с объектами игрока и местности

После того, как Unity открыт и вы создали новый проект, вы можете начать с добавления пары объектов в свою сцену. Вы можете создавать эти объекты в любом порядке, но будьте осторожны и убедитесь, что используете правильные настройки. Хотя этот проект является базовым, он является отличным способом начать работу с Unity.

3D-плоскость для ландшафта

Первый объект, который нужно добавить в сцену, — это плоскость. Щелкните правой кнопкой мыши внутри панели иерархии, наведите указатель мыши на 3D-объект и выберите Плоскость из списка. Вы можете отрегулировать размер плоскости, чтобы обеспечить большую зону тестирования, но больше ничего с ней делать не нужно.

Модель объектного проигрывателя куба

Далее пришло время добавить на сцену куб, который будет служить моделью игрока. Щелкните правой кнопкой мыши внутри панели иерархии, наведите указатель мыши на 3D-объект и выберите Куб в раскрывающемся меню. Расположите новый куб так, чтобы он находился над добавленной вами плоскостью. Вам также необходимо добавить компонент твердого тела, чтобы превратить куб в физический объект.

Выберите куб и перейдите в Инспектор. Нажмите Добавить компонент в нижней части панели, найдите твердое тело и выберите Rigidbody из списка, когда он появится. Установите флажок Использовать гравитацию и оставьте остальные настройки без изменений.

Вы можете найти в Интернете бесплатные ресурсы Unity, которые помогут украсить ваш проект.

Камера от третьего лица

В вашей сцене уже должна быть камера, которую вы можете использовать в качестве камеры от третьего лица. Расположите камеру так, чтобы она находилась в удобном положении от третьего лица над вашим кубом. Перейдите на панель иерархии, прежде чем перетаскивать камеру на куб, чтобы создать связь родитель-потомок. После этого камера автоматически проследит за вашим кубом.

Быстрый тест

Хотя в вашей сцене еще нет кода, вы можете протестировать проделанную работу. Нажмите кнопку Играть в верхней части экрана, чтобы загрузить игру. Вы должны увидеть, как куб падает и приземляется на вершину плоскости, а камера должна следить за падением куба.

Шаг 2. Настройка файла C#

Теперь пришло время создать файл C#, чтобы вы могли начать программировать некоторые движения. Перейдите в раздел «Проект», щелкните правой кнопкой мыши, наведите курсор на «Создать» и выберите «Папка» из списка. Назовите папку «Сценарии» или что-то подобное.

Перейдите в новую папку и повторите процесс, но выберите C# Script из списка. Вы можете дать этому файлу любое имя, но это также будет имя основной функции внутри него. Убедитесь, что ваш новый C# выглядит так.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character_Control: MonoBehaviour {
    void Start() {
    }
    void Update() {
    }
}

Шаг 3. Используйте C# для создания движения вперед и назад со скоростью

Прежде чем добавлять функции в файл сценария, объявите некоторые общедоступные переменные. Прежде всего, это Rigidbody для хранения модели игрока. Также объявите float, чтобы отслеживать скорость движения. Эти переменные входят в основной класс вне каких-либо функций.

public Rigidbody rigidbody;
public float speed;

Далее пришло время добавить одну строку кода в функцию «Пуск». При этом используется объявление GetComponent для назначения жесткого компонента куба созданной вами переменной твердого тела.

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

Теперь вы можете добавить код, который заставит вашу модель игрока двигаться. Этот код красивый и простой; вам просто нужны два оператора if: один для движения вперед и один для движения назад. Вы можете использовать Input.GetKey, чтобы определить, когда нажимается клавиша. В данном случае вас ждут нажатия клавиш W и S.

Нажатие любой из этих клавиш добавляет силу к жесткому телу куба с помощью методаrigidbody.AddForce. Вы можете рассчитать направление и скорость добавленной силы, умножив ее положение по оси Z (transform.forward) на переменную скорости. Не существует класса Transform.backward, который можно было бы использовать для движения назад, но это достижимо путем умножения Transform.forward на -1.

if (Input.GetKey("w")) {
    rigidbody.AddForce(transform.forward * speed);
}
if (Input.GetKey("s")) {
    rigidbody.AddForce((transform.forward * -1) * speed);
}

Сохраните файл C# и вернитесь в Unity. Найдите сценарий на панели «Проект» и перетащите его на куб модели персонажа внутри иерархии, чтобы назначить сценарий этому объекту. Когда вы выбираете куб, вы должны увидеть сценарий как компонент на панели инспектора. Щелкните внутри поля переменной твердого тела и выберите твердое тело вашего куба.

Теперь вы можете использовать кнопку «Воспроизвести», чтобы запустить игру и проверить свой код. Но ждать! Есть проблема; ваш куб будет катиться, а не двигаться прямо вперед. Вернитесь к инспектору куба, найдите компонент Rigidbody и установите флажки «Заморозить вращение» по осям X и Z, прежде чем снова запустить игру. Теперь это должно работать.

Шаг 4. Используйте C# для создания поворота влево и вправо с помощью крутящего момента

В отличие от движения вперед и назад, для поворота вашей модели игрока Cube требуется сила, называемая крутящим моментом. Для этого вам понадобится еще одна переменная: общедоступное число с плавающей запятой для присвоения значения крутящего момента.

public float torque;

Код поворота влево и вправо в этом сценарии очень похож на код, используемый для перемещения вперед и назад. Для каждого направления существует оператор if, который отслеживает нажатия клавиши D (поворот направо) или клавиши A (поворот налево).

Первым шагом в каждом операторе if является определение направления поворота с помощью метода Input.GetAxis и присвоение результата переменной с плавающей запятой. После этого используйте твердое тело.AddTorque, чтобы применить силу вращения к модели персонажа куба, умножив крутящий момент, поворот и ось Z куба.

if (Input.GetKey("d")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}
if (Input.GetKey("a")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

Сохраните свой код и вернитесь в Unity, чтобы протестировать его. Вы можете настроить скорость и время нарастания вращения модели игрока, выбрав куб и отредактировав переменные массы, сопротивления и крутящего момента твердого тела в своем скрипте. В этом примере проекта используются 1 масса, 1 сопротивление и 2 крутящего момента.

Шаг 5. Используйте C# для программирования прыжков

В качестве последнего элемента контроллера персонажа Unity пришло время создать прыжок. Создание прыжка сложнее, чем создание других базовых элементов управления, над которыми вы работали, поскольку прыжок должен иметь ограниченную высоту. Начните с добавления частной логической переменной, чтобы отслеживать, прыгает ли игрок.

private bool isJumping = false;

Эта переменная ничего не будет делать без оператора для ее проверки. В этом случае базовый оператор if, проверяющий, является ли переменная ложной, поможет. Добавление того же условия к другим операторам движения if не позволит игроку двигаться во время прыжков.

if (!isJumping) {
}

Добавление того же условия к другим операторам движения if не позволит игроку двигаться во время прыжков.

if (Input.GetKey("w") && !isJumping) {
    rigidbody.AddForce(transform.forward * speed);
}

Внутри оператора !isJumping if вам понадобится еще один оператор if, на этот раз для проверки нажатия кнопки перехода. Присвоение переменной isJumping значения true — это первое, что нужно сделать в этом операторе if, а затем сделать объявление жесткого тела.angularVelocity, чтобы удалить силы, приложенные в данный момент к кубу.

Теперь вы можете использовать объявление твердого тела.AddForce, чтобы добавить силу к кубу по его оси Z, создавая движение прыжка вверх. Наконец, пришло время использовать объявление вызова для вызова другой функции через 0,8 секунды.

if (!isJumping) {
    if (Input.GetKeyDown("space")) {
        isJumping = true;
        rigidbody.AddForce(transform.up * speed * 120);
        rigidbody.angularVelocity = Vector3.zero;
        Invoke("Move_Setter", 0.8 f);
    }
}

Эта функция возвращает переменную isJumping в значение false, чтобы движение/прыжки снова стали возможными, а задержка в 0,8 секунды предотвращает слишком раннее срабатывание.

void Move_Setter() {
    isJumping = false;
}

Шаг 6. Проверьте код контроллера вашего персонажа

Сохраните файл и вернитесь в Unity, чтобы протестировать написанный вами код. Как и большинство компиляторов, Unity предоставляет информацию об ошибках и других проблемах с вашим кодом, чтобы было легче увидеть, что вам, возможно, придется изменить. Полный код этого проекта можно просмотреть на нашей странице GitHub.

Создание контроллеров персонажей Unity

При создании контроллера персонажа в Unity вы можете выбирать из множества различных подходов. Использование физики — один из вариантов, но вы также можете использовать встроенную систему контроллера персонажа, если хотите.

Изучение различных вариантов, подобных этому, — отличный способ узнать о таких инструментах, как Unity.

Статьи по данной тематике: