Я все же создам новый тред, да простит меня джаббер тред внизу каталога. Решил вкатиться в юнити. Читаю их туториалы, пока в восторге от доступности и простоты материала (по сравнению с тем, что было раньше) Буду тут писать отчеты. Пара ссылок: Сайт: https://unity.com Обучение: https://learn.unity.com Есть тг канал: @unity3d_ru
Сегодня узнал про компоненты, отвечающие за физику: Rigid Body - позволяют объекту реагировать на гравитацию Коллайдеры - позволяют поверхностям взаимодействовать с объектами, имеющими Rigid Body компонент.
Еще раз отмечу туториалы. Возможно это не уникальное явление, но я впервые увидел, чтобы к обучению ПО подходили настолько тщательно. Обычно от туториалов ожидаешь рассказы про механику, принципы, интерфейс... То есть все в рамках конкретного программного продукта, как вещи в себе. Здесь же немалую долю уделяют объяснению самой индустрии и разных моментов, с ней связанных: различные ниши, карьерные возможности, подходы к проекту. Предлагают оформить цель, написать первый элементарный план. Также есть задания сделать что-то и опубликовать. Респект.
Освоил азы работы с input, но получилось довольно сумбурно. Пришлось в одном месте даже руками сделать таймаут для исключения множественных нажатий.
Узнал про Префабы. Это такие подготовленные (prefabricated) объекты, которые можно динамично создавать и удалять прямо в коде.
Юнит3 Junior курса оказался богат на новые для меня фишки. Впервые потыкал компоненты: Animator. Это такая стейт машина с переходами между различными анимациями и условиями для этих переходов. Ей можно управлять, изменяя параметры, участвующие в условиях перехода. AudioSource. Можно проиграть подгруженный аудио файл. Все просто. Collision Trigger. Можно детектировать столкновения между объектами. Можно даже чекать объекты по их тегу и в зависимости от этого делать различное поведение. Сами коллайдеры еще бывают разными в зависимости от их формы. Particle System. Частицы, изменяющиеся во времени. Можно делать эффекты. Им почти как и аудио, можно сделать Play() и Stop().
Попробовал корутины. С шарпом почти не знаком, и тут они мне показались немного необычными. В моем понимании, корутина - это что-то что с момента создания живет немного своей жизнью, но ее можно подождать (ну или события от нее послушать). Здесь же yield-ом корутина может отдать управления обратно основному циклу (прям в любом месте), при этом в нее точка выполнения вернется сама, когда ей будет это удобно.. Но корутинами удобно описывать процессы, которые должны протекать во времени в течение нескольких фреймов. В противном случае можно утонуть в бесконечных таймерах и флагах, делая это все в основной функции обновления фрейма.
UI оставил двоякое впечатление, с одной стороны все просто. С другой стороны, чтобы его сделать невырвиглазным, нужно постараться.
Узнал сейчас про object pooling. Если один и тот же объект планируется создавать и удалять много раз, то гораздо оптимальнее будет инстанциировать лист этих объектов и сделать каждый из них неактивным. Далее, в момент когда объект необходим в сцене, из пула берется один из его инстансов и делается активным. При этом могут меняться некоторые из его параметров (например позиция). Ну и соответственно, если активный объект больше не нужен, но не удаляется, а делается неактивным. Пул всегда возвращает один из неактивных объектов, то есть не используемых в данный момент. В итоге получается, что мы имеем в памяти постоянное количество объектов (равный размеру пула), а не постоянно создаем и удаляем бесконечное количество объектов по мере работы сцены.
Unity вкатывается в настоящую мультипоточность и асинхронность. В то время как в мире микросервисов это давно стандарт, в таких больших проектах похоже не так все просто. До сих пор в стейбл версии используется старый подход, при котором главный цикл обновления сцены однопоточен. Сейчас (точнее еще в 2018) нашли способ это сделать многопоточным со скедулингом по разным ядрам. Правда это до сих пор в превью, хотя и выглядит вполне надежно и многообещающее. Основная фишка тут в том, что подобный подход требует изменений в структурах пользовательского кода и объектов. Для этого были придуманы конверторы, и это вылилось в отдельную версию редактора. Пользователь работает с игровыми объектами и их компонентами, как и раньше. А дальше они сами конвертируются в “новые” сущности и компоненты (Entity Component System) для работы с ними в коде. Ну и в коде, в связи с этим, уже нет работы с игровыми объектами в их обычном понимании, а с компонентами напрямую, которые в свою очередь уже содержат какие-то данные (например позиция, скорость). Отсюда этот подход получил название Data-Oriented Technology Stack. Классы теперь наследуются не от MonoBehaviour, а от JobComponentSystem. https://unity.com/dots Ну и разумеется, все это стало гораздо производительнее, и стало возможным делать сложные сцены, работающие даже на мобилках https://www.youtube.com/watch?v=KgcU2HBOXAw
Погуглил больше про ECS. Концепция сама существует давно и не является изобретением Unity, но уже DOTS - их термин. Она сама по себе не про производительность, а про подход к описанию игрового мира и взаимодействий в нем. В ECS игровые объекты не наследуют кучу всего и не создаются со статичной кучей параметров и компонентов, существующих вплоть о момента удаления объекта. В ECS игровые объекты - просто entities, некие изначально пустые "сущности", играющие роль уникальных идентификаторов. Параметры игровых объектов (например, здоровье, скорость, "прыгучесть", etc) являются самостоятельными компонентами (components), не привязанными ни к какому объекту статично. Они могут назначаться каким-либо entities, если им необходимо данное поведение/характеристика. Причем эта привязка или отвязка происходят в рантайме, что позволяет делать классные вещи в виде изменения казалось бы статичных характеристик игрового мира в уже работающих клиентах. Системы (systems) содержат уже логику, обрабатывающую данные из компонентов. Можно думать о них, как о контроллерах. Важно то, что системы не завязаны на конкретных компонентах и entities. По крайней мере в юнити, как я понял, системы могу выбирать entities на основе привязанных к ним компонентов (entity query) и тем самым всегда работают с группой entities. Поэтому в коде много foreach :) В этой концепции Entities, Components и Systems - вещи изначально существующие обособленно друг от друга, и им нужны отдельные средства коммуникации. И тут уже все зависит от конкретной имплементации.
Разобрался со сценами и переходами между ними. Сцена - это некая уникальная инстанция мира. В зависимости от сложности игры может быть отдельным уровнем, может быть целым открытым миром. Или это может быть просто menu screen. Все игровые объекты создаются внутри сцены и при переходе между сценами удаляются. Однако есть различные методики для персиста данных между сценами. Самый простой способ - это использование синглтона, который один раз создается при инициализации и помечается, как неудаляемый. Персист данных между сессиями (между разными запусками игры) сложнее. Причем не потому, что надо писать в файл или работать с другими внешними сущностями. А потому что надо постоянно думать, могут ли внутренние структуры быть сериализированы. В шарпе не все так однозначно. Обычный array, например, может быть сериализирован в json, List уже нет. Хотя BinaryFormatter с ним справляется без проблем.
бамп Стив, как дела, продвигается ли изучение?
>>25670 Забил на какое-то время. Переезды, смена работы и всё такое Ещё как закончил курс junior programmer, у меня случился overwhelm от осознания уровня необходимых скиллов (которые нужно качать и качать 100500 лет как в олдскулл ммо), что демотивировало продолжать процесс. Недавно появилось желание раздропнуть. Начал новый курс Creative core. Посматриваю на применения Юнити в не-игровых индустриях, изучаю какие есть наработки в AR, webrtc, нативная интеграция в мобилках и всё такое.
>>26109 ну чО, как результаты?
>>27432 Тоже любишь отчеты вкатывальщиков читать?
о, здарова, вы тоже игры делаете?
- wahaba + wakaba 3.0.9 + futaba + futallaby -