C# и еще 7 языков для Unity


Содержание

Введение в программирование C# на Unity

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

Unity поддерживает следующие языки программирования: C# и Javascript. Языки C# и Javascript считаются одними из самых популярных среди программистов. На C# пишутся программы для компьютера, веб приложения, а Javascript активно используется для создания интернет-страниц. В нашем случае:

Установка среды разработки

Чтобы писать скрипты, необходим редактор кода. В комплекте с Unity идет MonoDevelop, так что его не требуется устанавливать отдельно. Другой вариант — использовать Visual Studio — мы рекомендуем ее. Сменить среду разработки можно в настройках: Edit → Preferences, а затем выбери панель External Tools.

Вывод сообщения в консоль Unity

Когда ты напишешь свой первый код и добавишь его в Unity, Unity проверит код и, если в нем нет ошибок, произойдет компиляция.

Консоль (англ. — Console) – это панель в Unity, которая отображает ошибки в коде (отображаются красным значком), предупреждения (отображается желтым значком) и позволяет выводить справочную информацию (белый значок). По умолчанию эта панель отображается в нижней части программы в закладке Console. Если эта панель не отображается на экране, то в главном меню выбери Window → Console.

Чтобы создать скрипт выбери Assets → Create → C# Script. Имя скрипта должно быть обязательно на английском и начинаться с большой буквы. Открой созданный скрипт и напиши:

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

Код, который должен вызываться один раз при старте программы, ты можешь написать внутри функции Start(), как в примере выше.

Код, который должен вызываться каждый кадр, ты можешь написать внутри функции Update().

Переменные

Если ты хочешь сохранить данные (количество жизней игрока, патронов или очков опыта), то для этого используются переменные. Переменные разделяются на типы, которых существует огромное множество.

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

  1. Целочисленные: int (от –2 147 483 648 до 2 147 483 647), long (от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807).
  2. Символы и строки: char (элемент в кодировке UTF-16), string (последовательность элементов в кодировке UTF-16).
  3. С плавающей запятой (дробные): float (от 1,5 × 10–45 до 3,4 × 1038, с точностью до 7 цифр), double (от 5,0 × 10–324 до 1,7 × 10308, с точностью до 15 цифр).
  4. Логические: bool (значение true или false).

Инициализация переменной

Все переменные в C# должны быть объявлены (инициализированы) до их применения. Например:

Задать значение переменной можно, в частности, с помощью оператора присваивания — знак «=». Кроме того, при объявлении переменной можно сразу задать ее значение. Например:

Переменные численных типов можно складывать, вычитать, умножать и делить:

+ — операция сложения;

— операция вычитания;

* — операция умножения;

/ — операция деления.

А вот так сумму чисел можно вывести в консоль:

Счетчик времени с помощью Time.deltaTime

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

Чтобы узнать сколько времени прошло между кадрами — используется Time.deltaTime.

Чтобы сделать дробное число целым, ставим перед ним (int).

Позиция объекта

Координаты объекта хранятся в компоненте Transform, свойство — position. Каждая координата имеет тип float. Вот так можно выводить координаты объекта в консоль:

Несколько языков в одной игре

12.09.2020, 14:36

Несколько языков на одной страничке.
I have to put some inputboxes on one Page, when evry one inputbox get only one language, how can i.

Бд | несколько языков
Всем доброго времени суток! Стоит задача создать базу данных фильмом. Изначально имею 3.

Структура БД (несколько языков)
Хочу создать базу данных для многоязычного сайта. Для этого мне нужно уточнить некоторые моменты.

Микроразметка, несколько языков
есть сайт (еще не в продакшене) состоящий из 2 страниц: 1. выбор языка (анг. рус.). Рус. сегмент -.

Несколько языков в проекте
Здравствуйте, просьба сильно за вопрос не пинать. Можно ли каким-либо образом в студии.

13.09.2020, 00:19 2

Решение

Я видел неоднократно, когда некоторе компоненты написаны на джс. Например контроллер камеры хорош, но он на джс, а проект на с#.
Все замечательно работает.

Но лично меня подташнивает. И я портирую под c#.

Добавлено через 1 минуту
выдержка из официального юнитивского сайта

Behaviour scripts in Unity can be written in JavaScript, C#, or Boo. It is possible to use any combination of the three languages in a single project, although there are certain restrictions in cases where one script incorporates classes defined in another script.

Поддержка нескольких языков в игре

Есть различные способы решения данной проблемы, тем не менее, предлагаем свой вариант. Возможно кому-нибудь данный способ пригодиться. Ориентирован он, кстати говоря, для смены языка интерфейса игры. Работает скрипт только с объектами Unity UI. Суть заключается в следующем. Например, при создании меню каких-то настроек, для описания ее элементов мы используем UI Text, каждый из которых в свою очередь, помещаем в специальный массив. То есть, мы можем выбрать, где язык будет меняться. А сами языковые пакеты, находятся во внешней папке, в этом собственно фишка. Иначе говоря, локализацию можно сделать, когда игра уже готова и скомпилирована. После запуска, все имеющиеся языки, станут доступны в отдельном меню.

Итак, у нас есть готовое меню или какой-нибудь интерфейс. Теперь в игру нужно встроить список Dropdown UI, добавляем его в нужное место и настраиваем внешний вид по вкусу. Далее, создаем в проекте папку с именем, например, Localization. Эта папка должна находится рядом со стандартной папкой проекта Assets, а после компиляции игры, ее нужно создать рядом с исполняемым файлом.

Вешаем на сцену скрипт Localization:

Указываем все необходимые элементы.

Дополнительно, создаем вспомогательный скрипт LocalizationEditor:

Он нужен для генерации файла-шаблона.

Как это работает?

Весь текст интерфейса создаем на «языке по умолчанию», допустим, английский. Когда всё готово и в массив скрипта добавленный все необходимые элементы, в инспекторе жмем кнопочку Build Default Locale:

На основе массива текста, создается id массив, который является ключом, одинаковым текстовым элементам будет присвоен один и то-же id. Затем происходит запись в файл как ключа, так и текста, который ему соответствует. Таким образом, оригинальный интерфейс работает как шаблон. При загрузки языка, используется ранее созданный id массив, затем идет поиск таких же ключей в файле и замена текста в элементах интерфейса. Если допустим, удалить все языки или вообще папку с ними, то оригинальный интерфейс никуда не денется, просто нельзя будет изменить язык. Еще не стоит забывать, что скрипт не подгоняет размеры текста, а лишь меняет его, это надо учитывать при переводе слов.

Теперь что касается шаблона для языка, после генерирования языка по умолчанию, в указанной папке появится файл Default.xml например с таким содержанием:

Всё что нужно сделать это дублировать файл Default.xml переименовать допустим в Russian.xml и сделать перевод значений:

Сохраняем и готово! Теперь будут доступны два языка.

C# и еще 7 языков для Unity

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Переменные

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

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

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

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

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

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

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

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

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

Цукерберг рекомендует:  Работа - Как пробиться в IT сферу
Функции

Скрпиты манипулируют переменными с помощью функций. Есть ряд функций, выполняющихся автоматически в 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. Этот прием хорошо использовать для таких элементов, как камера. Скажем, вы хотите переместить персонажа в своей игре. И затем он сталкивается с другим персонажем и оказывается в другой позиции. Если мы будем перемещать камеру во время перемещения персонажа, получится болтанка, и камера окажется не там, где она должна быть. Так что этот второй цикл оказывается как нельзя кстати.

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

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

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

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

Классы

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

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

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

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

Как включить функции С# 7 в проектах Unity3D

Я написал новый метод в своем проекте Unity3D (используя Visual Studio 2020), и для этого метода мне нужен С# 7 или больше. Поэтому я последовал инструкциям в этом руководстве.

Теперь, когда я пытаюсь открыть свойства проекта, Visual Studio открывает его, но затем он внезапно закрывается сразу после открытия. Теперь я даже не могу открыть свойства проекта.

Вот как это выглядит:

Почему я получаю первую и третью ошибки? (те, которые я показал в gif)

РЕДАКТИРОВАТЬ

Компилятор Roslyn теперь поддерживается в Unity 2020.3, что позволяет использовать новейшие функции С# 7!

Для Unity3D Edit → Project Settings → Player , найдите раздел » Other Settings «, затем в разделе » Configuration / Scripting Runtime Version выберите .NET 4.x Equivalent .

Мы хотим сообщить mcs.exe обработать код С#, используя новые «экспериментальные» функции С# 7. Для этого просто создайте файл mcs.rsp внутри вашей папки «Активы». Отредактируйте его и напишите эту строку внутри него:

Теперь создайте новую папку с именем Editor внутри вашей папки Assets . Любые скрипты, добавленные в эту папку, заставят Unity создать *.Editor.csproj проекта *.Editor.csproj , который содержит скрипты, направленные на изменение редактора Unity.

Нам нужно сообщить Visual Studio, что ваш проект поддерживает язык С# 7.3. Это не означает, что Unity сможет скомпилировать все функции С# 7.3, но, по крайней мере, Visual Studio не будет судить об особенностях, которые вы пытаетесь использовать экспериментально.

Однако, если вы отредактируете файл csproj напрямую, Unity автоматически перезапишет его в какой-то момент (Unity всегда автоматически генерирует файлы проекта и решения). Таким образом, вы можете установить крючок, который вызывается, когда файл проекта автогенерируется, поэтому вы можете сами открыть файл проекта и добавить к нему свою настройку (ваши настройки не ограничены только изменением языковой версии: вы мог бы сделать больше вещей, но вы должны понять, что вы здесь делаете).

Для этого поместите следующий сценарий внутри папки Editor :

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

Разработка вашей первой игры с помощью Unity и C#

Продукты и технологии:
Unity, C#, Microsoft .NET Framework, Mono

В статье рассматриваются:

  • интерфейс Unity;
  • сцены, игровые объекты и компоненты;
  • написание кода;
  • проекты кода, генерируемые Unity.

Как архитектор ПО я создал много систем, занимался обратным инжинирингом вредоносного программного кода и, в целом, мог бы достаточно легко разобраться почти в любом коде. Однако, когда дело дошло до создания игр, я слегка растерялся, даже не зная, с чего начать. На заре эпохи Windows я немного программировал графику в неуправляемом коде — не могу сказать, что это доставило мне удовольствие. Я тогда начинал разработку на DirectX, но осознал, что, хотя он обладает колоссальными возможностями, мне пришлось бы писать слишком много кода для того, что я хотел сделать.

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

Что такое Unity

Unity — это ядро и инфраструктура, образующие систему для разработки двух- и трехмерных игр или сцен в приложениях (и даже 2.5D). Я упоминаю игры и приложения потому, что встречал не только игры, но и обучающие симуляторы, приложения экстренного реагирования (first-responder applications) и другие приложения, ориентированные на бизнес, которые разрабатывались с помощью Unity и должны были обеспечивать взаимодействие с двух- и трехмерным пространством. Unity позволяет оперировать не только кодом, но и визуальными компонентами с последующим их экспортом на любую распространенную мобильную платформу, а также делать много всего другого, причем бесплатно. (Существует и профессиональная версия, но она не бесплатна. Впрочем, даже бесплатная версия позволяет делать впечатляющие вещи.) Unity поддерживает все основные 3D-приложения, множество форматов звука и даже понимает формат .psd (Photoshop), поэтому вы можете просто закинуть файл .psd в проект на Unity. Unity разрешает импортировать и собирать ресурсы, писать код, взаимодействующий с вашими объектами, создавать или импортировать анимации для использования с продвинутой системой анимации и многое другое.

В Unity проделана потрясающая работа, благодаря которой обеспечивается кросс-платформенная поддержка.

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

Рис. 1. Платформы, поддерживаемые Unity

Вероятно, самая мощная часть Unity — это Unity Asset Store; пожалуй, лучшая электронная площадка для приобретения игровых ресурсов. Здесь вы найдете все необходимые компоненты для своих игр, такие как художественные решения, трехмерные модели, файлы анимаций для трехмерных моделей (см. контент Mixamo в магазине для более чем 10 000 движений), звуковые эффекты и полные треки, плагины (в том числе, инструментальный набор MultiPlatform, помогающий поддерживать несколько платформ), визуальные скриптовые системы вроде PlayMaker и Behave, продвинутые шейдеры, текстуры, эффекты на основе частиц и др. Интерфейс Unity полностью управляем скриптами и поддерживает интеграцию сторонних плагинов прямо в Unity GUI. Большинство профессиональных разработчиков игр (если не все) использует ряд пакетов из этого магазина ресурсов, и, если вы можете предложить нечто приличное, публикуйте его там.

Microsoft и Unity тесно сотрудничают, чтобы обеспечить полную поддержку для всего стека платформ Microsoft.

И чем Unity не является

Я сомневаюсь, что нужно описывать все, чем Unity не является. Однако Unity по умолчанию не является системой, в которой проектируют двухмерные ресурсы и трехмерные модели (кроме террейнов). Вы можете вставить группу зомби в сцену и управлять ими, но создать самих зомби с помощью инструментария Unity, предлагаемого по умолчанию, нельзя. В этом смысле Unity не является инструментом создания ресурсов, подобным Autodesk Maya, 3DSMax, Blender или даже Adobe Photoshop. Однако существует минимум один сторонний плагин (ProBuilder) для моделирования трехмерных компонентов прямо в среде Unity; также имеются плагины для построения двухмерных миров, например 2D Terrain Editor, позволяющий создавать двухмерные тайловые среды (2D tiled environments). И еще вы можете проектировать террейны в Unity, используя его Terrain Tools, чтобы создавать потрясающие ландшафты с деревьями, травой, горами и т. д. Поэтому я вновь в сомнении: стоит ли очерчивать границы возможностей Unity.

Какова роль Microsoft? Microsoft и Unity тесно сотрудничают, чтобы обеспечить полную поддержку для всего стека платформ Microsoft. Unity поддерживает автономные исполняемые Windows-файлы, приложения Windows Phone, Windows Store, Xbox 360 и Xbox One.

Приступаем к работе

Скачайте самую новую версию Unity и приобретите себе двухкнопочную мышь с нажимаемым колесиком прокрутки. Бесплатная и профессиональная версия скачиваются как единый пакет, который потом лицензируется соответствующим образом. Изучить различия между этими версиями можно на странице unity3d.com/unity/licenses. Editor, который является основным интерфейсом Unity, выполняется в Windows (включая Surface Pro), Linux и OS X.

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

Архитектура и компиляция

Unity — это игровой движок, написанный на неуправляемом C++. Вы пишете код на C#, JavaScript (UnityScript) или Boo. Ваш код (не код движка Unity) выполняется в Mono или Microsoft .NET Framework и транслируется JIT-компилятором (кроме iOS, которая не поддерживает JIT-код, и для нее код компилируется Mono в неуправляемый код с использованием компиляции Ahead-of-Time [AOT]).

Unity позволяет тестировать вашу игру в IDE, не требуя никакого экспорта или сборки. Запуская код в Unity, вы используете Mono версии 3.5, API которого примерно на одном уровне совместим с .NET Framework 3.5/CLR 2.0.

Вы редактируете свой код в Unity, дважды щелкнув файл кода в представлении проекта. Это действие по умолчанию открывает кросс-платформенный редактор Mono­Develop. При желании можно сконфигурировать в качестве редактора Visual Studio.

Отладка осуществляется с помощью MonoDevelop или с использованием стороннего плагина для Visual Studio — UnityVS. Использовать Visual Studio в качестве отладчика без UnityVS нельзя, потому что при отладке игры вы отлаживаете не Unity.exe, а виртуальную среду в Unity, применяя программный отладчик, который выдает команды и выполняет операции.

Для отладки запустите MonoDevelop из Unity. В MonoDevelop есть плагин, который открывает обратное соединение с отладчиком Unity и выдает ему команды после того, как вы выбираете Debug | Attach to Process in MonoDevelop. С помощью UnityVS вы устанавливаете обратное соединение с отладчиком Visual Studio вместо Unity.

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

Рис. 2. Project Wizard в Unity

В диалоге проекта вы указываете имя и местонахождение своего проекта (1). Вы можете импортировать любые пакеты в проект (2), хотя отмечать все именно здесь не обязательно; список предоставляется только для удобства. Пакет можно импортировать и позже. Пакет — это файл .unitypackage, который содержит предварительно упакованные ресурсы (модели, код, сцены, плагины и все, что можно упаковать в Unity); эти ресурсы можно повторно использовать и распространять. Но не помечайте здесь что-то, если вы не знаете, что это такое; размер вашего проекта может увеличиться, причем весьма значительно. Наконец, вы можете выбрать 2D или 3D (3). Этот раскрывающийся список появился в Unity сравнительно недавно, поскольку до этого в Unity не было серьезного инструментария для разработки двухмерных игр. При выборе 3D настройки по умолчанию устанавливаются в пользу 3D-проекта — это типичное поведение Unity. Если вы выбираете 2D, Unity изменяет несколько вроде бы малых, но на деле очень важных деталей, о которых я расскажу в одной из следующих статей.

Этот список заполняется из файла .unitypackage в определенных местах вашей системы; Unity предоставляет большой выбор при установке. Все, что вы скачиваете из магазина ресурсов Unity, тоже поступает в виде файла .unitypackage и локально кешируется в вашей системе по пути C:\Users\ \AppData\Roaming\Unity\Asset Store. Как таковой, этот файл появится в списке, если он присутствует в вашей системе. Вы могли бы просто дважды щелкнуть любой файл .unitypackage, и он был бы импортирован в ваш проект.

Продолжая рассматривать интерфейс, я щелкну Create в диалоге с рис. 2, чтобы создать новый проект. Разметка окна Unity по умолчанию приведена на рис. 3.

Рис. 3. Окно Unity по умолчанию

Вот что мы видим.

  1. Project Все файлы в проекте. Для добавления файлов в проект их можно просто перетаскивать из Explorer в Unity.
  2. Scene Текущая открытая сцена.
  3. Hierarchy Все игровые объекты в сцене. Обратите внимание на термин GameObjects и раскрывающееся меню GameObjects.
  4. Inspector Компоненты (свойства) выбранного в сцене объекта.
  5. Toolbar Ближе к левому краю размещаются кнопки Pan, Move, Rotate, Scale, а в центре — Play, Pause, Advance Frame. Play почти мгновенно запускает игру без выполнения отдельных сборок. Pause приостанавливает игру, а Advance Frame обеспечивает покадровое выполнение, предоставляя вам очень жесткий отладочный контроль.
  6. Console Это окно может стать понятным не сразу, но в нем отображается вывод процесса компиляции, ошибок, предупреждений и т. д. Кроме того, в нем показываются отладочные сообщения из кода, например Debug.Log будет отображать свой вывод здесь.

Важно упомянуть о вкладке Game рядом с вкладкой Scene. Она становится активной, когда вы щелкаете Play и ваша игра начинает выполняться в этом окне. Это называется режимом игры (play mode) и создает вам игровую площадку для тестирования вашей игры; можно даже «на лету» вносить изменения в игру, переключаясь обратно на вкладку Scene. Но будьте осторожны. Пока подсвечивается кнопка Play, вы находитесь в режиме игры, и, если вы покидаете его, любые изменения, внесенные в режиме игры, будут потеряны. Я, как и почти все разработчики на Unity, с кем мне доводилось разговаривать, именно так теряли проделанную работу, поэтому советую сменить цвет Editor на такой, по которому было бы очевидно, когда вы находитесь в режиме игры. Это можно сделать через Edit | Preferences | Colors | Playmode tint.

Все, что выполняется в вашей игре, существует в сцене.

Цукерберг рекомендует:  Навыки, которые помогут найти работу

О сценах

Все, что выполняется в вашей игре, существует в сцене. Когда вы упаковываете игру для какой-то платформы, конечный продукт представляет собой одну или более сцен плюс любой добавленный вами код, специфичный для конкретной платформы. Количество сцен в проекте не ограниченно. Сцену можно рассматривать как уровень в игре, хотя в одном файле сцены может быть несколько уровней — достаточно перемещать игрока (камеру) в другие позиции сцены. Скачивая сторонние пакеты или даже примеры игр из магазина ресурсов, вы обычно должны найти файлы сцен, чтобы открыть их в своем проекте. Файл сцены содержит всевозможные метаданные о ресурсах, используемых в проекте для текущей сцены и ее свойств. Важно почаще сохранять сцену при разработке нажатием клавиш Ctrl+S, как и в любом другом инструментарии.

Как правило, Unity открывает последнюю сцену, с которой вы работали, хотя иногда, когда Unity открывает проект, создается новая пустая сцена, и вам придется искать сцену в Project Explorer. Новичков это сбивает с толку, но важно помнить об этом, если вы вдруг открыли свой последний проект и не можете понять, куда подевалась вся ваша работа! Расслабьтесь, вы найдете искомое в файле сцены, который вы сохранили в своем проекте. Вы можете искать все сцены в проекте, щелкнув значок, показанный на рис. 4, и выбрав в списке Scene.

Рис. 4. Фильтрация сцен в проекте

В сцене вы ничего не увидите без камеры и ничего не услышите без компонента Audio Listener, подключенного к какому-либо GameObject. Но заметьте, что в любой новой сцене Unity всегда создает камеру с подключенным к ней компонентом Audio Listener.

Структура проекта и импорт ресурсов

Проекты Unity не похожи на проекты Visual Studio. Вы не открываете файл проекта или даже решения, потому что таких файлов нет. Вы указываете Unity структуру папок и открываете папку как проект. Проекты содержат папки Assets, Library, ProjectSettings и Temp, но в интерфейсе появляется только папка Assets, что можно было заметить на рис. 4.

Папка Assets содержит все ваши ресурсы: художественную графику, код, звуки; любой отдельный файл, добавляемый в проект, попадает именно в эту папку. Она всегда является папкой верхнего уровня в Unity Editor. Учтите, что изменения следует вносить только через интерфейс Unity, — никогда не пытайтесь делать это через файловую систему.

Папка Library — это локальный кеш для импортированных ресурсов; она содержит все метаданные для ресурсов. В папке ProjectSettings хранятся настройки, заданные вами в Edit | Project Settings. Папка Temp используется для временных файлов, создаваемых Mono и Unity в процессе сборки проекта.

Я хочу еще раз подчеркнуть важность внесения изменений только через интерфейс Unity — не делайте этого напрямую через файловую систему. Это относится даже к простым операциям копирования и вставки. Unity отслеживает метаданные для ваших объектов через редактор, поэтому используйте редактор для любых правок (кроме нескольких редких случаев). Однако вы можете перетаскивать объекты из файловой системы в Unity — такой вариант работает нормально.

Крайне важный GameObject

Практически все в вашей сцене является GameObject. Вспомните System.Object в .NET Framework. От него наследуют почти все типы. Та же концепция относится и к GameObject. Это базовый класс для всех объектов в сцене Unity. Все объекты, показанные на рис. 5 (и многие другие), наследуют от GameObject.

Рис. 5. Класс GameObject в Unity

Lights Источники освещения
3D Models 3D-модели
Sprites Спрайты
HUDs Игровые интерфейсы
Particle Systems Системы частиц
GameObject GameObject

GameObject довольно прост, так как он относится к окну Inspector. На рис. 6 видно, что к сцене был добавлен пустой GameObject; обратите внимание на его свойства в Inspector. У GameObject по умолчанию нет визуальных свойств, если не считать того, что при выделении этого объекта появляется виджет Unity. На этом этапе это фактически пустой объект.

Рис. 6. Простой GameObject

GameObject имеет свойства Name, Tag (аналог тега text, присваиваемого через FrameworkElement.Tag в XAML или тегу в Windows Forms), Layer и Transform (пожалуй, это свойство самое важное).

Свойство Transform определяет позицию, поворот и масштаб любого GameObject. Unity использует левостороннюю систему координат, в которой координаты на экране компьютера рассматриваются как X (по горизонтали), Y (по вертикали) и Z (глубина, т. е. входящие или исходящие из экрана).

В разработке игр весьма распространено использование векторов, о которых я подробнее расскажу в следующих статьях. А пока достаточно сказать, что Transform.Position и Transform.Scale являются объектами Vector3. Vector3 — это трехмерный вектор; иначе говоря, в нем не более трех точек: только X, Y и Z. Манипулируя этими тремя простыми значениями, вы можете задавать местонахождение объекта и даже перемещать его в направлении вектора.

Свойство Transform определяет позицию, поворот и масштаб любого GameObject.

Компоненты

Вы добавляете функциональность к объектам GameObject добавлением компонентов (объектов Component). Все, что вы добавляете, — это Component, и все они показываются в окне Inspector. Существуют компоненты MeshRender и SpriteRender, компоненты для звука и функционала камеры, компоненты, относящиеся к физике (коллайдеры [colliders] и твердые тела [rigidbodies]), системы частиц, системы поиска пути, сторонние пользовательские компоненты и др. Чтобы назначить код какому-то объекту вы используете скриптовый Component. Компоненты — это как раз то, что оживляет ваши GameObject добавлением функциональности подобно шаблону Decorator в разработке ПО, только их возможности гораздо интереснее.

Я присвою кое-какой код новому GameObject, в данном случае простому кубу, который можно создать через GameObject | Create Other | Cube. Я переименовал куб в Enemy, а затем создал еще один куб. Как видно на рис. 7, я сместил один куб на –15 единиц от другого, что можно сделать с помощью инструмента Move на панели инструментов или нажатием клавиши W после выделения объекта.

Рис. 7. Текущий проект с двумя кубами

Код — простой класс, который находит игрока и перемещает к нему своего владельца. Обычно операции перемещения осуществляются одним из двух способов: либо вы перемещаете объект в новую позицию на каждом кадре, изменяя его свойство Transform.Position, либо вы применяете к нему физический толчок, а в остальном полагаетесь на Unity.

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

Первым делом я щелкаю правой кнопкой мыши в окне Project, чтобы создать новый скрипт на C# с именем EnemyAI. Для назначения этого скрипта объекту я просто перетаскиваю файл скрипта из представления проекта на объект в представлении Scene или Hierarchy, и этот код связывается с объектом. Остальное берет на себя Unity. Вот так просто.

На рис. 8 показан куб Enemy с назначенным ему скриптом.

Рис. 8. Enemy со связанным скриптом

Взгляните на код на рис. 9 и обратите внимание на открытую переменную. Если вы смотрите на код в Editor, то заметите, что моя открытая переменная появляется с параметром для переопределения значений по умолчанию в период выполнения. Это очень удобно. Вы можете менять значения по умолчанию в GUI для элементарных типов, а также можете предоставлять открытые переменные (но не свойства) многих других объектных типов. Если я перетаскиваю этот код на другой GameObject, создается совершенно отдельный экземпляр этого компонента кода. Это базовый пример, и его можно расширить, добавив, скажем, компонент RigidBody к этому объекту, но я не стану усложнять пример.

Рис. 9. Скрипт EnemyAI

В коде я могу получить ссылку на любой компонент, предоставляемый в редакторе. Кроме того, можно назначать скрипты для GameObject, каждый со своими методами Start и Update (и многими другими методами). Предполагая, что компоненту скрипта, содержащему этот код, требуется ссылка на класс EnemyAI (компонент), я могу просто запросить этот компонент:

После изменения кода в MonoDevelop или в своем любимом редакторе кода и последующего возврата в Unity вы обычно наблюдаете небольшую задержку. Это связано с тем, что Unity выполняет фоновую компиляцию вашего кода. Редактор кода (но не отладчик) можно сменить через Edit | Preferences | External Tools | External Script Editor. Любые проблемы при компиляции в самой нижней строке состояния на экране Unity Editor, так что посматривайте туда. Если вы попытаетесь запустить игру с ошибками в коде, Unity этого не позволит.

Написание кода

В предыдущем примере кода два метода: Start и Update; класс EnemyHealth наследует от базового класса MonoBehavior, что позволяет просто назначить этот класс объекту GameObject. В этом базовом классе богатая функциональность, и, как правило, вы чаще всего будете использовать несколько методов и свойств. Основными методами являются те, которые Unity будет вызывать, если они присутствуют в вашем классе. Таких методов немало — подробности см. по ссылке bit.ly/1jeA3UM. Несмотря на множество методов вы, как правило, используете лишь некоторые из них. Ниже перечислены наиболее распространенные методы, подлежащие реализации в ваших классах, производных от MonoBehavior.

Awake Этот метод вызывается один раз для каждого объекта при его первой инициализации. Другие компоненты могут быть еще не инициализированы, поэтому этот метод обычно используется для инициализации текущего GameObject. Для инициализации производного от MonoBehavior класса следует всегда использовать этот метод, а не его конструктор. И не пытайтесь запрашивать здесь другие объекты сцены, так как они могут быть еще не инициализированы.

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

Update Этот метод вызывается в каждом кадре. И насколько же это часто, спросите вы? Ну, это полностью зависит от скорости вычислений. Поскольку нагрузка на вашу систему постоянно меняется при рендеринге разных вещей, каждую секунду частота кадров варьируется. Вы можете щелкнуть кнопку Stats на вкладке Game при переключении в игровой режим, чтобы видеть текущую частоту кадров (рис. 10).

Рис. 10. Получение статистики

FixedUpdate Этот метод вызывается фиксированное число раз в секунду независимо от частоты кадров. Поскольку Update вызывается варьируемое число раз в секунду и не синхронизируется с движком физики, обычно лучше всего использовать FixedUpdate, когда к объекту нужно приложить силу или какие-то другие действия, относящиеся к физике. По умолчанию FixedUpdate вызывается каждые 0,02 секунды, а значит, Unity выполняет вычисления физики каждые 0,02 секунды (этот интервал называется Fixed Timestep и может регулироваться разработчиком) — опять же независимо от частоты кадров.

Проекты кода, генерируемые Unity

Как только в вашем проекте появляется код, Unity создает один или более файлов проектов в вашей корневой папке (которая невидима в интерфейсе Unity). Это не двоичные файлы движка Unity, а проекты для Visual Studio или MonoDevelop, в которых вы будете редактировать и компилировать свой код. Unity может создавать очень много отдельных проектов, как показано на рис. 11, но каждый из них выполняет важную роль.

Рис. 11. Проекты, создаваемые Unity

Если ваш проект Unity прост, вы увидите не все из этих файлов. Они создаются, только когда у вас есть код, помещаемый в различные специальные папки. Проекты, показанные на рис. 11, делятся всего на три типа:

  • Assembly-CSharp.csproj;
  • Assembly-CSharp-Editor.csproj;
  • Assembly-CSharp-firstpass.csproj.

Для каждого из этих проектов имеется проект-дубликат, созданный с добавлением «-vs» в его имя, например Assembly-CSharp-vs.csproj. Эти проекты используются, если вашим редактором кода является Visual Studio, и их можно добавлять в ваш проект, экспортированный из Unity, для отладки на специфической платформе в решении Visual Studio.

Прочие проекты служат той же цели, но «CSharp» заменяется «UnityScript». Это просто JavaScript-версии проектов (UnityScript), которые будут присутствовать, если вы используете JavaScript в своей Unity-игре и если у вас есть скрипты в папках, которые инициируют создание этих проектов.

Теперь, когда вы увидели, какие проекты создаются, я исследую папки, инициирующие создание этих проектов, и покажу, каково их предназначение. Путь к каждой папке относителен корневой папке /Assets в представлении вашего проекта. Assets всегда является корневой папкой и содержит все файлы ресурсов. Например, Standard Assets — это на самом деле /Assets/Standard Assets. Процесс компиляции ваших скриптов выполняется в четыре этапа и генерирует сборки (assemblies). Объекты, скомпилированные на этапе 1, не видят объекты, компилируемые на этапе 2, так как на этот момент они еще не скомпилированы. Это важно понимать, когда вы смешиваете UnityScript и C# в одном проекте. Если вам нужно ссылаться на C#-класс из UnityScript, вы должны убедиться, что он компилируется на более раннем этапе.

Этап 1 охватывает скрипты периода выполнения в папках Standard Assets, Pro Standard Assets и Plug-ins, которые находятся в папке /Assets. На этом этапе создается проект Assembly-CSharp-firstpass.csproj.

Скрипты этапа 2 находятся в папках Standard Assets/Editor, Pro Standard Assets/Editor и Plug-ins/Editor. Последняя папка предназначена для скриптов, которые взаимодействуют с Unity Editor API для использования функциональности этапа разработки (считайте это аналогом плагина Visual Studio, расширяющего ее GUI, только выполняемого в Unity Editor). На этом этапе создается проект Assembly-CSharp-Editor-firstpass.csproj.

