Как мы обсуждали ранее пустой игровой объект по умолчанию имеет только имя (тэг, слой), местоположение, масштаб и ориентацию в пространстве. Подробности в статье https://dzen.ru/a/Za437i6Q937jiND_
Чтобы объект стал персонажем, источником освещения или камерой нужно добавить ему определенные компоненты, которые определят функциональное назначение этого объекта.
Композицией нескольких компонентов можно создавать абсолютно уникальные игровые объекты! Например, дерево, автомобиль или персонажа. Добавляя объектам различные компоненты можно наделить их уникальными свойствами (звук, свет, движение, физика и многое другое).
Unity имеет большое количество различных типов встроенных компонентов, но при этом вы можете создавать свои собственные компоненты с помощью скриптов (Unity Scripting API). Скрипты в Unity — это компоненты, которые разработчик игр создает самостоятельно для реализации каких-то уникальных свойств и возможностей игровых объектов, которые невозможно сделать при помощи встроенных компонентов Юнити. Скриптов у объекта может быть несколько. Например, один скрипт будет отвечать за здоровье персонажа, другой за его перемещение, третий за взаимодействие с другими персонажами и так далее...
Чтобы добавить или создать новый скрипт для игрового объекта выберите этот объект в панели иерархии, затем в панели инспектора нажмите кнопку "Add Component". В поисковой строке наберите "script" и выберите из предложенных вариантов списка пункт "New script". Затем введите название скрипта – TestScript и нажмите ниже кнопку «Create and Add». В названии скрипта можно использовать только английский алфавит и знак подчеркивания, никакие пробелы в имени скрипта недопустимы.
В панели Инспектора появится новый компонент TestScript, а в панели Проекта вы увидите новый файл скрипта.
Чтобы открыть скрипт нужно кликнуть два раза по полю с названием скрипта в компоненте (на скрине отмечено оранжевой галочкой) или по иконке скрипта в панели Проекта. В этой подборке мы будем работать с кодом в среде Microsoft Visual Studio. Но можно использовать и любую другую среду для написания кода, содержимое скрипта все равно будет абсолютно одинаковым. Чтобы привязать среду Microsoft Visual Studio к редактору Unity, воспользуйтесь материалом из статьи по ссылке https://dzen.ru/a/Y_HtuNSznj1qyrsP
Рассмотрим структуру скрипта.
Первые три строки, начинающихся с using – это подключение необходимых библиотек.
Далее идет тело самого скрипта – строка №5 сообщает нам о том, что это публичный класс с названием «TestScript». Название класса обязательно должно совпадать с названием самого скрипта, поэтому ничего менять здесь не нужно. Понятие класса вводится в объектно-ориентированном программировании — это обширная тема, в которую мы сейчас не будем углубляться. Если вы не знакомы с ООП, то воспринимайте класс как своего рода шаблон нового компонента, который вы затем можете прикрепить к любому игровому объекту. Вся реализация этого шаблона будет находиться внутри фигурных скобок на строках 6 и 18.
Фигурные скобки в программировании ограничивают и разделяют блоки кода, в данном случае эти скобки ограничивают код нашего будущего компонента. Скобки всегда идут парами – если есть открывающаяся скобка, то обязательно должна быть парная закрывающаяся! Очень частая ошибка – это нехватка парной скобки, например, вы ее случайно удалили, тогда игра не запустится и в редакторе Unity появятся ошибки. Поэтому для удобства чтения своего кода и предотвращения таких ошибок очень важно поддерживать структуру кода!
Теперь посмотрим на внутренний код класса, который находится внутри первой пары фигурных скобок. Там располагаются еще две отдельные структуры, каждая из которых имеет собственные парные фигурные скобки.
Первая структура - метод Start, который вызывается игровым движком Unity всего один раз до начала игрового процесса, то есть до отрисовки первого кадра. Код метода Start также ограничен парными фигурными скобками.
Метод Update вызывается на протяжении всей игры при отрисовке каждого кадра. Здесь может быть описано движение, ответная реакция на ввод пользователя, любые действия, которые изменяются с течением времени в игровом процессе. Код метода ограничен еще парой фигурных скобок.
Таким образом мы получаем вложенную структуру, которую можно представить в виде коробок. Первая главная «коробка» – это класс, шаблон нашего компонента. Парные фигурные скобки формируют нам оболочку «коробки». Если хотя бы одна скобка пропадет, то оболочка «коробки» будет нарушена и игровой движок Unity не сможет ее «закрыть» и использовать.
Внутри этой главной «коробки» находятся еще две, которые содержат код методов Start и Update. Парные фигурные скобки сохраняют целостность этих внутренних «коробок». Если хотя бы одна скобка пропадет, то содержимое перемешается и игровой движок Unity не сможет разобраться какой код выполнять при запуске игры, а какой при перерисовке кадра.
Грубо работу игрового движка Unity при запуске игры можно представить так - Unity перебирает все объекты, находящиеся на игровой сцене, и выполняет код, который написан в фигурных скобках метода Start для каждого объекта, к которому прикреплен скрипт. Скрипты могут быть разные, в методе Start может быть написан разный код, но он должен быть выполнен для всех игровых объектов, у которых он написан. В методе Start обычно пишется код по первоначальной инициализации переменных и компонентов.
Аналогично происходит и для метода Update, только все это делается каждый кадр, например, 60 раз в секунду.
В методе Update размещается код, который реализует ответную реакцию игрового объекта на ввод пользователя - движение, действия объекта. То есть всё, что должно быть обработано с течением времени в игровом процессе.
Чтобы управлять игровым объектом и менять его состояние через скрипт, необходимо обратиться к свойствам компонентов игрового объекта и изменить их. В этом и заключается вся магия игровых движков – в скриптах можно делать с игровым объектом почти всё, что угодно!
Для начала попробуем узнать имя и позицию нашего игрового объекта. Если посмотреть в игровом редакторе на объект круга, то в инспекторе мы увидим имя, компоненты «Transform» и «Sprite Renderer», а также и компонент скрипта.
Все они принадлежат одному игровому объекту, а значит между ними есть связь, которой мы и воспользуемся.
Чтобы в скрипте получить доступ до других компонентов объекта необходимо использовать специальный метод, при помощи которого можно обратиться к любому компоненту.
Как в математике существуют определенные правила записи выражений, так и в языках программирования есть свои правила синтаксиса. Синтаксис этого метода выглядит следующим образом:
Сам метод называется GetComponent<>(). В угловых скобках нам необходимо написать название компонента, к которому мы хотим обратиться, а потом через точку, можно указать любое свойство этого компонента, чтобы узнать его значение.
Например, чтобы обратиться к свойству Position компонента «Transform» нужно написать следующий код:
GetComponent<Transform>().position
Чтобы обратиться к свойству Sprite компонента «Sprite Renderer», потребуется следующий код:
GetComponent<SpriteRenderer>().sprite
В коде названия компонентов записываются без пробелов, а свойства с маленькой буквы. Также написание некоторых свойств в коде может немного отличаться названия в редакторе Unity. Например, свойство «Order in Layer» компонента «Sprite Renderer» в коде будет выглядеть так:
GetComponent<SpriteRenderer>().sortingOrder
Только для имени объекта и компонента Transform (т.к. только они являются обязательными для всех игровых объектов) существует более простой и удобный доступ. К имени объекта можно обратиться просто написать name. Аналогично для компонента Transform можно использовать быстрый доступ при помощи слова transform (с маленькой буквы). До любых других компонентов получить доступ можно только при помощи метода GetComponent<>().
Попробуем разные варианты доступа до имени объекта и напишем следующие команды в методе Start. Что такое Debug.Log и зачем нужна эта команда можно почитать в статье https://dzen.ru/a/Zbd_J6TwtSEEHWyt
Сохраним скрипт и запустим игру в игровом движке. На консоли мы увидим две одинаковые строки с именем персонажа. Подробнее про консоль и кнопки управления можно почитать в статье https://dzen.ru/a/Zbd4hqTS2lcYoPXU
Перемещение в играх может быть разным в зависимости от типа, жанра, используемых механик и т.д. Это может быть перемещение только по горизонтали, как в простых двумерных раннерах, или перемещение в плоскости поверхности в любом направлении, как в трехмерных бродилках. Поэтому в Unity реализация движения персонажа зависит от разработчика. Чтобы реализовать самое простое, не зависящее от пользователя, перемещение игрового объекта вправо, необходимо увеличивать координату X свойства «Position» компонента «Transform» каждый кадр.
В Unity изменять позицию можно только целиком как вектор, нельзя изменить только одну координату. То есть вот такая запись будет некорректна:
transform.position.x = transform.position.x + 0.01f;
Правильная запись:
transform.position = transform.position + new Vector3(0.01f, 0, 0);
Подробнее про переменные, примитивные типы и тип Vectorможно почитать в статье https://dzen.ru/a/ZdLo9tHxawyW7tHU
Движок Unity вызывает метод Update() для каждого нового кадра, поэтому игровой объект будет изменять позицию на 0.01 единицу вправо в каждом новом кадре по сравнению с предыдущим, что создаст иллюзию непрерывного движения игрового объекта вправо.
void Update()
{
transform.position = transform.position + new Vector3(0.01f, 0, 0);
}
Если запустить игру, то мы увидим, как объект круга переместится вправо.
Проверьте свой скрипт:
Таким образом можно в скриптах обращаться к свойствам игрового объекта, изменять их и воздействовать на игровой объект в целом.
Примеры использования переменных в скриптах можно посмотреть в статьях: