Искать

Программирование на C# в Unity для начинающих

Вы хотите начать изучать программирование в Unity, чтобы приступить к созданию своей первой игры, но не знаете с чего начать. Мы поможем вам. Здесь представлена сводка по скриптовым элементам в Unity и приводятся учебные материалы, которые вы можете использовать, чтобы перейти к более сложным проектам наподобие "Space Shooter". Вы познакомитесь с основами программирования, узнав, что такое переменные, функции и классы, и как использовать их.

Перейдите сюда, если вы опытный программист, но новичок в Unity.

Что такое скрпитинг в Unity?

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

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

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

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

Какие языки можно использовать в Unity?

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

Язык, используемый в Unity, называется C# (произносится "си шарп"). Все языки, с которыми Unity имеет дело, являются объектно-ориентированными скриптовыми языками. Подобно любому языку, скриптовые языки имеют синтаксис (как бы части речи), и первичные элементы этого языка называются переменными, функциями и классами.

Если вы используете версию Unity до 2017.3, вы заметите, что он имеет текстовой редактор под названием MonoDevelop: он может помогать нам с завершением написания кода, указывать на неправильно написанные части кода, и он также дает нам возможность использовать сокращения. Начиная с версии 2018.1, вы также можете использовать Visual Studio for Unity Community или другие текстовые редакторы, такие как Visual Studio, Notepad или Sublime Text.

Далее представлен скрипт с образцом кода в нем (на основе учебного материала Программирование в Unity для чайников):

sample code unity

Как вы видите, в программном коде присутствуют переменные (variables), функции (functions) и классы (classes).

Что они делают?

Переменные содержат значения и ссылки на объекты (вы можете рассматривать объекты как “более крупные” переменные). Они подобны ящику, содержащему что-то для использования. Переменные начинаются с маленькой буквы.

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

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

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

Переменные

В Unity скрипты начинаются с выкладки вверху необходимых вам инструментов, и обычно этим является объявление переменных. Вы может увидеть объявленные переменные, нажав сюда, с ключевыми словами “public” или "private" перед ними, за которыми следует тип переменной и имя переменной.

variables in unity

Есть несколько типов видимости переменных, указываемых при их объявлении, но наиболее важными из них являются public (общие переменные) и private (частные переменные).

Если вы в редакторе кода создадите скрипт с приведенным выше текстом, а затем вернетесь в Unity и припишите этот скрипт объекту GameObject, вы увидите, что вам доступна переменная типа Light, объявленная как общая (public), но вы не видите частной переменной (private). Это происходит из-за того, что переменная, объявленная как частная (private), может быть доступна только из частного скрипта в пределах частного класса.

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

Есть множество причин для выбора между private и public. Благодаря частным переменным (private) ваш код становится более ясным, поскольку вы знаете, что значения таких переменных могут изменяться только из ее класса. И тем самым облегчаются отладка и поддержка программного кода.

Если вы выбрали для переменной вариант “public” и столкнулись с проблемой, тогда вам придется пересмотреть весь программной код, чтобы найти источник проблемы, так как любой другой объект имеет доступ к этой переменной. Однако, если вы хотите, чтобы объекты взаимодействовали друг с другом, вам потребуются некоторые переменные (или функции) типа public.

Другим важный аспектом переменной является ее тип. Тип определяет, какого рода переменная содержится в памяти, например, это может быть число, текст или более сложный тип как на экранном снимке ниже: Transform, Light и Demo Script на снимке ниже являются в действительности ссылками на компоненты (Components). Unity необходимо знать, к какому типу относится объект, чтобы знать, как обращаться с ним.

variables in unity inspector

Другим важным аспектом переменной является ее имя. Главное, что вы должны помнить относительно имен переменных, это то, что имя переменной не может начинаться с цифры и не может содержать пробелов. Поэтому существует стиль наименования переменных. В языке C# имена принято писать по типу camelCase: вы начинает писать имя с маленькой буквы и добавляете без пробелов слова с большой буквы, например "myLight".

Когда Unity компилирует скрипт, он делает общие переменные (public) видимыми в редакторе. См. внизу экранный снимок из Инспектора.

demo script unity inspector

Функции

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

functions in unity

Awake вызывается только раз, когда инициализируется GameObject с таким компонентом. Если объект GameObject неактивен, то он не будет вызываться, пока не станет активным. Однако, Awake вызывается даже в случае, если GameObject активен, но компонент не включен (когда стоит флажок в поле рядом с его именем). Вы можете использовать Awake для инициализации всех переменных, которым вам нужно приписать значение.

Start - подобно Awake, функция Start будет вызываться, когда GameObject активен, но лишь в случае, если компонент включен. Для получения более подробной информация об отличиях от Awake посмотрите это видео.

Update вызывается один раз за каждый кадр. Благодаря этой функции постоянно обновляются результаты согласно непрерывно действующей логике, такие как анимации, действия ИИ и т.д.

FixedUpdate используется для расчетов физики.

Функции Fixed Update и Update описаны в учебном разделе по скриптам, и вы можете узнать как вызывать изменения в каждом кадре с помощью функций Update и FixedUpdate, и об их отличиях.

LateUpdate - функция, аналогичная Update, но LateUpdate вызывается в конце кадра. Unity просматривает все игровые объекты, находит все Update и вызывает LateUpdate. Этот прием хорошо использовать для таких элементов, как камера. Скажем, вы хотите переместить персонажа в своей игре. И затем он сталкивается с другим персонажем и оказывается в другой позиции. Если мы будем перемещать камеру во время перемещения персонажа, получится болтанка, и камера окажется не там, где она должна быть. Так что этот второй цикл оказывается как нельзя кстати.

Написание функций

При написании функций помните, что функция начинается с типа возвращаемого значения, за которым следует имя функции, а затем параметры в скобках (если имеются). Имя функции начинается с заглавной буквы, а тело функции пишется в фигурных скобках. Вот пример написания функции:

writing functions unity

Как вызвать эту функцию?

function-in-unity

Функции могут проводить вычисления и возвращать значения. Вы также можете просить функции сделать что-либо, обрабатывать информацию и возвращать ответ. Если вы используете тип "void", тогда функция не возвращает ничего.

Классы

Классы представляют собой совокупности переменных и функций. Например, следующий скрипт образует класс:

class example in Unity

Учтите, что имя класса должно совпадать с именем файла скрипта C#. И чтобы быть прикрепленным к GameObject, он должен наследоваться из другого класса под названием MonoBehaviour, который автоматически вставляется, когда вы начинаете создавать скрипт. Классы также могут быть общими (public) и частными (private).

Если вы создаете пользовательский класс, как в приведенном ниже примере, вы должны попросить Unity сериализировать его. Это означает, класс будет преобразован в простую форму, отображаемую в Unity. Сделав это, вы увидите свой класс в Инспекторе.

classes in unity example

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