Как редактировать unity3d файл

Обновлено: 05.07.2024

Иногда эта сказка добрая — про пони и радугу. А иногда — про страшного бабайку. И очень важная часть данного движка, а именно расширения для редактора (custom inspectors) — как раз про бабайку. В статье я бы хотел поделиться опытом использования собственных расширений на примере нашей игры.

Некоторые из наиболее интересных наших расширений. Сколько на экран влезло

Начнём с определения. Вот, что говорится в документации про расширения: «Unity позволяет вам расширить редактор своими собственными инспекторами и окнами редактора (Editor Windows), и вы можете задать, как свойства должны отображаться и инспектора при помощи пользовательского Property Drawers».

То есть имеем три основных типа для расширения функциональности, наследуемые от базовых классов:

  • UnityEditor.Editor;
  • UnityEditor.EditorWindow;
  • UnityEditor.PropertyDrawer.

Первый тип (Editor) используется для того, чтобы сказать Unity «как отобразить класс». Это может быть ScriptableObject или MonoBehaviour. Используется чаще всего, по крайне мере у нас. Второй (EditorWindow) — может быть использован для отображения почти любого содержимого в пределах нового окна, за которое он отвечает. Третий (PropertyDrawer) отвечает на вопрос «как отобразить параметр». Причём это может быть как один из стандартных типов параметров, так и свой собственный.

Для каждого из типов расширений можно найти по небольшому «Hello World» в документации. Но чтобы сделать действительно полезное, удобное и красивое расширение, придётся ещё постараться. Связано это, во-первых, с наличием огромного числа недокументированных и внутренних (Internal) функций движка, которые можно использовать.

Во-вторых, с большим количеством багов и общей неинтуитивностью подсистемы. В-третьих, почти все статьи про расширения на английском или вообще иероглифы. Если с английским лично я ещё могу справится, то китайский поддается только Google-переводчику, что слабо помогает общему усвоению информации. Именно поэтому сделать что-то сложнее двух дополнительных кнопок — сродни алхимии и чёрной магии. Но когда это нас останавливало?

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

Здесь, как раз, ничего сильно интересного у нас нет. Просто для примера — отображение свойства неактивным, если объект на сцене. И возможность редактировать свойство, если объект является префабом.

Эта функция используется для свойств-идентификаторов объектов. Что-то типа ИД, необходимого для сериализации/десериализации структуры уровня. Защита от самого себя, чтобы не поменять идентификатор во время сборки уровня в редакторе. Если так сделать — уровень сохранится, но загружаться не будет.

Еще есть PropertyDrawer для класса «Координаты X и Y» — вместо двух строчек выводит в одну. Ещё один — для отображения коллекции string в виде выпадающего списка.

Здесь уже интереснее. Кастомное окно у нас одно. Используется как основной способ редактирования уровня. Весь код я приводить, конечно, не буду. Из интересного можно выделить пару моментов.

Первый — получение картинки-превью префаба. То есть той картинки, которая отображается в самом редакторе Unity. Реализуется с помощью одного метода AssetPreview.GetAssetPreview(gameObject).

Второй — центрирование камеры в SceneView к выбранной ячейке.

Дальше от него наследуются все остальные кастомные эдиторы. Самые «толстые» у нас — это ContentPackEditor, LevelEditor, LocalizationEditor, GameFieldEditor. Каждый от 200 до 300 строк кода. Опять же, приводить код каждого смысла не имеет. Расскажу только про интересные моменты.

Для ContentPackEditor нужны были функции визуальной сортировки элементов массива. И они в Unity есть, это ReorderableList в UnityEditorInternal. Вот статья по основам использования.

От себя я добавил сворачивание/разворачивание списка при клике на заголовок.

В LocalizationEditor надо было сделать что-то вроде таблицы, чтобы чётные и нечётные сроки выводились разным цветом. Решается это заведением двух разных стилей.

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

Путём небольшой доработки напильником стало выглядеть вот так.

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

Подписывайтесь, комментируйте, покупайте нашу игру.

Пытаться делать в редакторе Юнити вещи, для которых он не предназначен - плохая идея. Вы гробите туеву хучу времени на борьбу с API и UI, вместо того, что бы задействовать сторонние тулсы, написав импорт данных в пару десятков строк.

На примере вашего локализатора - да боже мой, импорт из Excel был бы в 1000 раз удобнее.

Только пожалуйста, не надо писать очередные десериализаторы XML, json и прочих сторонних форматов! И уж тем более, класть их потом в папку Resources (почему-то очень популярный у начинающих разработчиков варварский подход). ScriptableObject сериализируется в прекрасный и читаемый YAML, и большинство гейм-дизайнеров скажут вам только спасибо, если игровые данные можно будет отредактировать сразу в движке, не занимаясь никакими импортами – а удобство гейм-дизайнеров это всегда основная задача разработчиков тулзов.

Локализация это, пожалуй, единственный пример где импорта стороннего формата имеет смысл, ведь локализаторы это сторонняя компания. Но и при работе с локализацией гейм-дизайнеров должны писать исходные тексты на «основном» языке, пока контент не готов к отправке на перевод, прямо в движке.

Чем длиннее работа над одной итерацией, тем меньше итерация, тем хуже итоговое качество продукта. Не надо вставлять палки в колеса продукту.

Я вас не совсем понимаю.
1) Кого класть? десериализаторы?
2) Про YAML не знал, загуглил. Спасибо.
3) Ну вроде кастомный редактор позволяет "никакими импортами" и не заниматься, в чем здесь проблема? :)

1) ресурсы
2) так это же был не вам комментарий, как раз с кастомнымм редакторами я согласен

А куда класть ресурсы, если не в папку Resources?
В ассет-бандлы?

Вообще, в Unity есть три основных места: в Resources, просто в проект, и, наконец, в ассет-бандлы.

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

Когда-то делал смену скинов, и приходилось в рантайме загружать-выгружать текстуры. Ассет бандлы я не вывез (дело было до 5.3) а ресурсы работали как часики.

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

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

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

image

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

15 февраля 2018 года Unity Technologies в своем блоге разместила замечательную новость: начиная с версии Unity 2018 в редактор будут интегрированы инструменты ProBuilder. ProBuilder — это уникальный набор средств для построения двумерных и трехмерных геометрических форм с возможностью их дальнейшего редактирования и текстурирования.

Я специально скачал и установил Unity версии 2018.1 beta для того, чтобы воочию убедиться в реальности происходящего. Ведь интеграция инструментов редактирования трехмерных сеток в редактор поднимет Unity еще на одну ступеньку вверх на лестнице их достижений за последние несколько лет. Unity вправе сегодня считаться одной из самых продвинутых IDE для создания компьютерных игр и интерактивных приложений.

После установки Unity 2018.1 beta зайдите в пункт меню Windows — Package Manager, в появившемся диалоговом окне нажмите кнопку All, найдите пункт ProBuilder и нажмите Install.

Установка ProBuilder

После достаточно быстрой установки в главном меню программы появится новый пункт Tools с одним подпунктом — ProBuilder, наведя на который мы с вами получим внушительный список возможностей.


Давайте выберем пункт ProBuilder Window, после чего на экране появится плавающая панель с инструментами: создание новой формы (New Poly Shape), создание нового объекта (New Shape), редактор материалов, UV редактор, и многое другое. Этакий мини 3D Studio Max внутри Unity.

Я попробовал создать несколько объектов и был приятно удивлен. Список новых возможностей впечатляет:

  • Shape Tool — создание новых редактируемых трехмерных объектов, типов объектов достаточно много (куб, лестница, дверь, труба, призма, конус и т.д.);
  • Material Tools — набор инструментов для создания и использования материалов на объектах (редактор материалов, редактор текстур с разверткой модели, инструмент для изменения цвета вершин);
  • Инструменты выделения — ProBuilder поддерживает несколько режимов доступа к подобъектам объекта (вершины, ребра, полигоны), в каждом из этих режимов на панели ProBuilder будут доступны разнообразные инструменты выделения (Select Hidden, Grow Selection, Shrink Selection и т.д.);
  • Действия над объектами — ProBuilder позволяет выполнять ряд таких нужных действий, как изменение направления нормалей, разбиение полигонов зеркальное отражение выделенных объектов, есть возможность экспорта модели в различных форматах.

Я не удержался и создал видео — быстрый старт в инструменты ProBuilder с новой версией Unity, кому интересно — посмотрите ниже.

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

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

  • Работа в редакторе и работа игры это два разных процесса. Процесс, когда вы запускаете игру после сборки проекта, обычно называют Runtime . Во время этого процесса редактор и его инструменты недоступны. Все элементы, созданные в процессе расширения редактора, также будут недоступны в режиме Runtime , поэтому необходимо заранее разделять области, где вы будете работать с редактором, а где с объектами игры.


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

Здесь есть параметр иконки юнита в виде Sprite , описание юнита в виде текста string , минимальный и максимальный запас здоровья юнита, радиус атаки, урон и тип атаки юнита.


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


