.net c# — Способы локализации своей игры на Unity3D (C#)


Содержание

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

Посетителей: 11802 | Просмотров: 18170 (сегодня 3) Шрифт:

Как архитектор ПО я создал много систем, занимался обратным инжинирингом вредоносного программного кода и, в целом, мог бы достаточно легко разобраться почти в любом коде. Однако, когда дело дошло до создания игр, я слегка растерялся, даже не зная, с чего начать. На заре эпохи 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).

Цукерберг рекомендует:  UX-дизайн для начинающих

Рис. 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. Экспортируйте на выбранную платформу.
  • Тестируйте на этой платформе. Развертывайте.

Unity3D & C# — Какую часть языка нужно знать? [закрыт]

Изучаю C#, но в дальнейшем планирую заниматься 2D играми на Unity3D.

Какую часть чистого C# языка нужно знать для того, чтобы смело идти в Unity3D и учить уже особенности самого движка?

Закрыт по причине того, что необходимо переформулировать вопрос так, чтобы можно было дать объективно верный ответ участниками Алексей Шиманский, br3t, mymedia, Lex Hobbit, default locale 14 авг ’17 в 3:33 .

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

3 ответа 3

Для того, чтобы уверенно идти в Unity3D необходимо знать минимум основы языка C#, надо хотя бы понять его синтаксис. Вам точно пригодится создание массивов, класов и прочих объектов. В глубь языка лезть не обязательно, но если у Вас будет больше опыта в этом языке, то Вам будет ещё легче создавать свой будущий шедевр. Поэтому если у Вас есть возможность учить язык, учите его полностью, ведь язык не может быть выучен по частям, язык это что-то целое и если вы хотите создавать даже простые игры Вам он понадобиться в полном объёме.

В самую первую очередь почитай «Microsoft CTS», даже до изучения синтаксиса (прям с msdn’a читай). Это прямо верхушка и сама концепция языка. Сильно в msdn не углубляйся, т.к. там в основном фреймворк .net, а не голый c#. После того как поймёшь концепцию языка начинай учить синтаксис. После этого можно уже переходить к паттернам.

Советую изучить C# полностью т.к. переменные, классы, массивы и прочие штуки C# пригодятся в юнити. Если не изучить будет сложно потом изучать юнити и понимать, что за что отвечает. Учи C# полностью. Почитай Герберт Шилдт полное руководство C# 4.0 и посмотри роликов в ютубе

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# unity3d или задайте свой вопрос.


Похожие

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.13.35419

Введение в программирование 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. Вот так можно выводить координаты объекта в консоль:

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

Продукты и технологии:

Unity, C#, Microsoft .NET, Mono

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

  • разработка для Windows;
  • использование специфичного для платформы кода;
  • варианты сборки;
  • настройки игрока.

Добро пожаловать в последнюю статью цикла по разработке игр в Unity. Помните, когда впервые взорвался рынок приложений? На волне всеобщего увлечения создали колоссальное количество программ, и у нас появились приложения для всего. Но в этом море приложений людям стало сложно найти нужное приложение. Приложения, которые теряются на рынке, стали крупной проблемой для разработчиков. Windows Store/Windows Phone Store — далеко не доминирующая рыночная площадка на планете. Означает ли это, что вы не должны ничего разрабатывать для этого рынка? Абсолютно нет. У разработчиков есть реальные шансы на то, что здесь их приложения будут найдены своей аудиторией. Я часто слышал о разработчиках, приложения которых становились рекомендуемыми. Я знаю троих, с приложениями которых это произошло на других платформах, а я общаюсь со множеством разработчиков, использующих все платформы.

В этой статье я рассмотрю процесс переноса в Windows игры, созданной в Unity. Этот процесс довольно прямолинеен и позволяет весьма эффективно интегрировать платформу, что довольно легко реализовать в игре. В Unity 4.5 доступен превосходный инструментарий, который также поддерживает новые универсальные проекты (Universal Projects) (решения, генерирующие пакеты для Windows Phone и Windows Store с общим кодом).

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

Платформа

Если вы читаете этот журнал, то, вероятно, имеете представление об экосистеме Windows. Я лишь кратко расскажу, что поддерживает Unity в этой экосистеме. Вы можете вести разработку в расчете на Xbox 360, Xbox ONE, Windows Phone 8/8.1, Windows 8/8.1 (приложения Windows Store) и настольные компьютеры. В бесплатной версии Unity можно выбрать любую из этих платформ, кроме Xbox. Вы увидите, что Xbox перечисляется в вариантах сборки, но не сможете ничего скомпилировать под него, если только вы не являетесь участником программы ID для Xbox ONE. В случае Xbox 360 вы должны зарегистрироваться через уполномоченного издателя. Если вы работаете над чем-то сногсшибательным, пожалуйста, ознакомьтесь с программой ID по ссылке xbox.com/Developers/id. В Windows Phone и Windows Store процессы сборки очень похожи.

Помните, что Windows Phone и Windows Store предлагают следующие варианты сборки: Windows Phone 8 через Silverlight, Windows Phone 8.1 через Silverlight или Windows Runtime (WinRT), Windows 8, Windows 8.1, универсальные приложения, рассчитанные на Windows Phone 8.1 и Windows 8.1.

Разработка для Windows

Выполнить сборку из Unity на самом деле довольно легко. Для локального тестирования просто откройте диалог сборки (File | Build Settings), щелкните Build и выберите папку для вывода. Вариант Build and Run запустит вашу игру после компиляции либо на подключенном смартфоне, либо в вашей локальной системе — в зависимости от того, что именно вы выбрали. Это базовый уровень. После успешной сборки будет открыта выбранная вами папка либо с исполняемым файлом, либо с решением Visual Studio. Ошибки будут выводиться в консольном окне, поэтому всегда лучше заранее открывать его через меню. Если у вас не открыто консольное окно, вам придется все время посматривать на самую нижнюю строку состояния в окне Editor и обращать внимание на сообщения с красным текстом.

Для всех вариантов сборки Unity выполняет сборку с помощью так называемого игрока (player) и поддерживает игроков всех других платформ, упомянутых ранее. Создавая сборку своей игры, вам понадобится добавить в сборку каждую нужную вам сцену. Чтобы загрузить различные сцены в вашей игре (кроме первой, которая загружается по умолчанию), используйте Application.LoadLevel, который принимает либо имя сцены, например Application.LoadLevel(«Level1»), либо индекс вида Application.LoadLevel(2). Я не любитель указывать индексы, потому что, как вы увидите, порядок сцен может запросто меняться.

Каждый уровень, который вы хотите загружать в коде, должен быть добавлен в сборку. В диалоге Build settings вы включаете любые сцены кнопкой Add Current или перетаскиванием файлов сцены на диалог сборки. Здесь вы можете переупорядочить их (что, опять же, делает загрузку сцен по индексу опасной). Вы можете разрешить или запретить использование этих сцен для любой сборки, помечая или снимая флажки рядом с ними. Как показано на рис. 1, нужно выполнить следующие операции.

  1. Добавить сцены в сборку.
  2. Убедиться, что нужные сцены отмечены. Я часто отмечаю тестовую сцену для включения в локальную сборку и сбрасываю ее флажок в финальной сборке.
  3. Выбрать платформу, под которую вы хотите скомпилировать игру.
  4. Щелкнуть Switch platform, чтобы Unity подготовила ваши ресурсы для выбранной платформы и включила специфичные для платформы константы препроцессора, такие как UNITY_METRO, UNITY_IPHONE, UNITY_WEBPLAYER и т. д.
  5. Скомпилировать свою игру в пакет, специфичный для платформы.


Рис. 1. Добавление сцен в сборку

Для настольной Windows Автономная (настольная) сборка предлагается по умолчанию при открытии Unity. При такой сборке Unity использует Mono для компиляции сборок (assemblies) и пакетов вашей игры вместе с ядром исполняющей среды. Вы получаете исполняемый файл и папку, в которую пакуется все. Эта сборка (build) предельно прямолинейна.

Для Windows Store и Windows Phone А здесь начинается самое интересное. При экспорте в Windows Store и Windows Phone можно добиться весьма впечатляющей интеграции с платформой. Вы можете использовать активную плитку (live tile), чтобы завлекать пользователей вернуться в вашу игру, отправлять текстовое сообщение, применять настройку геозон (geofencing) и др. Главное, что нужно отметить, — интегрировать функциональность, специфичную для платформы, в вашу игру сравнительно легко.

Процесс сборки слегка отличается от сборки для настольной системы, хотя вы по-прежнему можете воспользоваться Build and Run из диалога и довольно быстро получить рабочее приложение Windows Store или Windows Phone для тестирования.

Чтобы понять, где специфичный для платформы код важен для вашей Unity-игры, посмотрите, как Unity компилирует ваш код. Код, выполняемый в Unity Editor, компилируется лицензированной версией Mono. Это означает, что вы не можете обращаться к WinRT (Windows Store/Windows Phone 8.1) API, например использовать GeoLocation, пока игра выполняется в Editor, поскольку специфические WinRT-методы отсутствуют в Mono. Аналогично в Mono есть свои средства, которых нет в Windows Runtime, такие как Hashtable и доступ к файлам через System.IO в традиционной .NET. Многие виды функциональности в Mono и Windows Runtime перекрываются, но у них другие API.

Когда вы компилируете свой проект для Windows Store, Unity использует Microsoft .NET Framework для компиляции игровых сборок. По умолчанию для компиляции сборок применяется .NET Core, чем, по сути, и является WinRT .NET. Вам просто нужен способ сообщить Unity компилировать ваш код, специфичный для платформы, только при компиляции для этой конкретной платформы.

Есть два способа использования кода, специфичного для платформы. (Существует и третий, называемый мостовым [bridge], который связывает операции между кодом Unity и решения Visual Studio, но он применяется гораздо реже и поэтому здесь не рассматривается.) Первый способ — подключение плагина. Вы можете написать свой плагин, что весьма тривиально, или скачать подходящий из нескольких хороших источников. На момент написания этой статьи плагины от prime31.com для Windows Store и Windows Phone были бесплатными. Практически все основные издатели, применяющие Unity, используют плагины в своих игровых проектах. Скачивайте их, пока можно.

Использование специфичного для платформы кода

Через плагины Модель плагинов в Unity использует две версии библиотеки с одинаковыми сигнатурами методов. Одна из них является, по сути, заглушкой, компилируемой под .NET Framework 3.5 и помещаемой в Assets\Plugins\YourPlugin.dll. Эту версию Unity применяет, когда ваша игра выполняется в Editor. Другая компилируется под целевую платформу, скажем, Windows Store или Windows Phone и пакуется в вашу игру, когда вы осуществляете сборку из Unity (рис. 2).

Рис. 2. Сборка с кодом, специфичным для платформы, через плагин

Специфичная для платформы библиотека помещается в Assets\Plugins\

\YourPlugin.dll (платформой может быть Windows 8.x, iOS, Windows Phone 8 и т. д.). Если у вас есть причина создать свою библиотеку вместо того, чтобы скачивать одну из множества доступных, загляните по ссылке bit.ly/1EuLV1N — там есть базовые инструкции на этот счет. Основное отличие в плагинах (помимо API платформы, конечно) заключается в том, куда вы помещаете специфичную для платформы DLL. Места размещения плагинов можно узнать по ссылке bit.ly/1v2ml1m.

Применение одного из плагинов с prime31 для установки активной плитки — дело простое: достаточно подключить код с рис. 3 к любому GameObject в вашей сцене. SettingsPane и класс Tiles — плагины, содержащие функциональность для реализации специфичного для платформы кода.

Рис. 3. Код плагина от prime31

Через директивы препроцессора Вы также можете использовать директивы препроцессора, чтобы включать или отключать компиляцию подставляемого кода. Это распространенный способ при разделении кода между платформами и разнообразными технологиями, и он тоже часто применяется в Unity-играх. С помощью этого способа вы просто указываете директиву в коде класса. Эти директивы можно использовать в разных целях. Помните важное правило: разделяйте свой код по платформам с помощью директив препроцессора, специфичных для платформы; одни директивы становятся активными в момент переключения платформ в настройках сборки в Unity (вроде UNITY_METRO), другие — только при компиляции вне Editor (NETFX_CORE), а третьи могут быть доступны постоянно (например, проверка версии Unity, UNITY_4_5 и другие директивы, определенные вами).

Я покажу пример использования кода, специфичного для платформы Windows. Если нужен доступ к GeoLocation в Windows Runtime, этот код можно включить прямо в класс, производный от MonoBehavior (рис. 4), и этот класс назначить любому GameObject. Поскольку этот код скомпилирован в Editor с помощью Mono, он потерпит неудачу без его обертывания в подходящую директиву препроцессора. Нам нужно сообщить Unity, что этот код компилируется только вне Editor. Возможно, вас интересует, в чем разница между NETFX_CORE и UNITY_METRO. Первая директива — это параметр компиляции, используемый, только когда сборки вашей игры компилируются для Windows Runtime. Вторая применяется при выборе Windows Store в качестве платформы в настройках сборки в Unity. Она может быть активна в вашем коде на C#, UnityScript или Boo. Лично я предпочитаю директиву NETFX_CORE для обертывания своего WinRT-кода, а не UNITY_METRO, так как NETFX_CORE доступна лишь при экспорте/сборке, а UNITY_METRO активна в Editor, как только вы переключаете платформы в Build Settings. То есть код может выполняться и в Editor, что вызовет проблему, если он содержит специфичный для платформы API. Вы можете добавить в ту же строку другие директивы, такие как && !UNITY_EDITOR, но я предпочитаю обходиться NETFX_CORE.

Рис. 4. Использование Geolocation

Сборки

Unity будет компилировать ваш код для Windows Store и Windows Phone 8.1, используя .NET Framework под Windows Runtime. Она не использует Silverlight for Windows Phone 8.1. Однако код для Windows Phone 8 компилируется как HH — Silverlight-пакет для Windows Phone, как и следовало бы ожидать.

Unity будет компилировать ваши игровые сборки (assemblies) и создаст решение Visual Studio, который вы в свою очередь будете использовать для определения финальной сборки (build). Иначе говоря, кроме случая сборки под настольную систему, вам понадобится выполняться финальную компиляцию в Visual Studio, прежде чем отправлять свою игру в Windows Store или Windows Phone Store. Решение, генерируемое Visual Studio, содержит двоичные файлы Unity, упакованные с вашими игровыми сборками и базовым хост-приложением на XAML/C# или C++. При каждой сборке из Unity единственное, что перезаписывается Unity, — ваша папка Data. Любой пользовательский код или другие изменения, внесенные в решение Visual Studio, не перезаписываются при последующих сборках из Unity.

Цукерберг рекомендует:  Сравнения - Как сравнивать дату-время в sql

Сборки для Windows Store и универсальных приложений

Я рассмотрю варианты сборки для Windows Store (рис. 5). Типы сборки для Windows Store в Unity включают Windows 8, Windows 8.1, Windows Phone 8.1 и универсальные решения, которые содержат проекты для Windows Phone 8.1 и Windows 8.1, а также общий проект, как показано на рис. 6. Кроме того, обратите внимание на флажок Unity C# Projects на рис. 5. Это невероятно полезная функция, и я настоятельно советую пользоваться ею. Она позволит создать решение Visual Studio с дополнительными проектами, содержащими ваш Unity-код (рис. 7). Вы можете изменять код в этих проектах до определенной степени, и при компиляции Visual Studio будет запрашивать Unity заново обработать ваши игровые сборки, не выполняя заново полной сборки из Unity. То есть вы можете редактировать свой Unity-код в конечном решении Visual Studio, что крайне важно для отладки кода, специфичного для конкретной платформы. Это означает, что вам не придется заново компилировать решение из Unity при каждом изменении в коде.

Рис. 5. Сборка для Windows Store

Рис. 6. Универсальное приложение с общим проектом

Рис. 7. Дополнительные проекты

Когда Unity генерирует ваше решение Visual Studio, стоит обратить внимание на несколько моментов. Прежде всего ваш проект Windows Store по умолчанию будет рассчитан на компиляцию под аппаратную платформу ARM, а не x86 (по крайней мере, на момент написания этой статьи). Это создает путаницу, когда пытаешься скомпилировать и запустить свой проект, и тут вдруг получаешь ошибку с сообщением, что система не относится к ARM. Хотя я советую создавать сборки как для ARM, так и для x86, в целях локального тестирования нужно выбрать x86, чтобы избежать этой ошибки с ARM. Кроме того, на момент написания статьи в Unity не было 64-разрядных игроков для Windows Store или Windows Phone. Если у вас есть одно из немногих ARM-устройств с Windows 8, такое как Surface 1 или Surface 2 (RT не относится к Pro; Pro является системой на базе x86), тогда выбирайте ARM и выполняйте удаленное развертывание и отладку. Однако большинство разработчиков использует для локального тестирования ПК на основе x86.

Далее вы заметите, что Build Configuration Type включает варианты Debug, Master и Release. Это контрастирует с типичными .NET-приложениями, где возможны лишь варианты Debug и Release. Сборка Debug самая медленная. Она содержит отладочную информацию и поддерживает Unity Profiler — средство профилирования в версии Pro, применяемое для оптимизации игр. Сборка Release полностью оптимизируется, но тоже поддерживает Unity Profiler. Сборка Master — это то, что вы передаете в каждый магазин. Это оптимизированная, готовая к работе версия, которая не поддерживает Unity Profiler. При первом тестировании игры я выбрал сборку Master, чтобы получить реальное представление о скорости работы игры на своем устройстве.

В случае Windows Phone два основных варианта: Windows Phone 8 или Windows Phone 8.1. Приложения Windows Phone 8 будут нормально работать на устройстве с Windows Phone 8.1, хотя в Windows Phone 8.1 стратегия совместного использования кода, специфичного для платформ, гораздо эффективнее, поскольку вы можете ориентироваться на универсальные приложения, которые делят около 90% API с приложениями Windows Store. Однако в случае типичной игры это совместное использование кода может оказаться не особо полезным, если только вы не пишете специфичный для платформ код.

Как только у вас будет решение в Visual Studio, запакуйте его и отправьте в магазин, как и любое другое приложение Windows Phone или Windows Store. У вас обязательно должна быть учетная запись разработчика для Windows Store; вы лишь раз платите за нее и потом пользуетесь всю жизнь. Процесс передачи неоднократно описывался в различных материалах, но краткие обзоры можно посмотреть в «Publish to the Windows Store» (bit.ly/Za0Jlx)), «Publish to the Windows Phone Store» (bit.ly/1rdDCwR) и «Why and How to Port Your Unity Game to Windows and Windows Phone» (bit.ly/1ElzrcL).

Параметры игрока Я обсуждал базовый процесс сборки из Unity для Windows, но не рассмотрел, как задать значки, начальные экраны (splash screens), имя приложения и другие необходимые элементы. Все это можно найти в Player Settings, которые загружаются с экрана Build Settings и позволяют конфигурировать все основные параметры для приложений Windows Store и Windows Phone, как показано на рис. 8. Вы можете указать здесь начальный экран, имя приложения, издателя, параметры компиляции, значки, возможности приложения, например сервисы позиционирования, и некоторые другие параметры. Эти параметры публикуются в вашем решении Visual Studio, как только вы впервые скомпилируете решение из Unity.

Рис. 8. Параметры игрока для Windows Store

Значки приложения Unity предоставляет вашему приложению некоторые значки по умолчанию, чтобы оно могло быть скомпилировано в Visual Studio. Но вы должны сменить эти значки по умолчанию, иначе вы рискуете не пройти сертификацию. Unity заметно упрощает просмотр того, какие изображения вы можете задать в проекте, но вы должны свериться с документами на сертификацию для каждой платформы, чтобы определить, какие именно изображения обязательны. Вы должны проверить Visual Assets в файле Package.appxmanifest в Visual Studio (для Windows Store и универсальных приложений), так как Unity могла установить некоторые изображения по умолчанию, которые вы не заменили своими, — их нужно удалить.

Как минимум, в приложении Windows Store должны быть эмблема магазина 50×50, квадратная эмблема 150×150, квадратная эмблема 30×30 и начальный экран 620×300, как описано в Windows Dev Center (bit.ly/1vIJsue). В приложениях Windows Phone 8 обязательны изображение списка приложения (app list image) и изображение для плиток по умолчанию малого и среднего размеров, используемых на экране Start, как описано в Windows Dev Center (bit.ly/1oKo8Ro). Приложения Windows Phone 8.1 требуют тех же изображений. Магазины (которые, по слухам, унифицируются с Windows 10) могут запросить некоторые другие изображения в процессе передачи, например экранные снимки.

Если вы намерены предоставить только одно изображение для плиток на экране Start, то должны передать изображение, масштабируемое до 240% в случае приложений Windows Phone Store и до 180% в случае приложений Windows Store, как поясняется в Windows Dev Center (bit.ly/1nzWber).

Кстати, некоторое время назад я написал простенькую утилиту, которая помогает генерировать изображения для приложений Windows Store. Вы найдете ее по ссылке bit.ly/ImageProcessor.

Перекомпиляция и перезапись Вспомните, что Unity перезаписывает только вашу папку Data в вашем проекте Visual Studio (рис. 9). Это обоюдоострый меч. Вы можете задать начальный экран, значки и прочее в любой момент в Unity (и я советую делать именно так), но, если вы уже сгенерировали свое решение Visual Studio, файл Package.appxmanifest, содержащий эти настройки, не будут перезаписан при следующей компиляции из Unity. Вам придется вручную задавать визуальные ресурсы, возможности и многое другое в своем решении Visual Studio в файле Package.appxmanifest или создавать новую папку и искать разницу в структуре папки с помощью утилит вроде BeyondCompare, или удалять решение Visual Studio, если в нем нет вашего кода, и давать возможность Unity заново сгенерировать его. Обычно я выбираю третий вариант, потому что я храню все свои сконфигурированные изображения значков и начального экрана в Unity. Мне остается лишь не забыть перенести собственные активные плитки в решение Visual Studio. Если вы разрабатываете под Windows Phone 8 (но не 8.1), значок в любом случае должен быть установлен в Visual Studio; этот случай один из немногих, которые не обрабатываются из Unity.

Рис. 9. Папка Data в проекте Visual Studio

Only thing Unity overwrites Unity перезаписывает только эту папку

Заключение

Процесс сборки чрезвычайно прост. Настройте параметры сборки, щелкните кнопку Build, откройте решение и разверните его. Я показал варианты оптимизации вашей сборки через плагины и директивы препроцессора. Поскольку вы можете вызывать специфичный для платформы код вне Mono, вы получаете кое-какие дополнительные возможности. Не забудьте проверить на prime31.com плагины для Unity, которые в настоящее время бесплатны для платформы Windows. Они позволяют легко интегрировать функционал платформы всего несколькими строками кода. Также заглядывайте на Channel 9 за новыми обучающими материалами по Unity (рассчитывайте на десятиминутные видеоролики) и в мой блог на Channel 9 за многими советами по компиляции игр для разных платформ.

Дополнительные ресурсы

  • Блог Адама на канале Channel 9 (bit.ly/AdamChannel9)
  • «Microsoft Virtual Academy: Developing 2D & 3D Games with Unity for Windows» (bit.ly/FreeUnityTraining)
  • Ресурсы Unity (unity3d.com/learn)

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

Выражаю благодарность за рецензирование статьи экспертам Unity Томасу Дирванаускасу (Tomas Dirvanauskas), Игнасу Зиберкасу (Ignas Ziberkas) и Тоутвидасу Цилису (Tautvydas Žilys).

Уроки Unity C#

Unity C# уроки / #1 — Начинаем программировать

Видеоурок


Создание игр на движке Unity невозможно представить без написания дополнительного кода. В Unity поддерживается два языка программирования — JavaScript и C# . Раньше также поддерживался язык Boo , но позже от него отказались.

Задание к уроку

Установите Unity, а также установите текстовый редактор для дальнейшей работы со скриптами.

Установить Unity можно на официальном сайте. Урок по установке:

Чтобы установить среду разработки вам потребуется скачать либо MonoDevelop , либо Visual Studio .

Большое задание по курсу

Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца

Unity

Уроки по использованию Unity — использующей C# платформы для разработки игр от Microcoft.

Интеграция своей игры в Steam: работа с лобби в Steamworks.NET

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

Практические советы по использованию профайлера в Unity

Unity профайлер даёт конкретные данные о производительности игры и облегчает процесс её оптимизации. В этой статье научимся с ним работать.

Вакансии, где нужны знания Unity

Оптимизируем работу с физикой в Unity

В данном материале будет рассмотрено несколько полезных приёмов использования физики в играх и примеры их практического применения. Предполагается, что у читателя уже есть опыт разработки на Unity. Как быстро написать…

Как быстро написать игру для Android на Unity

В своё время Flappy Bird, не имея сложной механики и графики, стала хитом. Сегодня мы расскажем, как всего за 10 минут написать свой вариант игры на Unity под Android.

События и курсы

Создаём простое VR-приложение под Android с помощью Unity

Виртуальная реальность — это новое захватывающее направление в разработке приложений. Разберём, как создать VR-приложение с обзором в 360 градусов для Android. Навыки программирования не требуются.

Курс «Создание 2D-игры под Android»

Курс по созданию 2D-игры на Unity 5, в ходе которого вы познакомитесь с Unity, созданием скриптов, управляющих элементов и публикацией игры в Google Play.

Создание Minecraft на Unity3D. Часть вторая. Генерация мира

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

Как разрабатывать приложения смешанной реальности для Microsoft HoloLens: взаимодействие с окружающим пространством

В предыдущей части мы создали нашу первую голограмму и научились с ней взаимодействовать. Теперь мы соединим нашу голограмму с реальным миром.

Создание Minecraft на Unity3D. Часть первая. Создаем базовый куб с текстурой

Мы начинаем серию уроков, ориентированную на то, чтобы научить вас создавать простую Minecraft-подобную игру, а также изучить различные аспекты движка Unity3D. Так как это вводный урок, алгоритмы и структура объектов, представленные…

Программистов ищут в веб-студии (PHP, вёрстка), а также начинающих командах по разработке игр (Unity), платформы в сфере проектного менеджмента (UI), аналитической платформы для анализа финансовых рынков (С#)

Программист Unity3D и C++, Москва Работа в офисе Нужен опыт Регулярная зарплата (100–150k) Игровая Механика — небольшая группа разработчиков игр на PC и мобильные платформы, существующая более 1,5 лет. В декабре 2015 года…

Самый простой способ сделать игру на Unity 5

Видеокурс о создании игры на Unity 5 от самых основ до сборки под Universal Windows Platform.

Save the Penguin — рассказ о первом опыте разработки под Android

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

Руководство по моделированию 2D водной поверхности

Рассказывает Alex Rose В этой статье мы рассмотрим создание динамической 2D воды с простейшей физикой. Мы будем использовать рендер линий, мешей, триггеры и частицы. Конечный результат с волнами и брызгами…

Создание ландшафта на Unity за 24 часа

Рассказывает Натаниэль Долдерсам, голландский разработчик игр Скриншоты и ссылки на скачивание демо-ландшафта расположены по этой ссылке. Введение В этой статье я расскажу о том, как мы с Питером за 24 часа…

Пишем Сапёр на Unity. Обработка конца игры

В заключительной части нашей серии мы будем доводить уже почти готовую игру до ума. К концу этого урока ваш Сапёр будет вполне играбельным: игрок сможет и проиграть уровень, и выиграть…

Пишем Сапёр на Unity. Взаимодействие

Мы продолжаем нашу серию уроков по написанию Сапёра на Unity. В этой части мы реализуем взаимодействие между клетками, сделаем так, чтобы они подсвечивались при наведении мыши, а также добавим возможность…

Пишем сапёр на Unity. Настройка

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

Как выполнять сохранение и загрузку игры в Unity

Совсем недавно мы опубликовали серию уроков (1 часть, 2 часть, 3 часть, 4 часть) по созданию простой игры, используя очень распространенный игровой движок — Unity. В этой статье мы покажем…

Пишем арканоид на Unity. Добавление звуков и новых уровней

Мы продолжаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем один из аспектов…

Пишем арканоид на Unity. Поведение блоков, префабы и дизайн уровней

В этой статье мы продолжаем серию уроков о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем…

Пишем арканоид на Unity. Механика мяча и платформы


Итак, мы продолжаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем один из…

Пишем арканоид на Unity. Настройка проекта

Мы начинаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком, который, ко всему прочему, совсем недавно стал бесплатным. В…

Методы оптимизации при разработке в Unity 3D

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

.net c# — Способы локализации своей игры на Unity3D (C#)

Вы хотите начать изучать программирование в 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) видимыми в редакторе. См. внизу экранный снимок из Инспектора.

Функции

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

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

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

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

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

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

Цукерберг рекомендует:  Занимательные элементы интерфейса в HTMLCSS. Занимательные элементы интерфейса в HTMLCSS

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

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

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

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

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

Классы

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

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

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

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

Туториал 0: Юнити и C# скрипт — основы


Вступление:

Скажу честно, я не программист, так что вполне возможно будут какие-то неточности. Это не игровой туториал. Я постараюсь рассказать, как работают скрипты в Юнити 3Д.

С# относительно не сложный язык. Точнее сама основа языка простая, сложности начинаются, когда уже совсем далеко углубляешься в него. Но на самом деле с помощью Юнити3Д можно делать простенькие игрушки только используя основы С#. C# объектно ориентированный язык програмирования. Это пишут все, но как я понял большинство не особо понимает смысл этого, как и я. Но учитывая, что придется работать со скриптами, это не так и важно для начала. Не стоит пытаться создать один огромный трудно понимаемый скрипт для всей игры. Пробуйте разделить игру на части. В свою очередь эти части могут взамодействовать друг с другом. Используйте эти части как кирпичи для создания итоговой игры. В C# используется >

Небольшой пример:

Как использовать C# скрипты ?

Не забываем, это не игровой туториал, только вкратце о принципе работы с Юнити3Д.

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

// Use this for initialisation
void Start () <
>

//Update is called once per frame
void Update () <
>
>

Небольшое объяснение строчек:

Using UnityEngine; Добавляем доступ на UnityEngine библиотеку. Это набор различных классов/функций от Юнити3Д.
using System.Collections; Это стандартная библиотека от Microsoft .NET.
public class Moving : MonoBehaviour < public даёт возможность доступа на этот скрипт с других скриптов. class Moving название нашего скрипта/класса. MonoBehaviour это основной класс от Юнити3Д, в нём такие важные функции как Update(), Start (). Смотрите Unity Documentation для более точного описания.
// Use this for initialization Это просто комментарий. Только для вашего удобства.
void Start () <> void Обозначение, что последующая функция не будет возвращать параметр (то-есть никаких вернувшихся переменных после её вызова не намечается). Start () <> эта функция выполнится один раз при старте скрипта.
void Update () <> Эта функция будет выполняться заново каждый игровой кадр.

Теперь мы можем передвинуть астероид в центр игрового мира (находится на координатах (0, 0, 0)). Позиция игрового объекта определяется в Transform компоненте. Нам надо присоединить наш скрипт к астероиду. С этого скрипта мы можем менять переменные в Transform компонент. Эти переменные и определяют положение объекта в сцене.

Например мы хотим переместить астероид в центр при старте игры.

Если надо получить доступ на какой-то компонент игрового объекта, то обычно надо сделать следующие шаги:

1. Найти нужный игровой объект: Тут много разных вариантов, все зависит от условий.
— Можно использовать поиск из C# скрипта GameObject.Find («Name») / GameObject.FindWithTag («Tag»). Это поиск по имени или тэгу.
— можно создать переменную типа игровой объект public GameObject; и потом в эдиторе указать к какому объекту привязана эта переменная.
— можно получить линк на игровой объект с различных функций. Например: (Trigger, Raycast. ).
— и не нужен поиск объекта, если скрипт уже находится на этом объекте.

2. Получить доступ на компонент этого объекта: через команду gameobject.GetComponent (); или GetComponent (); если скрипт на том-же объекте.

Доступ к Transform компоненту:

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

// Use this for initialisation
void Start () <
//сменить местоположение игрового объекта
transform.position = new Vector3 ( 0 , 0 , 0 );
>

//Update is called once per frame
void Update () <
>
>

Если мы запустим нашу игру, то астероид будет перемещён в центр игрового мира.
Теперь посмотрим на Transform компонент:

Используйте команду transform. для доступа к Transform компоненту на том-же игровом объекте. И в нём можно изменить позицию, вращение и размер игрового объекта (пример: transform.localScale = new Vector3 (0.5F, 1, 1);). Ваш IDE (редактор) будет пытаться помочь в наборе команд и будут показанны различные возможные варианты.

Можно не только изменять переменные, но и просто запросить их значения.

Теперь посмотрим как работать с другими компонентами. У нашего астероида есть компонент для его отрисовки (рендерер).

Например мы хотим зеркально повернуть астероид вдоль y-оси. Так как наш скрипт уже прикреплён к астероиду, то нам не нужен его поиск в игровом мире. Мы можем получить доступ на компонент командой GetComponent ().. Название компонента можно посмотреть в инспекторе игрового объекта (только осторожно с пробелами). C# команда будет:
GetComponent SpriteRenderer >().flipY = true ;
И скрипт будет:

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//доступ к компоненту отрисовки и сменить переменную, отвечающую за зеркальное отображение по оси Y
GetComponent SpriteRenderer >().flipY = true ;
>

//Update is called once per frame
void Update () <
>
>

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
>

//Update is called once per frame
void Update () <
>
>

Похожим образом мы можем получить и доступ к компонентам на других игровых объектах.
Для начала нам надо «найти» другой игровой объект. Как я уже и писал, тут довольно много различных вариантов в зависимости от ситуации. Например в сцене есть другой игровой объект. Его имя Ship и тэг Player (Tag используется для идентификации объектов (похоже на имя, только скорость обработки быстрее)).

1. Если игровой объект находится в сцене с самого начала и не пропадает до запроса к нему, то мы можем создать открытую ссылочную переменную playerShip (с тимпом GameObject) в нашем скрипте и добавить этот объект в эту переменную через инспектор (просто перетащить объект на переменную в редакторе). И тогда через эту переменную у нас будет доступ на игровой объект. Например мы хотим поместить корабль на позицию (1, 1, 0) при старте игры. C# строчка будет:
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;
//публичная ссылочная переменная для корабля игрока
public GameObject playerShip;

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
//получаем доступ к transform компоненту игрока и меняем его местоположение
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
>

//Update is called once per frame
void Update () <
>
>

2. Мы можем найти игровой объект в сцене через поиск и сделать на него ссылку через скрипт с помощью команды GameObject.Find («Name») or GameObject.FindWithTag («Tag»). Поиск по тэгу производится быстрее чем по имени. C# строчка будет:
playerShip = GameObject .Find( «Ship» );
или:
playerShip = GameObject .FindWithTag( «Player» );

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;
//публичная ссылочная переменная для корабля игрока
public GameObject playerShip;

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
//ищем в сцене корабль игрока и делаем ссылку на него
playerShip = GameObject .FindWithTag( «Player» );
//получаем доступ к transform компоненту игрока и меняем его местоположение
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
>

//Update is called once per frame
void Update () <
>
>

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;
//публичная ссылочная переменная для корабля игрока
public GameObject playerShip;

// Use this for initialisation
void Start () <
//сменить местоположение игрового объекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
//ищем в сцене корабль игрока и делаем ссылку на него
playerShip = GameObject .FindWithTag( «Player» );
//получаем доступ к transform компоненту игрока и меняем его местоположение
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
//указываем, что работаем с кораблем игрока, получаем доступ к компоненту отрисовки и зеркально отображаем по оси Х
playerShip.GetComponent SpriteRenderer > ().flipX = true ;
>

//Update is called once per frame
void Update () <
>
>

3. Мы можем получть объект с различных игровых функций. Я покажу некотрые из них в последующих туториалах (как пример: OnTriggerEnter2D (Collider2D otherCollider) <> Ссылка на объект попавший в триггер будет в otherCollider переменной).


Наверняка уже заметили, что создание игры в Юнити — это просто работа с переменными в компонентах игровых объектов (я сейчас не говорю о создании музыки, моделей, текстов . Это уже совсем другая история). Теперь посмотрим на основы С# скриптов. Описание будет довольно коротким и затронет только базовые части. Так что для подробностей придется немножко погуглить или побродить по форумам.

Основы С# скриптов:

1. Переменные:

2. Ссылочные переменные классов:

Spoiler GameObject:
Все объекты в сцене Юнити это игровые объекты. Поэтому GameObject как базовый класс используется довольно часто. Как и большинство классов содержит в себе не только различные переменные, но и функции. Смотрите Unity Documentation для более точного описания. GameObject player;
//поиск оьъекта с тэгом Enemy и создание переменной с ссылкой на него
GameObject enemy = GameObject .FindWithTag ( «Enemy» );
Transform:
Один из очень часто используемых компонентов. Этот компонент есть у любого игрового объекта в Юнити. Отвечает за местоположение и размеры объекта в игровом мире. Так как в Юнити есть упрощённый доступ к компонету Transform у игрового объекта через команду gameobject.transform. , то используется как ссылочная переменная не так уж и часто. Смотрите Unity Documentation для более точного описания. Transform enemyPosition;
//считывание координаты х из трансформ компонента
float x = enemyPosition.position.x;
Sprite:
Класс представляющий 2Д картинку (спрайт) в качестве рессурса в Юнити. Если вы импортируете спрайт в Юнити, то будет автоматически создан новый класс содержащий этот спрайт с его различными настройками. В качестве ссылочной переменной понадобится при работе с компонентом отрисовки спрайтов. Смотрите Unity Documentation для более точного описания. Sprite enemyBullet;
SpriteRenderer:
Класс отвечающий за отрисовку (рендеринг) спрайта на экране. Рессурс для отрисовки берется из Sprite (см. выше). Как и большинство компонентов содержит в себе различные переменные и функции. Смотрите Unity Documentation для более точного описания. SpriteRenderer sr;
//активация переменной, отвечающей за зеркальное отображение по оси Y
GetComponent SpriteRenderer >().flipY = true ;
С# скрипты и другие компоненты:
Как я уже говорил, ваши скрипты являются компонентами в Юнити. Поэтому ссылочные переменные работают аналогичным образом.
1. создаёте переменную по типу компонента (используйте его название).
2. получаете доступ к компоненту через ссылочную переменную: variable = GetComponent ();

В качестве примера скрипт из вступления: Moving moving;
moving = GetComponent Moving >();
moving.playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
Все остальные компоненты работают аналогично. Не стану их описывать, так как их просто огромное количество.

3. Массивы (статические и динамические):

4. Модификаторы доступа:

5. Области видимости(действия) переменных:

Spoiler глобально в классе:
Переменная декларированная в классе, но не входящая в функции этого класса может быть использована глобально всеми функциями этого класса.
локально в функции:
Переменная декларированная в функции, может быть использована только в этой функции.
локально в цикле:
Область видимости такой переменной ещё меньше, она используется только локально в пределах цикла. using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//переменная speed может быть использованна любой функцией этого класса
public int speed;

void RandomFunction () <
//переменная isMoving может быть использованна только в пределах RandomFunction () <. >
bool isMoving = true;
//переменная i может быть использованна только в пределах цикла
for ( int i = speed; i 0 ; i—) <
speed = i;
>
isMoving = false;
>
>

6: Арифметические операторы:

7. Математические функции:

8. Условия и логические операторы:

Spoiler логические операторы сравнения:
Результат сравнения это бинарный результат, то есть ложно или истинно (true/false). Возможны следующие сравнения:
== — равно
!= — не равно
> — больше
— меньше
>= — больше или равно
— меньше или равно

условные операторы:
Условные операторы позволяют провести сравнение и выполнить определенную часть кода в зависимости от результата.
if . else:
Краткая форма этого условного оператора состоит только из условия и выполняемой части кода, если условие истинно. if (hp 0 ) <
isDead = true ;
canFight = false ;
> Полная форма состоит из условия, выполняемой части кода, если условие истинно и выполняемой части кода, если условие ложно. if (hp 0 ) <
isDead = true ;
canFight = false ;
> else <
isDead = false ;
canFight = true ;
> Возможно объединение различных условий в одну конструкцию. if (hp 0 ) <
isDead = true ;
canFight = false ;
> else if (hp == 100 ) <
isDamaged = false ;
> бинарные логические операторы:
С помощью таких операторов можно создавать более сложные условия, состоящих из нескольких подусловий.
&& — логическое И . Будет истинно, если оба условия истинны. Или ложно, если оба или одно из них ложно.
|| — логическое ИЛИ . Будет истинно, если одно из условий истинно. И ложно, если оба условия ложны.
if (hp 0 || hp > 0 ) <
isZero = false ;
> else <
isZero = true ;
> switch:
Этот логический оператор используется для обработки множества вариантов при нахождении истинного значения. string direction = «left» ;

//искомое выражение
switch (direction) <
//возможный вариант, если совпадает, то выполняется последующий код
case ( «up» ):
move = Vector2 .up;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//возможный вариант, если совпадает, то выполняется последующий код
case ( «down» ):
move = Vector2 .down;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//в данном примере выполнится эта часть кода и работа логического оператора будет завершена
case ( «left» ):
move = Vector2 .left;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//возможный вариант, если совпадает, то выполняется последующий код
case ( «right» ):
move = Vector2 .down;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//если ни один из вариантов не был истинной, то выполняется часть кода стоящая после default
default :
move = Vector2 .zero;
isMoving = false ;
//прерывает дальнейшее выполнение логического оператора
break ;
>

9. Циклы:

Spoiler for:
Этот цикл выполняется определённое количество раз. //для примера, декларация массива на 10 целых элементов
public int [] numbers = new int [ 10 ];

//int i = 0; декларация с инициализацией счетчика цикла
//i
//i++; изменение счетчика цикла
for ( int i = 0 ; i 10 ; i++) <
//исполняемая часть кода при каждом новом цикле
//в данном примере, заполнение массива числами от 0 до 9
numbers [i] = i;
> Хоть это и не обязательно, но советую использовать в счетчиках циклов целые значения, чтобы избежать ошибок от дробных вычислений.

while:
Этот цикл выполняется пока условие истинно. //для примера, декларация массива на 10 целых элементов
public int [] numbers = new int [ 10 ];
//декларация с инициализацией переменной к, которую будем использовать для проверки условия цикла
int k = 9 ;

//проверка условия цикла, выполнить цикл, если условие истинно
while (k >= 0 ) <
//выполняемый фрагмент кода в фигурных скобках
//заполнение массива числами от 9 до 0 в обратном порядке
numbers [k] = k; //уменьшение переменной на 1 (чтобы получить ложное условие)
k—;
> Будьте осторожны с циклами, чтобы не получить «вечный» цикл, когда условие всегда истинно и цикл повторяется вечно.

do. while:
Отличие этого цикла от цикла while только в том, что проверка условия производится после выполнения фрагмента кода. Поэтому этот цикл выполнится всегда как минимум один раз. //декларация публичной текстовой переменной
public string testText;
//декларация и инициализация целой переменной, для условия цикла
int j = 0 ;

//выполнение фрагмента кода цикла
do <
//добавление к текстовой переменной цифры преобразованной в текстовый символ
testText = testText + j.ToString();
//увеличение j на единицу
j ++;
//проверка условия, повторить цикл, если условие истинно
> while (j 10 );
//результат работы цикла это текст «0123456789»
foreach:
Цикл для работы с массивами. Перебирает все элементы по одному. //декларация и инициализация массива
int [] numbers = new int [ 5 ] < 21 , 28 , 13 , 4 , 15 >;
//декларация массива для копирования
int [] numbersCopy = new int [ 5 ];

//вспомогательная переменная для индекса массива
int i = 0 ;
//запуск цикла проходяшего по всем элементам массива
//переменная number должна совпадать с типом элементов массива
foreach ( int number in numbers) <
//копирование текущего элемента в другой массив
numbersCopy [i] = number;
//увеличение индекса на 1, для доступа к следующему элементу в массиве для копии
i++;
>
//итог цикла это копирование элементов в новый массив
операторы break и continue:
Эти операторы помогают управлять исполнением циклов.
break — этот оператор полностью прекращает цикл и переходит к дальнейшему исполнению программы
continue — этот оператор прекращает текущее исполнение цикла и начинает новое
//вспомогательная переменная для индекса массива
int i = 0 ;
//запуск цикла проходяшего по всем элементам массива
//переменная number должна совпадать с типом элементов массива
foreach ( int number in numbers) <
//копирование текущего элемента в другой массив
numbersCopy [i] = number;
//увеличение индекса на 1, для доступа к следующему элементу в массиве для копии
i++;
//как переменная для индекса стала равна 3, прекращаем исполнение цикла
if (i == 3 )
break ;
>

10. Функции:

Spoiler стандартные функции от Юнити:
Существует много различных функций в Юнити. Тут я точно не смогу показать и малой части. Поэтому пока ограничимся несколькими примерами. В дальнейшем в туториалах будут попадаться и новые функции.

Instantiate:
Эта функция помещает клон объекта в сцену. Обычно используется для клонирования префаба(образца). //создаёт клон префаба в сцене на заданной позиции (Vector3) с заданным вращением (Quaternion)
Instantiate (prefab, position, rotation); Destroy:
Эта функция удаляет объект из сцены. //удаляет игровой объект из сцены после заданного интервала (или сразу, если время не указать)
Destroy (gameobject, time); функции классов:
Часто, если используете какой-то компонент (класс), то он содержит различные функции для работы с ним. Список этих функций можно увидеть в редакторе C# после набора ссылочной переменной (+ точка) указывающей на этот компонент. //изменяет дробную переменную в компоненте аниматор
GetComponent Animator > ().SetFloat ( «Speed» , 0 );
функции пользователя:
Конечно можно использовать и свои функции для выполнения нужных задач. //функция нанесения повреждений
public void DoDamage ( int damage) <
hp = hp — damage;
if (hp 0 )
Destroy (gameObject);
>

Создание игры Lines на C# и Unity для Android

На этом вебинаре мы напишем известную игру Lines. Мы воспользуемся всеми преимуществами шаблона MVC: спроектируем модель, сформируем представление и напишем контроллер, который свяжет логическую и визуальную часть программы. Добавим звуковые эффекты и запустим игру на Android-смартфоне.

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

План вебинара:

  1. Правила игры Lines.
  2. Проектирование Model — алгоритм логики игры.
  3. Формирование View — интерфейс пользователя.
  4. Создание Controller — обработчик событий.
  5. Программирование методов с логикой игры.
  6. Добавление звуковых эффектов.
  7. Портирование игры на Android.
  8. Обзор созданного проекта.

Технологии: .NET, C#, MVC, Unity, Android.

Необходимое программное обеспечение: Windows 10, Visual Studio 2020, Unity 3D 2020.3, Android-смартфон.

Целевая аудитория: программисты, инженеры, IT-студенты.

Открытый вебинар курса «Разработчик игр на C#»
Игра «2048»

Открытый вебинар онлайн

На этом вебинаре мы напишем игру «2048» и запустим её на мобильном телефоне. Мы пройдём по всему жизненному циклу создания программы: планирование, создание модуля логики игры, интерфейса пользователя, подбор музыкальных эффектов, перенос игры на Android или iPhone.

План вебинара:
1. Правила игры «2048» и соревнование.
2. Планирование интерфейса логики игры.
3. Кодирование алгоритмов логики игры.
4. Создание игры на Windows Forms.
5. Создание интерфейса пользователя на Unity 3D.
6. Добавление звуковых эффектов.
7. Портирование игры на смартфон.
8. Подведение итогов.

Технологии:
C#, Library, Windows Forms, Unity 3D, Multimedia, Android, iPhone

Предварительные требования:
Windows 10, Visual Studio, Unity 3D Personal, Android и iPhone устройство.

Запись

О курсе

Преподаватель

Профессиональный программист. Преподаватель языка Java в колледже.
Автор видеокурсов по C#, Java, PHP

20 лет опыта ведущим программистом в разных фирмах и опыта преподавания в университете, колледже. 6 лет опыта ведения вебинаров и создания видеокурсов

Три самых крупных завершенных проекта:
PHP. Служба знакомств в интернете — PHP, MySQL, FreeBSD, C/C++
C#. Программа расчёта заработной платы на АЭС — C#, MS-SQL Server
Java. Видеокурс создания игры Сапёр на Java: https://goo.gl/24DgBg

Статьи на Habrahabr:
Как я создавал методику изучения C# — habr.com/post/239825/
Об альтернативном образовании и про C# — habr.com/post/257957/
Изучение C# — Практический подход — habr.com/post/304142/

Участие в IT-конференциях в Литве, призовое место в конкурсе программирования InfoBalt, призовое место на республиканской олимпиаде по математике и информатике

С окончания школы в 1996 году постоянно преподавал информатику в университете, школе, на кружках, в ДДТ, на предприятиях, в колледже. С 2013 года ведет вебинары онлайн, записывает видеокурсы
https://www.VideoSharp.info/

В 2002 году закончил Вильнюсский государственный университет по специальности «Магистр математики и информатики», а в 2008 году по специальности «Учитель профессии»

«В детстве меня вдохновила «Занимательная ***» серия книг Я. И. Перельмана. Считаю своим призванием создать занимательную методику обучения программированию.»

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