Теперь пришло время написать первый скрипт и добавить движения персонажу Ruby!
Скрипты в Unity скрипты — это компоненты, которые мы можем добавлять и удалять. Скриптов у объекта может быть несколько и каждый скрипт будет задавать ему какие-то определенные свойства и возможности. Например, один скрипт будет отвечать за здоровье персонажа, другой за его перемещение, третий за взаимодействие с другими персонажами и так далее...
Вы просто добавляете скрипт в инспекторе игрового объекта, и любое поведение, которое вы запрограммируете в этом скрипте, будет применено к этому игровому объекту.
Чтобы создать скрипт персонажу выберите его в окне иерархии и в справа в окне Инспектора нажмите кнопку "Add Component". В поисковой строке наберите "script" и выберите из предложенных вариантов списка пункт "New script":
Далее введите название скрипта - RubyController:
В окне Инспектора появится новый компонент RubyController, а в окне Проекта вы увидите новый файл скрипта:
Чтобы открыть скрипт нужно кликнуть два раза по полю с названием скрипта в компоненте (на скрине отмечено красной галочкой) или по файлу скрипта в окне Проекта. Откроем скрипт в среде Microsoft Visual Studio. Вы можете использовать другую среду для написания кода, содержимое скрипта все равно будет абсолютно одинаковым:
Кратко напомню структуру скрипта. Строки 1 - 3 сообщают нам об используемых библиотеках. Строки 5 - 18 содержат код нашего компонента, а точнее класса с названием RubyController. Внутри класса определены два метода:
- Start() - Unity выполняет код внутри Start только один раз при запуске игры;
- Update() - Unity выполняет код внутри Update каждый кадр. В игре (так же, как и в мультфильмах) используются неподвижные изображения, которые демонстрируются с высокой скоростью. Обычно в играх за одну секунду отображается 30 или 60 изображений. Каждое из этих изображений называется кадром . Перед созданием этого образа Unity выполняет код, написанный в функции Update для всех игровых объектов на сцене.
Чтобы заставить персонажа перемещаться необходимо изменять его позицию, то есть координаты в компоненте Transform. Для этого заведем переменную, в которую сохраним текущее значение координат:
Vector2 position = transform.position;
Переменные — это место в памяти вашего компьютера, которому вы даете имя. Позже вы можете использовать это имя для извлечения значения, которое вы там сохранили. В нашем случае имя - position, а значение - transform.position.
Vector2 — это тип данных, который хранит две координаты - x и y, в привычном нам виде. Например, координаты точки (2, 5), где 2 - это значение координаты x, а 5 - координаты y.
Теперь давайте переместим персонажа немного вправо по горизонтали, то есть по оси x:
position.x = position.x + 0.1f;
Оси имеют направление как в математике - ось X направлена вправо, ось Y вверх. Поэтому, когда мы увеличиваем координату x, то персонаж будет перемещаться вправо. Если мы будем уменьшать координату X, то персонаж будет перемещаться влево. Аналогично для оси Y.
Теперь, когда у вас есть новый результат, вам нужно вернуть его компоненту Transform персонажа, чтобы он знал, что нужно переместить игровой объект на 0.1 вправо:
transform.position = position;
Unity выполняет эту функцию для каждого нового кадра, поэтому ваш объект будет перемещаться на 0.1 единицу вправо в каждом новом кадре по сравнению с предыдущим. Это создает иллюзию непрерывного движения игрового объекта вправо.
Вот что должно получиться в скрипте:
Проверьте себя - запустите игру, нажав в Unity на кнопку запуска игры по центру. Убедитесь, что персонаж "убегает" вправо:
Вы создали скрипт для перемещения Ruby. Теперь давайте настроим его так, чтобы движение приводилось в действие нажатием клавиши на клавиатуре.
Вместо постоянного добавления 0.1 к координате X в каждом кадре, нужно добавлять только в том случае, если игрок нажимает клавишу со стрелкой вправо на своей клавиатуре. Когда игрок нажимает клавишу со стрелкой влево, необходимо отнять 0.1 , чтобы объект сместился влево.
Давайте начнем с просмотра настроек ввода по умолчанию , которые определяют, какой тип ввода использует ваша игра:
Зайдите в меню Edit и выберите пункт Project Settings:
В открывшемся окне выберите пункт Input Manager, где перечислены значения осей для всех элементов управления вводом. Значения варьируются от -1 до 1 , в зависимости от того, что делает игрок.
Например, для джойстика на геймпаде горизонтальная ось может быть установлена на:
- -1 когда стик слева
- 0 когда он посередине
- 1 когда справа
Для клавиш клавиатуры ось определяется двумя клавишами:
- Отрицательная клавиша, которая устанавливает ось на -1 при нажатии
- Положительная клавиша, которая устанавливает ее в 1 при нажатии
Если вы посмотрите на горизонтальную ось, вы увидите, что лево (клавиша со стрелкой влево) находится на отрицательной кнопке , а право (стрелка вправо) — на положительной кнопке:
Давайте добавим использование элементов управления в код.
Для этого давайте определим новую переменную, в которую сохраним значение ввода по горизонтальной оси:
float horizontal = Input.GetAxis("Horizontal");
Метод Input.GetAxis возвращает значение от -1 до 1 в зависимости от того. какую клавишу нажал игрок.
Теперь умножим наше постоянное перемещение на 0.1 на это значение пользовательского ввода:
position.x = position.x + 0.1f * horizontal;
Получается, что когда игрок не нажимает клавиши перемещения, значение переменной horizontal равно нулю. Соответственно значение position.x никак не изменится. Если игрок нажмет клавишу влево, значение переменной horizontal будет равно -1, тогда position.x уменьшится на 0.1 и персонаж сместится влево. Если игрок нажмет клавишу вправо, значение переменной horizontal будет равно 1, тогда position.x увеличится на 0.1 и персонаж сместится вправо.
Проверьте код:
И проверьте, что получилось в игре, Ruby должен перемещаться только когда мы нажимаем клавиши стрелок влево или вправо:
Самостоятельно попробуйте реализовать перемещение персонажа вверх и вниз.
А затем проверьте себя: