Как сделать лидерборд unity

Обновлено: 06.07.2024

Telegram канал: t.me/volrest_dev
Моя игра на фоне: bit.ly/bibas_adventures

После просмотра плейлиста по Steamworks, вы как минимум сможете сделать проверку на наличие лицензии игры у игрока (очень упрощённо), работать со статистикой steam, выдать или забрать достижение у игрока.

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


Steam leaderboards, Unity leaderboards, Steam таблицы лидеров, Unity таблицы лидеров

Volrest GameDev - это канал разработчика игр на Unity о геймдеве и геймдизайне

Музыка (SoundCloud):
Johan Lilja - What's Your Name
Johan Lilja - Good Vibes
Johan Lilja - Get Your Love

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

🎮 Игры

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

Вступление

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

Почему Unity?

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Объекты Unity Game

Что такое GameObjects

Если у вас есть опыт веб-дизайна, вы можете думать о GameObjects как о элементах

! Чрезвычайно скучные контейнеры, но они легко расширяемы для создания сложной функциональности или визуальных эффектов.

Буквально все, от эффектов частиц, камер, игроков, элементов пользовательского интерфейса… (список продолжается) — это GameObject.

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

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

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

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

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

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

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

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

Unity работает на основе модели компонентов акторов, проще говоря, GameObjects — это актеры, а компоненты — ваши скрипты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Конечно, мы хотим, чтобы наша игра реагировала на ввод пользователя. Наиболее распространенные способы сделать это — использовать следующие методы в функции Update () компонента (или в любом другом месте, которое вам нравится):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

После этого вы можете получить доступ к любому из общедоступных методов / переменных компонента, чтобы управлять GameObject. Это простой момент, однако на самом деле получить ссылку на GameObject можно несколькими способами …

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

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

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

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

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

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

Raycasting

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

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

Ранее мы упоминали компоненты Collider и Rigidbody, которые можно добавить к объекту. Правило для столкновений состоит в том, что один объект в столкновении должен иметь твердое тело, а другой — коллайдер (или оба имеют оба компонента). Обратите внимание, что при использовании raycasting лучи будут взаимодействовать только с объектами, к которым прикреплены компоненты коллайдера.

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

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

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

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

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

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

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

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

Анимация

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

Материалы и PBR

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

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

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

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

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

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

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

Всем привет! Меня зовут Илья, я работаю разработчиком мобильных игр на Unity вот уже несколько лет и сегодня хотел бы поделиться небольшим чек-листом (или гайдом) по оптимизации мобильных игр для начинающих. В этой статье мы коснемся как графических, так и других аспектов оптимизации "на скорую руку" когда вам нужно быстро поднять FPS ваших мобильных игр.

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

Итак, с предисловием закончили. Поехали!

1) Постарайтесь использовать одну камеру на сцене. Чем больше камер вы используете, тем выше нагрузка на CPU.

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

4) Используйте MSAA не выше 4X на любых мобильных платформах.

5) Используйте Forward-режим рендеринга без использования HDR, чтобы снизить нагрузку на GPU.

6) Выставьте необходимые Clear Flags на камере, чтобы указать, что нужно очищать при рендеренге каждый кадр.

7) При разработке 3D игр, также настройте допустимый Clipping Planes для ограничения области прорисовки дальних объектов.

1) Старайтесь использовать облегченные API, как Vulkan или Metal если это возможно. Для 2D игр достаточно OpenGL 2.

2) Используйте Occlusion Culling для выгрузки объектов вне поля зрения.

3) Используйте только запеченное освещение, тени и Reflection Probes (от них лучше отказаться вовсе). Не используйте ни в коем случае Realtime расчеты.

4) Старайтесь использовать Static и Dynamic Batching для ваших объектов для объединения геометрии.

5) Старайтесь не использовать процедурные системы частиц.

6) Старайтесь по минимуму использовать анимации. Где это возможно, анимируйте объекты через ваши скрипты или, к примеру через DOTween.

7) Установите значение флага "Realtime Pixel Lights" на 0, если это возможно.

8) Выключите Soft Particles.

9) Старайтесь использовать простые шейдера с минимальным количеством инструкций.

10) Избегайте сэмплинга в Reflection Probes.

11) Используйте общий материал для ваших объектов.

12) Используйте Gamma рендеринг вместо Linear.

13) Постарайтесь использовать URP-рендеринг вместо Legacy (Built-in).

14) Постарайтесь изучить и использовать ShaderVariants в вашем проекте., для уменьшения нагрузки на GPU.

15) При добавление/удалении шейдеров в проекте, держите актуальным список Always Inculded Shaders.

16) Иногда требуется разогреть видео-чип перед стартом игры, чтобы исключить микро-фризы при первой отрисовке объекта. Для этого вы можете прогревать их в процессе загрузки игры, инициализируя объекты на сцене Preload.

1) Используйте Sprite атласы для интерфейсов и объединения графики в единый спрайт. Таким образом ваши объекты будут занимать меньше памяти на GPU. Желательно использовать последнюю версию инструмента для работы с атласами.

2) Постарайтесь избегать прозрачности в спрайтах.

3) Включите "Optimize Game Objects" при импорте мешей с ригом.

4) Минимизируйте количество деревьев в анимации.

5) Уменьшите количество костей и вертексов для анимации.

6) Используйте уровни отрисовки (LOD) для дальних объектов (касаемо 3D графики).

7) Избегайте Multi-Pass шейдеров.

8) Попробуйте использовать стриминг текстур.

9) Настройте оптимальные параметры для компрессии текстур, 3D моделей, анимаций и другого контента. Если есть необходимость - настройте MIPMAPS для тяжелых объектов.

10) Отключите Read/Write в импорте ассетов, где это возможно.

11) Настройте предзагрузку шейдеров, которые необходимы в геймплее.

12) Отключите все анимационные контроллеры. Включайте их только при необходимости, поскольку даже пустые Animation Controller создают нагрузку на GPU.

13) Не воспроизводите вместе Unity-анимации и DOTween анимации.

1) Используйте Sprite атласы. Это важно!

2) Избегайте изменения на UI каждый кадр отрисовки. Лучше изучите как работают события и делайте изменения через слушатели.

3) По возможности откажитесь от Rich Text, автоматической подгонки размера текста. В идеале - лучше использовать TextMesh вместо Unity Text.

4) Не используйте автоматическую систему слоев в UI. Также постарайтесь сократить количество UI слоев до 2х.

5) Настройте материалы у вашего UI. Не используйте UI без материалов, желательно не использовать стандартные шейдера.

6) Старайтесь не использовать пустые и невидимые объекты с компонентами Image. Все они влияют на нагрузку GPU.

1) Включите Straming на длинных аудио-клипах.

2) Отключите предзагрузку аудио-файлов там, где она не нужна.

3) Настройте оптимальную компрессию аудио.

4) Ограничьте хранение ссылок на аудио в памяти.

5) Настройте Bufffer size на Best perfomance.

6) Отключите все Plugins для Audio. Уменьшите количество потоков в половину от стандартного значения.

7) При правильном использовании Mixer можно снизить нагрузку на CPU, разбив отдельные звуки как дорожки микшера.

1) Настройте Addressables вместо Asset Bundles. Обо всех преимуществах в экономии памяти вы можете почитать на сайте Unity.

2) Избегайте использования ресурсов из директории "Resources".

3) Уменьшите размер вашей сборки при помощи CDN и последующей загрузки с него ресурсов.

1) Не используйте бесконечные Coroutine-функции, старайтесь минимизировать их размер.

2) Используйте пулы объектов, вместо реинициализации и уничтожения объектов со сцены.

3) Используйте ваш менеджер управления состояниями. Старайтесь не использовать обновления состояния объектов через Update.

4) Старайтесь убрать все неиспользуемые ссылки в объектах. Старайтесь не использовать на глобальных объектах тяжелых ссылок.

5) Постарайтесь вручную контролировать Garbadge Collector.

6) Избегайте генеративных методов Garbadge Collector-а, таких как FindObjectsOfType.

8) По возможности, старайтесь не хранить ссылки на все подряд в памяти. Для удобства, можете использовать Zenject для внедрения зависимостей.

9) Не используйте SpriteAtlas.GetSprite во избежание утечек памяти.

1) Оставьте только те Build Targets, которые вы хотите использовать.

3) Используйте GPU Skinning, если это возможно.

4) Не забудьте выставить флаг "static" у тех объектов на сцене, которые являются статичными.

5) В иерархии сцены, постарайтесь не использовать динамичные объекты с большим количеством дочерних или родительских объектов.

6) Включите Multithreaded rendering и Graphics Jobs в настройках проекта.

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

Надеюсь, вы подчерпнули для себя что-то новое. И буду рад вашим дополнениям!

P.S. Если будет интерес, в следующих статьях могу подробнее рассказывать о каждом разделе с подробным объяснением и сравнениями.

1. Не используйте этот чеклист пока не сделали первую игру
2. Не используйте этот чеклист пока не понимаете что значит любой из этих пунктов
3. Не думайте об оптимизации, думайте о геймплее, когда ваша игра взорвет рынок - наймёте Илью Сергеича и он оптимизирует вам игру.

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

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

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

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

большинство пунктов выполняются автоматически, реально полезные советы - про пулы и переход на LWRP

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

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

что лучше динамические или статические пулы ? )))

Что лучше хлеб или батон. Всему есть свое применение.

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

Насчёт URP в новых версиях он более менее стабильный. Вообще если речь идёт о maximum power то лучше вообще отказаться от unity 🤣

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

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

По возможности, старайтесь не хранить ссылки на все подряд в памяти. Для удобства, можете использовать Zenject для внедрения зависимостей.
Который будет хранить тысячи лишних ссылок вместо вас (:

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

Я сам на проектах Zenject использую. Но он тоже не панацея)

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

Тестировал производительность URP и он всегда был медленее чем Built-In рендеринг.
То же самое с Вулканом против OpenGL.

Хм, у меня обратная картина. Возможно стоит изучить старые устройства. Но для 2d графики opengl 2 будет эталон если не использовать какие то новороченные функции.

Делать анимации скриптами прожорливее 🤔

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

Не уверен. Делал вращение монеток в 3д и поскольку их было много, то через Animation было выше на 3-5 фпс. Плюс можно выставить culling всякие
Наверное от ситуации зависит, но надо будет проверить с DOTwin 🙌

дотвин помойка, быстрее всего вращать кучи объектов поможет ECS :))

Можно подробнее? Спасибо.

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

Не используйте автоматическую систему слоев в UI
Что за автоматическая система слоёв, поясните, пожалуйста.

Content size fitter в сочетании с другими элементами, например Vertical Layout Group

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

Лол, а что тогда использовать? Свои решения городить?
Например Content size fitter очень часто выручает для вёрстки под разные экраны

Не стоит юзать их для автоматической подгонки UI везде где не приколочено. Постараться минимизировать это

Тестировал на мид/лоу-енд девайсах. На топовом железе разницы не сильно видно.

У меня лично URP помог таки поднять FPS на 2D игре. Возможно суть не в самом URP, а в шейдерах

Как минимум в 6ом пункте последнего абзаца 🤣

Недостаточно!)
Burst и Jobs уже в нормальном состоянии, пора их вводить в оборот.

Хм, возможно это будет полезно включить да в список

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

5) Настройте материалы у вашего UI. Не используйте UI без материалов, желательно не использовать стандартные шейдера.
А это что значит?

Built in шейдера напичканы слишком разной всячиной которая по факту не нужна на 90% проектов.

я про первую половину - что значит, не использовать ui без материалов?

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

Все равно плохо понимаю о чем речь, можно какую-нибудь статью на тему того, чем плох UI-Default?

в дефолте куча параметров которые не используются, речь идет о том что это якобы будет занимать лишнюю память и время на отрисовку, но этим можно и нужно пренебречь

Может быть, речь о Standard шейдере? там правда овердофига всего, в дефолте же ничего нет кроме колор маски и альфа клипа

ну там ещё есть шейдер варианты, они автоматом лишнее удаляют если оно не используется, но кому это нужно если есть ПУНКТ ))

Про варианты тоже написано было

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

Используйте GPU Skinning, если это возможно.

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

Интересный кейс, надо будет разобрать. Возможно есть ряд gpu которые умеют с ним работать.

Очень познавательно, с удовольствием почитал бы более подробные материалы на эту тему!

1) Не используйте бесконечные Coroutine-функции
но почему?

Просто не знаю, вроде порой удобный способ запустить корутину с while(true) и пусть работает себе пока объект активен 🤔

Поговаривают что invoke лучше

Там пример с запуском invoke и coroutine миллион раз подряд(а не одна корутина против циклического запуска invoke раз за разом), в такой ситуации вообще ни тот ни другой не нужно использовать. Если событие нужно вызвать разок через какое то время и забыть, то invoke подойдёт, а если это сложное событие где нужно lerp проводить в процессе то нет и если бесконечный цикл внутри корутины тут опять же invoke бесполезен, есть invokeRepeat, но опять же он не будет иметь логики внутри. А если мне нужно чтобы проверка условия проводилась, причем если игрок близко ждал один таймер, если далеко уходил на другой интервал, то не подходит invokeRepeat, а обычный invoke вызывать как раз таки лишнее время, чем корутина 1. Возможно речь шла о том что не надо делать так чтобы корутина сама себя в конце запускала? 🤷🏻‍♂️

16) Иногда требуется разогреть видео-чип перед стартом игры, чтобы исключить микро-фризы при первой отрисовке объекта.
На сковороде прогреть лол. Вот кому поможет этот совет? Речь идёт о компиляции шейдеров. Так и пишите это. Скомпилируйте все необходимые шейдеры заранее используя ShaderVariantCollection. Делать это нужно один раз при запуске игры. Если шейдеры уже скомпилированны, повторной компиляции не будет. Инициализовать объекты ради компиляции шейдеров не нужно.

Не только в шейдерах дело, в том то и дело. Есть ещё текстуры и прочее. Да, термин прогреть немного странный 🤣 это больше касается динамики, в частности партиклы

Я, конечно, не гуру, но все же.
Работа с камерой:
1) Одну камеру использовать не всегда удобно и выгодно с точки зрения оптимизации. Часто можно одной камерой рисовать трехмерную сцену, а другой камерой рисовать меню например (да как угодно можно).
7) Лучше нормально лоды сделать и не выдумывать.
Работа с рендерингом:
4) Это не имеет смысла часто. Лучше бы расписали что это такое и зачем.
6) Анимации гораздо эффективнее работают зачастую, они позволяют заранее запомнить то, что должен высчитывать скрипт каждый кадр.
16) Тут прямо очень надо разъяснить.
Работа с ресурсами:
1) Это тоже далеко не всегда сработает, есть куча особенностей работы с атласами, часто они могут только навредить (например можно получить атлас, который начнет крашить айфоны из-за своих размеров).
2) А почему? Вот это было бы полезно расписать. Прозрачность не плохая сама по себе, она просто плохо сжимается.
13) Не вижу в этом ничего плохого.
Оптимизация кода:
1) В этом нет ничего плохого, часто через них выгоднее сделать логику даже. Лучше распишите почему считаете их неэффективными.
2) Часто это отнимает ценную оперативку т увеличивает нагрузку на процессор (нужно как-то управлять пулом)
6) В этом нет ничего плохого, если они выполняются не часто, при инициализации например
Настройка Player Settings:
2) Это имеет очень много подводных камней.
5) Почему этот пункт здесь?
6) При неумелом использовании это только навредит

По итогу я специально придираюсь, уж извините, но мне кажется, что многое в статье не поможет, а часто даже навредит, начинающим разработчикам

Комментарии • 37

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

@Dark Leo Пиши на почту туда кину другие контакты.

Спасибо за урок! Давно этого ждал, как раз для моей игры это понадобится. Будут ли еще видео по оптимизации данной механики?

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

@Kram Ну пока что по данной теме видео не планирую. Как будет время еще сниму несколько видео на другие темы. На счет игры, я не спец в таких играх, но по визуальной составляющей и атмосфере все класно, было несколько багов, но я уверен что ты их исправиш. Вк нету, а дс ребко сижу. Может когда-нибудь создам дс канал для нашего комьюнити, когда нас станет больше. Хоть нас уже 207 человек. Я даже подумать не мог что меня будет смотреть столько народу.


Эксперт в медицинских тренажерах VR на Unity, физических симуляциях и сетевых играх.

Что такое Unity

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

Наглядный пример игры, созданной на Unity, которая поддерживает разные устройства, — Genshin Impact, успешный мультиплатформенный проект китайской студии miHoYo Limited. Более популярной стала ее мобильная версия, но пользователи могут войти в аккаунт, например, с компьютера и продолжить играть с того же момента, на котором остановились в мобильной версии. Кроме Genshin Impact, на Unity созданы такие известные проекты, как Hearthstone, Outlast, Cuphead, Pokemon GO и многие другие.

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

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

Посмотрите также: Как установить Unity

Как создать простую игру

При создании собственного проекта важно помнить, что разработка кода — это примерно 20% игры; гораздо большее значение в ней имеют другие аспекты:

Разработчик игр на Unity

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

Русского языка в настройках нет, так что придется совершенствовать технический английский. Всего Unity занимает 11,3 Гб,поэтому перед установкой лучше проверить свободное место на диске и почистить его при необходимости.

Следующий шаг — создание Unity ID. Можно регистрироваться с помощью почты или использовать предложенные аккаунты, например Google, Facebook или Apple. Важно поставить первые две галочки: согласие с условиями использования Unity и признание политики конфиденциальности. Третья галочка — это согласие на маркетинговые рассылки, ее ставить не обязательно.

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

  • LEGO Microgame;
  • шутер от первого лица;
  • картинг;
  • платформер;
  • пустой 3D-шаблон.

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

Создание проекта

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

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

Настройка интерфейса

В стандартном интерфейсе проекта шесть элементов рабочей области:

  1. Верхняя панель инструментов— в ней находятся стандартные вкладки File, Edit, Help, как во многих других интерфейсах, а также вкладки Assets, GameObject, Components и Window.
  2. Scene — окно сцены, в котором выстраивается игровое пространство (элементы игрового мира, текстуры, фигурки персонажей и прочее).
  3. Games — это окно игры, в котором можно посмотреть глазами пользователя, как будут двигаться элементы и работать игровые механики.
  4. Hierarchy — окно иерархии, в нем перечислен список всех элементов (GameObject), которые помещены в окно Scene.
  5. Project — это система папок, в которых хранятся ассеты по категориям (текстуры, шрифты, звуки и т.д.).
  6. Inspector — окно для изменения элементов игры, их размера, цвета, положения в пространстве и других характеристик.


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

Объекты на экран Scene можно добавить из Asset Store. Для этого на панели инструментов нужно кликнуть на вкладку Window –> General –> Asset Store.

В строке поиска можно по названиям найти нужные компоненты, например, сет Free Platform Game Assets.

Как и другие ассеты, он загружается с помощью кнопки Import.

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

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

Шаг 2. Перенести в область Scene

Работа со скриптами

За поведение игровых объектов отвечают присоединенные к ним компоненты (Components). Базовый компонент любого объекта — Transform, он отвечает за положение элемента в окне Scene, возможность поворачивать и масштабировать его. К базовому компоненту можно добавить, например, Renderer, который меняет цвет, или RigidBody, который отвечает за массу и физику объекта. Но кроме базовых компонентов, объектам можно задавать особые условия, и для этого как раз используются скрипты.

Базовые элементы скриптов — это:

  • using — элемент в коде, который подключает библиотеки;
  • public class — в этой строке обычно прописан класс MonoBehaviour, он содержит набор функций, необходимых для работы скрипта;
  • void — те самые функции, с их помощью прописываются действия, происходящие в игре.

Рассмотрим, например, функцию start. Любое действие в ней произойдет только один раз, когда запустится игра. Пропишем здесь print (“Hi”).

И можно заметить, что в консоли это слово выводится один раз.

Функция update — повторяющаяся, ее можно использовать, например, для передвижения объекта. Для этого в скрипте задается переменная int i = 0, она выводится на экран с помощью функции print (i) и увеличивается на одну единицу за каждый шаг с помощью i++.

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

Настройка триггеров

Для понимания сути триггеров важно усвоить, что такое коллайдер (Collider). Это компонент, который присваивается объекту в пространстве игры, задает форму и делает его твердым, недоступным для прохождения сквозь него. Например, если мы разместим монетку в 2D-пространстве и захотим сделать так, чтобы она упала на платформу, то без использования компонента Collider ничего не получится — монетка пролетит сквозь платформу.

Поэтому обоим объектам необходимо присвоить компонент Box Collider 2D — это тонкая зеленая линия, которая обводит элементы по контуру, и за счет этой рамки они становятся твердыми, то есть один не может пройти сквозь другой.

Так объекты обязательно соприкоснутся и монета встанет на платформу.

Триггер (Trigger) — это пространство на карте, при попадании объекта в которое происходит действие; он тоже обводит объект или область в пространстве по краям. По сути, это тот же коллайдер, только триггер позволяет объектам проходить внутрь этой области. Представьте, что на ту же самую платформу вместе с коллайдером наброшен триггер, и при попадании персонажа внутрь триггерной области активируется телепорт — персонажа перебрасывает в другую точку карты.

Чтобы создать триггер, нужно накинуть тот же самый компонент коллайдера, но поставить галочку Is Trigger.

Триггеры распознают три варианта взаимодействия области на карте и объекта:

  • OnTriggerEnter — объект зашел в зону;
  • OnTriggerStay — объект находится в зоне;
  • OnTriggerExit — объект покинул зону.

Что дальше?

Разработчик игр на Unity

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

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