Насколько сразу стало все понятно, разные настройки юнита вынесены в разные области.

Редактор для компонента

Настройки каждого компонента в инспекторе отображаются с помощью стандартного редактора, к которому необходимо получить доступ и перенастроить его. У нас уже есть компонент юнита Unit . Чтобы изменить его редактор, необходимо создать специальный скрипт, управляющий его отображением в инспекторе.

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

  1. using System.Collections ;
  2. using System.Collections.Generic ;
  3. publicclass UnitEditor : MonoBehaviour
  4. >

Сейчас этот скрипт наследуется от класса MonoBehaviour и представляет собой обычный компонент. Для того, чтобы сделать из него “ новый редактор ”, необходимо унаследовать его от класса “ расширения ” Editor . Находится этот класс в специальном пространстве имен UnityEditor . Добавить это пространство можно, дописав в самом верху скрипта два слова: using UnityEditor;

  1. using System.Collections ;
  2. using System.Collections.Generic ;
  3. using UnityEditor ;
  4. publicclass UnitEditor : Editor
  5. >

Готово, новое пространство подключено и скрипт унаследован от класса Editor . Далее необходимо указать, какой именно компонент необходимо расширить. Для этого используем стандартный атрибут CustomEditor .

  1. [ CustomEditor (typeof( Unit ))]
  2. publicclass UnitEditor : Editor
  3. >

Расширение инспектора

Как и для всех остальных областей редактора Unity , панель инспектора ( Inspector ) имеет в классе Editor свой специальный метод для работы, называется он OnInspectorGUI . Именно этот метод отвечает за то? как будут выглядеть настройки компонента в окне инспектора.

  1. [ CustomEditor (typeof( Unit ))]
  2. publicclass UnitEditor : Editor
  3. publicoverridevoid OnInspectorGUI ()
  4. >
  5. >


Для того, чтобы “ нарисовать ” новый редактор компонента Unit, используется специальный GUI . Тем, кто работал раньше с GUI , известно, что это набор статических методов для отображения процедурного графического интерфейса. К примеру, попробуем вывести какой то текст в окне инспектора. Для этого воспользуемся обычным статическим методом Label класса GUILayout .

Сохраняем скрипт и видим в окне настройки компонента текст Hello inspector .


Теперь займемся созданием новых настроек для компонента Unit . Возвращаемся снова в метод OnInspectorGUI и для начала определим объект редактора как тип Unit .

  1. [ CustomEditor (typeof( Unit ))]
  2. publicclass UnitEditor : Editor
  3. publicoverridevoid OnInspectorGUI ()
  4. Unit unit = this . target as Unit ;
  5. >
  6. >

Для этого воспользуемся преобразованием переменной target в тип Unit , это необходимо сделать, чтобы четко дать понять редактору, с каким объектом мы работаем, ведь изначально редактор не может знать, какой компонент к нему обращается, хоть мы это и указали в атрибуте CustomEditor . Далее возьмем переменную description объекта Unit и “ нарисуем ” для нее новый тип настроек, так чтобы теперь вмешалось больше текста чем раньше.

  1. [ CustomEditor (typeof( Unit ))]
  2. publicclass UnitEditor : Editor
  3. publicoverridevoid OnInspectorGUI ()
  4. Unit unit = this . target as Unit ;
  5. unit . description = EditorGUILayout . TextArea ( this . unit . description , GUILayout . Height ( 50 ));
  6. >
  7. >

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


Статический метод TextArea позволяет отображать простую переменную текста как целую область, в которой намного более удобно этот текст редактировать. Все необходимые методы для работы с инспектором в редакторе находятся в классе EditorGUI и EditorGUILayout .

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

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

Сохраняем и смотрим результат.

Далее поработаем с переключаемыми параметрами редактора и настройкой дальности атаки. По условию, если юнит может проводить атаки дальнего боя, то ему необходимо настроить эту саму дальность атаки. Для этого в компоненте Unit есть две переменные: boolean переменная, rangedUnit для обозначения, что объект является юнитом дальнего боя, и числовая переменная int rangeAttack для настройки самой дальности атаки.

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

public override void OnInspectorGUI ()

Снова сохраняем скрипт и смотрим результат.

Можно сохранить и посмотреть результат.

Теперь юниту можно выбрать сразу несколько типов атак. Метод EnumFlagsField позволяет задавать перечислению enum сразу несколько значений, именно по такому же принципу настраиваются камеры и их параметр Culling mask .

Осталось настроить всего две переменных класса Unit , это количество урона и иконку. Так как переменная damage имеет числовой тип float , то и редактор тоже будет использовать метод FloatField для дробных числовых переменных.

Все поля, которые мы настраивали ранее, имеют простейший тип, это float , int , string и boolean , иконка юнита имеет тип Sprite, который в свою очередь является Unity объектом. Для любых unity объектов есть специальный редактор полей, называется он ObjectField . Попробуем добавить поле иконки перед полем редактирования описания в самом верху метода OnInspectorGUI .


Чтобы поле иконки выглядело лучше, можно указать минимальные размеры самого поля через GUILayout.Width , GUILayout.Height и добавить выравнивание по горизонтали вместе с полем описания.


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

Заключение

Расширять редактор можно для любых unity объектов и компонентов, и даже не обязательно для MonoBehaviour скриптов, но и для уже существующих объектов в unity : Transform , Collider и другие. К примеру, для удобства работы с Transform’ом в 2D редакторе можно его просто улучшить также, как сделали этот с компонентом Unit .

Unity - Полное руководство для начинающих по разработке игр 🔥

🎮 Игры Unity - отличный инструмент для создания прототипов всего, от игр до интерактивных визуализаций. В этой статье мы рассмотрим все, что вам нужно знать, чтобы начать использовать Unity.

Вступление

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

Почему Unity?

Если вы хотите делать игры

Когда дело доходит до разработки инди-игр, вариантов действительно очень мало. Если вы хотите создавать игры, есть три основных варианта: Unreal, Unity или GameMaker.

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

В Unity есть множество очень успешных игр, таких как Escape from Tarkov (FPS), Monument Valley (Puzzler) и This War of Mine (Стратегия / Выживание).


Если вы хотите прототипировать пользовательский опыт

Unity полностью поддерживает VR и AR и, следовательно, может стать отличным инструментом для изучения архитектуры, автоматизации и моделирования с помощью клиентов.

Окно редактора Unity

Окно редактора разделено на несколько разделов. Мы расскажем об этом очень кратко, так как будем постоянно к нему обращаться на протяжении всей статьи. Если вы уже знакомы с этим, пропустите мимо!

Просмотр сцены: позволяет размещать и перемещать игровые объекты в сцене.

Просмотр игры: предварительный просмотр того, как игрок будет видеть сцену с камеры.

Инспектор: предоставьте подробную информацию о выбранном GameObject в сцене.

Assets / Project: здесь хранятся все префабы, текстуры, модели, скрипты и т. Д.

Иерархия: позволяет вложение и структурирование игровых объектов внутри сцены.

Теперь мы готовы начать!

Объекты Unity Game

Что такое GameObjects

Если у вас есть опыт веб-дизайна, вы можете думать о GameObjects как о элементах <div>! Чрезвычайно скучные контейнеры, но они легко расширяемы для создания сложной функциональности или визуальных эффектов.

Я поднял это прямо из окна редактора Unity, чтобы подчеркнуть это.

Создание иерархии

Беспорядок и эффективность

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

Unity Translation: вы создаете клон Minecraft и у вас есть множество блоков в сцене, вам нужно добавлять и удалять «куски» блоков из сцены по соображениям производительности. Таким образом, их родительство с пустым GameObject для каждого фрагмента имеет смысл, поскольку удаление родительского фрагмента удаляет все дочерние блоки.

Позиционирование

Веб-аналогия: вы хотите сохранить положение содержимого «относительно» контейнера, а не веб-страницы.

Unity Translation: вы создали группу дронов-помощников, которые летают вокруг игрока. На самом деле вы бы не стали писать код, чтобы они гонялись за игроком, поэтому вместо этого вы создаете их как дочерние элементы игрового объекта player.

Встроенные компоненты Unity

Компонентная модель актера

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

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

Ключевые встроенные компоненты

Думаю, пришло время привести несколько примеров встроенных компонентов, предоставляемых движком Unity Games.

  • MeshFilter: позволяет назначать материалы для 3D-сетки GameObject.
  • MeshRender: позволяет назначать материалы 3D-сетке.
  • [Коробка | Mesh] Collider: позволяет обнаруживать GameObject во время столкновений.
  • Rigidbody: позволяет реалистичному физическому моделированию воздействовать на GameObjects с 3D-сетками и запускать события обнаружения на коллайдерах боксов.
  • Свет: освещает части вашей сцены.
  • Камера: определяет область просмотра игрока, которая будет прикреплена к GameObject.
  • Различные компоненты холста пользовательского интерфейса для отображения графического интерфейса пользователя

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

Просто нажмите на раздел справки, документация в целом довольно хороша

Создание пользовательских компонентов

Структура моноповедения

Ключевые функции

Все компоненты наследуются от класса MonoBehaviour. Он включает в себя несколько стандартных методов, главное:

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

Переменные инспектора

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

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

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

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

Принятие пользовательского ввода

  • Input.GetKey (KeyCode.W) Возвращает True W, удерживается клавиша W
  • Input.GetKeyDown (KeyCode.W) Возвращает True при первом нажатии клавиши W.
  • Input.GetAxis («Вертикальный»), Input.GetAxis («Горизонтальный») Возвращает значение между -1,1 перемещения мыши при вводе.

Управление игровыми объектами

Трансформации

Все GameObjects имеют свойство transform, которое позволяет выполнять различные полезные манипуляции с текущим игровым объектом.

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

В общем, рекомендуется использовать локальное [Положение, Вращение], а не глобальное положение / поворот объекта. Обычно это упрощает перемещение объектов разумным образом, поскольку ось локального пространства будет ориентирована и центрирована на родительском объекте, а не на мировом начале координат и направлениях x, y, z.

Преимущества локального пространства станут немного более очевидными с диаграммой!

Если вам нужно преобразовать между локальным и мировым пространством (что часто бывает), вы можете использовать следующее:

Как вы понимаете, за этим стоит довольно простая линейная алгебра, на которую намекает «Обратный» в имени метода.

Создание новых игровых объектов

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

По сути, это хранит шаблон объекта, который только что был в нашей сцене, со всеми теми же конфигурациями.

Пример пользовательского объекта-кирпича, который используется для динамического создания кубиков Lego в сцене, к нему прикреплен набор компонентов с различными значениями по умолчанию.

Когда у нас есть эти сборные компоненты, мы можем назначить их переменным инспектора (как мы говорили ранее) для любого компонента в сцене, чтобы мы могли создавать новые GameObject, как указано в сборке, в любое время.

Затем мы можем выполнить «создание экземпляра» префаба и манипулировать им в желаемом месте сцены и установить необходимые родительские отношения.

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

Доступ через переменную инспектора

Это самый простой способ. Просто создайте общедоступную переменную для GameObject, как мы продемонстрировали ранее с префабами, и вручную перетащите ее на компонент через инспектор. Затем перейдите к переменной, как указано выше.

Доступ через теги

Мы можем пометить GameObjects или prefabs через инспектор, а затем использовать функции поиска игровых объектов, чтобы найти ссылки на них.

Это просто делается, как показано ниже.GameObject some_game_object = GameObject.FindGameObjectWithTag («Кирпич»);

Доступ через преобразование

Доступ через SendMessage

Raycasting

Возможно, вы слышали об этом раньше, когда люди сравнивают игры FPS, основанные на «физике» или «на основе лучей». Raycasting по сути похож на лазерную указку, которая при соприкосновении с «коллайдером» или «твердым телом» возвращает «попадание» и передает детали объекта.

Есть два сценария, в которых это может пригодиться (вероятно, их гораздо больше):

  1. Если вы разрабатываете систему оружия для игры, вы можете использовать raycasting для обнаружения попаданий и даже настроить длину луча, чтобы предметы ближнего боя «поражали» только на коротких дистанциях.
  2. Создайте луч от указателя мыши к точке в трехмерном пространстве, то есть если вы хотите, чтобы пользователь мог выбирать юниты с помощью мыши в стратегической игре.

Обнаружение столкновений

После настройки в любом настраиваемом компоненте, прикрепленном к объекту, мы можем использовать методы OnCollisionEnter, OnCollisionStay и OnCollisionExit для реагирования на коллизии. Получив информацию о столкновении, мы можем получить ответственность за GameObject и использовать то, что мы узнали ранее, для взаимодействия с прикрепленными к нему компонентами.

Следует отметить, что твердые тела обеспечивают физику, такую ​​как гравитация, для объектов, поэтому, если вы хотите отключить это, вам нужно будет включить is_kinematic .

Расширенные возможности

Создание графического интерфейса

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

Расширение редактора Unity

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

Анимация

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

Материалы и PBR

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

Совет новичкам по Unity

Если вы планируете написать свою первую игру, не стоит недооценивать сложность и время, необходимое для написания даже самых тривиальных игр. Помните, что над большинством игр, которые выходят в Steam, команды работают над ними в течение многих лет!

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

Хорошие ресурсы для разработки игр в Unity

Читайте также: