Рубрики: C Sharp

Unity – Движение персонажа по вектору камеры (3D)

unityunityДолго-долго откладывалась эта тема для публикации, но сейчас было накоплено уже немеренно материала, которым будет интересно поделиться. Тема этой статьи “Движение персонажа по вектору камеры” или “Движение персонажа “куда смотрит камера””. Сам очень долго искал материалы на эту тему и решил начать именно с нее, так как потратил достаточно много времени и в итоге все равно пришлось брать несколько решений и адаптировать под свои нужны. Сразу скажу, статей будет много. Это инди-проект по разработке игры. Сама по себе концепция простая, но делался он для получения опыта. Проект написан не на var-ах и хорошо прокомментирован. Хотелось сделать хорошо настолько, насколько позволяли представления о игростроении. Язык использовался – C#/C Sharp.

Движение персонажа по вектору камеры в Unity.

Для начала давайте определимся с системой. Она должна работать по следующему принципу:

  1. W,A,S,D направляют персонажа вперед/влево/назад/вправо относительно вектора камеры. То есть куда бы не смотрела камера, персонаж при нажатии клавиш двигался в соответствующих направлениях.
  2. В своем проекте я хотел, чтобы физика принимала непосредственное участие в передвижении персонажа, поэтому в систему передвижения необходимо, чтобы персонаж учитывал предыдущее направление движения, чтобы создавать ощущение применения усилия.
  3. При нажатии клавиш W/A, S/A, W/D, S/D – персонаж двигался по диагонали относительно вектора камеры.
  4. В прыжке, нажатие клавиш так же учитываться.
  5. Если в прыжке не нажата ни одна клавиша, персонаж прыгает просто вверх.
  6. Должно учитываться условие “на земле ли персонаж”.
  7. Так же, я не хочу, чтобы у игрока была возможность передвигаться после надписи “Game Over”, в случае проигрыша.

Итак, что мы сделали: составили техническое задание с проработанной логикой движения и применение физики для персонажа. Прежде, чем браться за задачу – ее нужно описать. Далее – если все то, что тут написано, вам необходимо – начинаем кодить. Кстати, учтем, что персонаж должен обладать скоростью передвижения. Это важно, т.к. это отдельная переменная, участвующая в расчетах остальных формул.

Окей, свои “хотелки” мы описали. Поехали:

public GameObject MainCamera; //аттач главной камеры для получения вектора направления движения
public GameObject Player; //Объект игрок

public static bool _gameover; //условие проигрыша

private float speed; //Скорость перемещения
private Rigidbody rb; //Физическое тело
private bool grounded; // На земле ли персонаж?
private bool moveForward; // Двигается вперед персонаж?
private bool moveBack; // Двигается назад персонаж?
private bool moveRight; // Двигается право персонаж?
private bool moveLeft; // Двигается влево персонаж?

//Задаем переменные при старте игры
    void Start()
    {
        grounded = true;
        rb = Player.GetComponent<Rigidbody>();
        _gameover = false;
        speed = 300;
        moveForward = false;
        moveBack = false;
        moveRight = false;
        moveLeft = false;
     }

//Теперь опишем, что должен делать персонаж при нажатых клавишах

void Update()
    {
        //Двигаемся вперед по вектору камеры
        if (Input.GetKey(KeyCode.W) & _gameover == false)
        {
            moveForward = true;
            if (grounded == true)
            {
                rb.AddForce(MainCamera.transform.forward * speed * Time.deltaTime);
            }
            else
            {
                rb.AddForce(0f, 0f, 0f);
            }
        }
        else
        {
            moveForward = false;
        }
        //Движение назад по вектору камеры
        if (Input.GetKey(KeyCode.S) & _gameover == false)
        {
            if (grounded == true)
            {
                rb.AddForce(-MainCamera.transform.forward * speed * Time.deltaTime);
                moveBack = true;
            }
            else
            {
                rb.AddForce(0f, 0f, 0f);
            }
        }
        else
        {
            moveBack = false;
        }

        //Движение вправо по вектору камеры
        if (Input.GetKey(KeyCode.D) & _gameover == false)
        {
            if (grounded == true)
            {
                rb.AddForce(MainCamera.transform.right * speed * Time.deltaTime);
                moveRight = true;
            }
            else
            {
                rb.AddForce(0f, 0f, 0f);
            }
        }
        else
        {
            moveRight = false;
        }
        //Движение влево по вектору камеры
        if (Input.GetKey(KeyCode.A) & _gameover == false)
        {
            if (grounded == true)
            {
                rb.AddForce(-MainCamera.transform.right * speed * Time.deltaTime);
                moveLeft = true;
            }
            else
            {
                rb.AddForce(0f, 0f, 0f);
            }
        }
        else
        {
            moveLeft = false;
        }
    }

Теперь давайте разбираться.

В методе Start():

Инициализируются стандартные значения, а именно:

  1. Персонаж на земле.
  2. rb – эта переменная получает компонент Rigid Body из объекта Player.
  3. Игра не проиграна.
  4. Скорость 300.
  5. Остальные переменные отвечают за флаг движения в любом из четырех направлений.

В методе Update() проверяется значение нажатой клавиши (W,A,S,D), так же проверяется флаг проиграна ли игра и далее начинается что-то странное скажите вы… Но нет, проверяется далее значение “на земле ли персонаж”. Если значение “true”, то к компоненту rb (RigidBody) применяется физическая сила.

“MainCamera.transform.forward/right” – отвечает за определение вектора взгляда камеры.
“speed” – скорость.
“Time.deltaTime” – отвечает за плавность (так как все применяется не в 1/1000 секунды, а сила применяется каждую секунду, плавно и красиво.

Далее мы видим, что проставляется флаг движения, но он относится к прыжкам, которые появятся в следующей статьей. Дальше идет else, который сообщает, что делать, если физическое тело находится не на земле. Соответственно в попытках применить физическую силу на тело ничего не произойдет – потому что такова логика, вектор по нулям – rb.AddForce(0f, 0f, 0f); (Важно: это не ОФ, а ноль и латинская ЭФ)

После чего скобочки и занавес… Вешаете этот скрипт на персонажа. У вас должно в Unity Inspector (правая панель с компонентами, текстурами и т.д.) в окне со скриптом появиться 2 новых поля с названиями: Main Camera и Player. Камеру и персонажа аттачите в соответствующие поля. Далее можно проверять работоспособность кода в плеере. Можете брать этот код и адаптировать под свои нужды. В одной из следующих статей по Unity, я опишу скрипт, который заставляет камеру двигаться за спиной вашего персонажа, она будет такой второй частью или продолжением. Надеюсь, что для вас данная статейка была полезна. Буду искренне рад, если внизу увижу много фидбэка 🙂

Подписывайтесь на нашу группу в ВК и канал Youtube! Большое спасибо за внимание!

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

0

Автор публикации

не в сети 1 час

Vapi

0
Комментарии: 19Публикации: 104Регистрация: 14-04-2017
Vapi

Поделиться
Опубликовал
Vapi

Новаястатья

SQL – получаем активные соединения

Добрый день. В этой статье мы с вами научимся писать запросы, которые выводят активные соединения…

2 недели назад

Готовые шаблоны/шапки YouTube PSD #5

Здравствуйте, уважаемые читатели! Было принято решение 12 числа каждого месяца специально для вас делать ежемесячный…

2 недели назад

HTML – IMG

Всем привет дорогие читатели. В этом посте мы с вами узнаем как вставить картинку в…

2 недели назад

CSS – Отступы

Сегодня мы поговорим про отступы в CSS. В предыдущих статьях неоднократно они использовались для примеров,…

2 недели назад

JavaScript – меняем CSS

Немного отойдем от изучения powershell и добавим JavaScript. Сегодня мы научимся менять CSS на странице…

2 недели назад

Powershell – Операторы сравнения

Уже неоднократно в наших статьях встречались операторы сравнения, например, когда мы разбирали Where-Object. В этой…

2 недели назад
Авторизация
*
*

Login form protected by Login LockDown.


Регистрация
*
*
*
Пароль не введен
Генерация пароля