Этап 3 охватывает прочие скрипты вне папки Editor. На этом этапе создается проект Assembly-CSharp-Editor.csproj.

Этап 4 охватывает все остальные скрипты (находящиеся внутри любой другой папки Editor, например /Assets/Editor или /Assets/Foo/Editor). На этом этапе создается проект Assembly-CSharp.csproj.

Есть пара других, реже используемых папок, которые я здесь не рассматриваю, скажем, Resources. И остается вопрос, а какой компилятор применяется? Из .NET? Mono? Из .NET для Windows Runtime (WinRT)? Из .NET для Windows Phone Runtime? В табл. 1 перечислены компиляторы по умолчанию для разных случаев. Это важно знать, особенно в приложениях на основе WinRT, так как состав API для разных платформ варьируется.

Табл. 1. Компиляторы

Платформа Сборки игры, генерируемые Окончательная компиляция выполняется
Windows Phone 8 Mono Visual Studio/.NET
Windows Store .NET Visual Studio/.NET (WinRT)
Windows Standalone (.exe) Mono Unity генерирует .exe + библиотеки
Windows Phone 8.1 .NET Visual Studio/.NET (WinRT)

Когда вы выполняете компиляцию для Windows, Unity отвечает за вызовы, которые генерируют игровые библиотеки (DLL) из вашего кода на C#/UnityScript/Boo и включают стандартные библиотеки самой Unity. В случае Windows Store и Windows Phone 8 будет экспортироваться решение Visual Studio, кроме ситуации с автономным исполняемым файлом (Windows Standalone), где Unity генерирует .exe и необходимые файлы .dll. Я рассмотрю различные типы компиляции в заключительной статье из этой серии, где мы обсудим специфику конкретных платформ. Рендеринг графики на низком уровне выполняется на платформах Windows с помощью DirectX.

Разработка игры в Unity — процесс довольно прямолинейный.

  • Включите свои ресурсы (художественную графику, звуки и т. д.). Используйте магазин ресурсов. Нарисуйте свою графику. Наймите художника. Заметьте, что Unity полностью поддерживает Maya, Cheetah3d, Blender и 3dsMax, в некоторых случаях требуя, чтобы для работы с соответствующими форматами трехмерной графики было установлено какое-либо ПО, и изначально работает с распространенными файловыми форматами .obj и .fbx.
  • Напишите код на C#, JavaScript/UnityScript или Boo, чтобы управлять своими объектами, сценами и чтобы реализовать игровую логику.
  • Тестируйте в Unity. Экспортируйте на выбранную платформу.
  • Тестируйте на этой платформе. Развертывайте.

Заключение

Эта статья была обзором архитектуры и процессов в Unity. Я рассказал об интерфейсе, основах назначения кода, объектах GameObject, компонентах, Mono, .NET и о некоторых других вещах. Это позволит мне в следующей статье углубиться в сборку компонентов для двухмерной игры. Заглядывайте в Microsoft Virtual Academy, где в конце лета я собираюсь устроить двухдневное мероприятие по обучению Unity. И следите за региональными мероприятиями на unity3d.com/pages/windows/events.

Цукерберг рекомендует:  Обучение - Актуальность ГОСТа

Адам Тьюлипер (Adam Tuliper) — старший идеолог по технологиям в Microsoft; живет в солнечной Южной Калифорнии. Разработчик инди-игр, один из администраторов Orange County Unity Meetup и автор на pluralsight.com. Скоро в его семье появится третий ребенок, так что связывайтесь с ним, пока у него еще есть свободные минуты, по адресу adamt@microsoft.com или через twitter.com/AdamTuliper.

Выражаю благодарность за рецензирование статьи экспертам Мэтту Ньюмену (Matt Newman) из Subscience Studios, Хайме Родригесу (Jaime Rodriguez) из Microsoft и Тоутвидасу Цилису (Tautvydas Žilys) из Unity.

Разработка игр (Урок 25 — C# или UnityJavaScript Выбор языка для Unity 5, перевод и совмещение.)

В этом уроке Я отвечу на вопрос «На чем писать скрипты для Unity ?» , покажу основные отличия СиШарп (С#) от UnityJavaScript (Js) для новичков, объясню какой язык лучше выбрать в начале, а также как переводить из одного языка в другой.
Мой Cubium Dreams в STEAM: http://store.steampowered.com/app/448260/

Моя группа во ВКОНТАКТЕ: https://vk.com/igrodelsky
Мои сайт: http://dostalitios.wix.com/igrodelsky
Моя страница в Фейсбуке: https://www.facebook.com/profile.php? >
(игродельский, igrodelsky, разработка игр, юнити, unity3d, unity 5 )

Видео Разработка игр (Урок 25 — C# или UnityJavaScript Выбор языка для Unity 5, перевод и совмещение.) канала Владимир СВЕТ Игродельский

Скрипты в Unity3D. Урок 0. Основы

Два основных компонента у объекта в Unity3D — это Transform и GameObject.

GameObject

GameObject — основа, контейнер, который содержит в себе все компоненты любой объект в Unity3D. Чтобы удалить, к примеру, игровой объект — удалять нужно именно GameObject этого объекта. Для доступа к GameObject — используется переменная, которая присутствует по умолчанию в любом скрипте, унаследованном от MonoBehaviour (то есть в любом скрипте, созданном через Unity3D).

Получение ссылки на игровой объект

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

Уничтожение игрового объекта

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

Активация/деактивация игрового объекта

Деактивация объекта аналогична снятия галочки инспекторе Unity3D, которая обведена красным цветом на скриншоте ниже.

Деактивация элемента деактивирует также все его дочерние объекты и останавливает выполнение в их скриптов.

Добавление новых компонентов и скриптов игровому объекту

Таким образом можно добавить абсолютно любой компонент, либо скрипт, который можно добавить в редакторе Unity3D.

Получение доступа к компоненту игрового объекта

Таким же образом можно получить доступ к любому компоненту игрового объекта.

Переименование игрового объекта. Считывание имени объекта

Сделать объект статичным

Данный код аналогичен установке/снятию галочки в редакторе Unity3D (на скрине ниже).

Установить слои игровому объекту, а также считать их

Установить тэг игровому объекту, а также его считывание

Transform

С трансформом всё немного проще — этот компонент не является основой, но тем не менее — является основной и, главное, неотъемлемой частью GameObject’а. Он отвечает за месторасположение объекта на сцене, его «вращении», размерах, а также содержит информацию о дочерних и родительском объектах.

Это единственные компонент, который невозможно удалить из GameObject.

Изменение положение объекта

За положение объекта на сцене отвечает элементы transform.position и transform.localPosition.

Они оба являются переменной типа Vector3 и имеют в себе 3 главных составляющих x,y и z, которые соответствуют координатам в трехмерном пространстве. Следует учитывать, что x, y и z невозможно менять напрямую — они только для чтения. Чтобы добавить единичку к x — нужно добавить к самому transform.position новый Vector3, который равен (1,0,0), что добавить к x единицу, а к y и z — нули.

Чем же отличаются transform.position и transform.localPosition?

Их главное (и единственное отличие) заключается в том, что position — показывает и принимает координаты объекта, относительно мировых координат, а localPosition — относительно родительского объекта. Если же игровой объект является «корневым», то есть у него нет родительских объектов, то position и localPosition будут равны.

Движение объекта

Сначала рассмотрим элементарные варианты.

Как мы уже говорили — position (буду далее использовать именно его, так как отличия от localPosition только в том, относительно чего эти координаты) является переменной типа Vector3. Поэтому для его изменения нужно либо прибавить к нему другой вектор, либо вычесть другой вектор, либо заменить его другим вектором.

Рекомендуется использовать функцию transform.Translate.

Это уже не переменная, как transform.position — это функция. У неё есть два входящих параметра:

  1. Vector3, который отвечает за то, в каком направлении будет двигаться объект;
  2. Space.Self/Space.World — то, относительно чего будет двигаться игровой объект. Space.Self — аналогичен transform.localPosition, а Space.World — аналогичен transform.position.

Вращение объекта

За вращение объекта отвечает компонент transform.rotation, transform.localRotation и функция transform.Rotate.

Здесь все аналогично transform.position. Кроме одного, несмотря на то, что в редакторе Unity3D Rotation представляет собой Vector3, то есть вращение относительно оси X, оси Y, оси Z. Но в коде оно представлено в виде кватернионов. Что такое кватернион — отдельная история. И обычно её изучают в вузах. По факту — знание кватернионов не обязательно для разработки игр. К счастью разработчики Unity3D это понимают и сделали две удобные для программистов вещи:

  1. Функция transform.Rotate(Vector3 vector, Space.World(либо Self));
  2. Функция Quaternion.Euler(float x,float y,float z), которая как раз возвращает кватернион;

Меньше слов — больше кода:

Вместо rotation можно применять localRotation, аналогично position.

Такой подход аналогичен transform.Translate и также является более производительным.

Поиск других объектов на сцене

Есть два подхода поиска объекта на сцене.

  1. GameObject.Find(«имяОбъекта»); Он же «пушка по воробьям». Несмотря на кажущуюся скорость — метод является достаточно прожорливым и при частом использовании на большой сцене может стать большой проблемой. Однако он же самый простой способ (хотя и ненадежный). А ненадежный он потому, что редактор Unity3D позволяет давать одинаковые имена объектам. А GameObject.Find возвращает только один элемент, который он найдет первым.
  2. transform.FindChild(«имяДочернегоОбъекта») — функция возвращает переменную типа transform нужного объекта. Для доступа к GameObject этого объекта особых усилий прилагать не нужно, так как ссылка на него уже содержится в transform (как и ссылка на transform содержится в GameObject’е).

Также можно запрашивать дочерние элементы по их номеру:

Также дочерний элемент может запросить родительский, а также родительский родительского и так далее:

В следующих статьях будет информация о том, что такое private, public, static, отправление сообщений игровым объектам.

12 комментариев для “Скрипты в Unity3D. Урок 0. Основы”

Отличный урок! Планируется ли продолжение?

Здравствуйте! Да, продолжение планируется и уже есть заготовки, но времени, увы, нет совсем =(

Присоединяюсь к предыдущем комментатору, очень жду продолжения.
Ну и отдельное спасибо за этот урок.

var objectBoxColl > ещё бы растолковать,нубу ,почему, где, и в каком случае слова пишутся с маленькой и большой буквы.
Типа — функции с маленькой, переменные с большой.
Почему object с маленькой а BoxCollider c большой.
И краткие примеры, как эти коды можно в коде применять..
//и кто такой «anotherTransformLink»
var anotherTransformLink = childGameObject.transform;

И коментарии бы типа:
var childTransform = transform.FindChild(«myChild1»); // находим myChild1 помещаем в childTransform
var childGameObject = childTransform.gameObject; // тут что происходит я хрен чё понимаю откуда что берётся
var anotherTransformLink = childGameObject.transform; // и зачем столько букав

А так-то нормуль, есть что законспектировать.

Здравствуйте! Спасибо за советы, я обязательно их учту при написании следующих статей.
Постараюсь вкратце ответить на ваши вопросы.
1) Слова в коде относятся к командам, классам, интерфейсам, или именам переменных. Обычно в C# с большой буквы пишется класс, интерфейс, или переменная с модификатором доступа ‘public’ (не забываем про функции). Где, как и в каких случаях что используется тяжело описать, так как это основы языка программирования C#.
Например:
var myObject = new MyObject().
Конкретно в данном случае — MyObject — это класс. А myObject — это конкретный экземпляр класса MyObject.

А вот другой пример:
public GameObject MyGameObject;
Это публичное свойство класса типа GameObject. Сам экземпляр данного класса называется MyGameObject и может быть доступен как и изнутри самого класса, так и из других классов, у которых есть ссылка на данный экземпляр класса.

2) Почему objectBoxCollider с маленькой, а BoxCollider с большой? ObjectBoxCollider — это имя класса, а objectBoxCollider — это его экземпляр..

К тому же Unity3d очень активно использует наследование (хотя бы взять любой скрипт — он наследован от MonoBehavior. Нужно знать как работает наследование и какой базовый функционал (и какие свойства) уже доступны «из коробки» у любого класса, который будет наследован от него.
Всё-таки Unity3D подразумевает, что у разработчика есть базовые знания C#, или JS. Я бы вам порекомендовал вначале почитать статьи с замечательного сайта https://metanit.com/sharp/tutorial/
Лучше чем там я объяснить всё равно не смогу ��

оО, о как, очень рад что сайт живой,ато вновь и вновь прочёсываю инет своими тегами, гляжу — котодомик))
думаю — та-ак, помню что там чтото полезное было пойду ещё загляну) а тут опаньки, живая планета,.
только вот пользователи сетей видать не очень жалуют домен «рф» и встречается он редковато,
буду значит наблюдать за сайтом,по возможности единомышленников подтягивать,
пс
C#

transform.position += new Vector3(1,0,0); // добавляем к X единице (смещаем на единицу)
transform.position += new Vector3(1,0,2)*Time.deltaTime; // двигаем объект в реальном времени с установленными значениями
по осям х и z

int speed = 5;
void Start()
transform.position += new Vector3(speed,0,0)*Time.deltaTime;//движение по оси х с заданием параметра(скорости) через переменную speed
transform.position += new Vector3(1,0,1)*speed*Time.deltaTime;// движение по заданным осям со скоростью установленной переменной speed

вот типа того бы, с пояснениями и дальнейшим развитием их применения
ещё поподробней бы про кватернионы и ейлеры, каким образом кватернион вывести в вектор3
про ригидбоди — нет нигде информации, как ограничивать угол поворота по осям,матф.кламп
как использовать драг по разным осям с разным значением
гравитация и енерция их ограничения и направления,
почему объект в вертикальном положении может подвергаться гравитации а в горизонтальном уже нет..+-

45ˆ
подробного про get set не хватает с примерами, пишут что много чего можно делать, а примеров нет, даже въехать сложно как выжать из него пользу чтобы фантазия стартонула….
учил с++ по Шилдту,3 изд,(в с# (юнити) нету чтоле *и& ?(ссылки, указатели) что то не встречал в скриптах)
так вот чего там нехватает — примеров хотябы с кошками и блошками
тут ещё надо въехать в API, как спаять школьный мелок с мышкой и клавой
а так — ждём продолжения ,всё довольно доходчиво преподносится..

Спасибо за отзыв! Приятно! ��
Стараюсь поддерживать актуальность сайта по мере сил и возможности.

Отдельное спасибо за темы для новых статей.

Спасибо очень сильно помог, ещё раз большое спасибо.

есть vector3 как взять по нему gameObject?

Здравствуйте. К сожалению никак. Vector3 это структура данных, которая содержит информацию о точках X,Y,Z.
Vector3, как и Vector2 стоит рассматривать наравне с int, string, bool, float..

Например. Контейнер gameObject всегда содержит ссылку на компонент (обязательный) transform.
А transform содержит много свойств, отвечающих за позицию и размер объекта на сцене. Одно из свойств, как раз position — является Vector3.

Через любой компонент можно получить ссылку на gameObject, как и через gameObject можно получить ссылку на любой компонент, который данный gameObject содержит внутри себя.
Например: var boxColl >();
Но Vector3 не является компонентом в Unity3D.

Являются компонентами только те объекты, которые можно добавить к gameObject’у, используя графический интерфейс редактора Unity3D.

Спасибо за хорошо изложенную информацию) Сделал по туторам три простеньких игру, просто повторяя все за автором курса. Но во многое не въехал. Тут почитал, многое встало на свои места сразу. У вас талант к ясному изложению. Не бросайте это дело)

Здравствуйте! Большое спасибо за ваш отзыв ��
К сожалению сейчас нет особой возможности вести блог.
Но если у вас есть какие-то конкретные вопросы по Unity3D, то я могу с удовольствием на них ответить.

unity3d — C# для Unity.Изучение

Как изучить С# для Unity?Я думаю что есть разница между обычным си шарпом и для Unity.

    13 2
  • 6 янв 2020 2020-01-06 17:07:29
  • Veudd

2 ответа

Чтобы изучить C# для Юнити, надо кодить. Выдумываешь себе небольшой проектик и пишешь, все возникающие вопросы решаешь гуглингом и вопросами на тематических форумах. С# на Юнити ничем не отличается от классического, разве что версия немного устаревшая. Но раз уж ты работаешь с юнитевскими объектами — то и синтаксис будет тот, который заложили разработчики движка. Но опять же без базовых знаний ООП лучше не набивать шишки, базу надо знать.

  • 7 янв 2020 2020-01-07 07:53:36
  • Tobias

Нет, разницы практически нет, разве что версия языка в Unity несколько отстает от актуальной. Все дело в предметной области — если обычный программист работает со стандартной библиотекой и через нее взаимодействует с ОС, то в Unity ты имеешь дело с движком и его API, объектами, классами и т.д. Основа одна — так что сам язык можно учить просто как обычно в отрыве от Unity. Синтаксис, алгоритмы, классы и паттерны — все это актуально для любого программирования. Почитайте книги «Язык программирования C# 5.0 и платформа .NET 4.5» Троелсана — например, я ее старую редакцию в свое время прочел — только вас там разделы типа WPF не должны, по идее, интересовать. Кто там еще — Рихтер, хоть на первый взгляд нафиг в контексте Юнити не сдался — но для общего образования как программиста книга любопытная. Ну и практика, практика и еще раз практика. Без этого никак. Знавал людей которые ничерта не смыслили в программировании и в теории полный ноль — но благодаря обширной практики и усидчивости делали готовые и работающие вещи, пусть внутри говнокод — но это работало и многим даже давало работу и доход. Правда потом они все равно сталкивались с необходимостью подтягивать свой уровень и такое обучение им вставало определенным образом боком — но то совсем иная история.

Разработка игр (Урок 25 — C# или UnityJavaScript Выбор языка для Unity 5, перевод и совмещение.)

Видео Разработка игр (Урок 25 — C# или UnityJavaScript Выбор языка для Unity 5, перевод и совмещение.) от автора Владимир СВЕТ Игродельский.

171 | 9
Владимир СВЕТ Игродельский | 4 год.

Игровой видеоролик «Разработка игр (Урок 25 — C# или UnityJavaScript Выбор языка для Unity 5, перевод и совмещение.)» можно скачать бесплатно в форматах mp4, x-flv, 3gpp, для этого нажмите кнопку «Скачать видео» которая находится сверху.

Описание:

В этом уроке Я отвечу на вопрос «На чем писать скрипты для Unity ?» , покажу основные отличия СиШарп (С#) от UnityJavaScript (Js) для новичков, объясню какой язык лучше выбрать в начале, а также как переводить из одного языка в другой.
Мой Cubium Dreams в STEAM:

Моя группа во ВКОНТАКТЕ:
Мои сайт:
Моя страница в Фейсбуке:

(игродельский, igrodelsky, разработка игр, юнити, unity3d, unity 5 )

Кроме того, вы можете посетить канал автора «Владимир СВЕТ Игродельский«, который можно найти на нашем бесплатном видео сайте и посмотреть похожие видеоролики про данную игру.

Видео для мобильного телефона, смартфона, планшета и т. д. можно посмотреть тут онлайн, бесплатно и без регистрации. А также скачать мобильное видео в формате mp4, x-flv и 3gpp!

Пожалуйста, оставьте свой комментарий или отзыв к этому видеоролику! Автору будет очень интересно узнать, что вы думаете о его работе.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих