#архитектура #плагины #Unity3D
Приветствую, друзья 👋
Сегодняшняя тема посвящена плагинам в Unity 3D
Плагины (или ассеты) в Unity 3D - это дополнительные компоненты, скрипты, ресурсы или библиотеки, разработанные сторонними разработчиками или компаниями для добавления новых функциональных возможностей или расширения возможностей существующего движка Unity.
Плагины предоставляют разработчикам готовые решения и инструменты для использования аналитики, визуализации, анимации, физики и других аспектов разработки игр и приложений.
Рассмотрим подробнее возможности плагинов в Unity 3D и особенности, которые необходимо учитывать при их использовании:
1️⃣Предоставление готовых решений:
Речь о возможности быстрой интеграции в проект Unity готовых решений и функциональности, реализованной сторонними разработчиками/компаниями.
Упрощение интеграции:
Как правило, плагины предоставляются в виде Unity Package (.unitypackage), поэтому их установка в проект Unity происходит через простой импорт и делает процесс интеграции быстрым и безболезненным.
Устанавлить плагины можно, как через Unity Package Manager (UPM), так и из сторонних источников.
2️⃣Решение сложных задач:
Часто решение сложных/трудоемких для реализации с нуля задач (например: системы аналитики, системы рекламной интеграцией, работа с физикой, и т.д.) упаковывают в плагины. Используя их, разработчики облегчают решение стоящих перед ними задач и получают проверенное, рабочее решение.
3️⃣Качество и поддержка:
В основном за разработку сторонних плагинов берутся опытные разработчики, они предлагают активную поддержку и обновления своих продуктов.
Это дает уверенность в качестве и надежности предоставляемых решений.
4️⃣Удобство управления платформенными зависимостями через External Dependency Manager (EDM4U) for Unity:
После установки плагина через Unity Package для управления платформенными (Android, iOS, и т.д.) зависимостями и обновлениями плагина можно использовать EDM4U ->
https://openupm.com/packages/com.google.external-dependency-manager/.
Это облегчает поддержку актуальных версий и упрощает процесс интеграции.
Как правило EDM4U входит в Unity Package плагина.
❗За разрешение платформенных зависимостей в EDM4U используется xml файл.
Данный файл должен находиться в директории плагина Editor и иметь имя *Dependencies.xml, где * означает имя директории плагина.
Внутри xml, как правило есть 2 секции:
- androidPackages. Зависимости, которые будут использоваться при Android сборке
- iosPods. Зависимости, которые будут использоваться при iOS сборке.
При конфликте (например при установки Pod'ов в iOS) потребуется модифицировать xml файл и подгонять его под нужные версии.
Под Android (Gradle) сборка, как правило проходит безболезненно.
‼️ℹ️Ниже приведены важные при работе с плагинами моменты, которые позволят избежать потенциальных проблем и сделать процесс разработки на Unity 3D более удобным и эффективным.
Важно:
- Следить за правильным подключением плагинов: все плагины необходимо устанавливать в папки по умолчанию (место будет предложено Unity при установке Unity Package).
Некоторые плагины "нацелены" на папки по умолчанию, и при размещении в альтернативном месте возрастает риск неопределенного поведения.
- Соблюдать версионность EDM4U: устанавливаемая версия должна соответствовать либо быть выше текущей версии, используемой в проекте
- Корректно размещать и именовать xml, отвечающий за решение платформенных зависимостей в EDM4U
- Тестировать работоспособность проекта после каждого изменения или добавления нового плагина.
❗Если в проекте требуется активно использовать предоставляемые плагинами API (например различные системы аналитики), я рекомендую выделить отдельный сервис/сервисы, которые будут использовать этот плагин.
Плагины продолжение 👇
Приветствую, друзья 👋
Сегодняшняя тема посвящена плагинам в Unity 3D
Плагины (или ассеты) в Unity 3D - это дополнительные компоненты, скрипты, ресурсы или библиотеки, разработанные сторонними разработчиками или компаниями для добавления новых функциональных возможностей или расширения возможностей существующего движка Unity.
Плагины предоставляют разработчикам готовые решения и инструменты для использования аналитики, визуализации, анимации, физики и других аспектов разработки игр и приложений.
Рассмотрим подробнее возможности плагинов в Unity 3D и особенности, которые необходимо учитывать при их использовании:
1️⃣Предоставление готовых решений:
Речь о возможности быстрой интеграции в проект Unity готовых решений и функциональности, реализованной сторонними разработчиками/компаниями.
Упрощение интеграции:
Как правило, плагины предоставляются в виде Unity Package (.unitypackage), поэтому их установка в проект Unity происходит через простой импорт и делает процесс интеграции быстрым и безболезненным.
Устанавлить плагины можно, как через Unity Package Manager (UPM), так и из сторонних источников.
2️⃣Решение сложных задач:
Часто решение сложных/трудоемких для реализации с нуля задач (например: системы аналитики, системы рекламной интеграцией, работа с физикой, и т.д.) упаковывают в плагины. Используя их, разработчики облегчают решение стоящих перед ними задач и получают проверенное, рабочее решение.
3️⃣Качество и поддержка:
В основном за разработку сторонних плагинов берутся опытные разработчики, они предлагают активную поддержку и обновления своих продуктов.
Это дает уверенность в качестве и надежности предоставляемых решений.
4️⃣Удобство управления платформенными зависимостями через External Dependency Manager (EDM4U) for Unity:
После установки плагина через Unity Package для управления платформенными (Android, iOS, и т.д.) зависимостями и обновлениями плагина можно использовать EDM4U ->
https://openupm.com/packages/com.google.external-dependency-manager/.
Это облегчает поддержку актуальных версий и упрощает процесс интеграции.
Как правило EDM4U входит в Unity Package плагина.
❗За разрешение платформенных зависимостей в EDM4U используется xml файл.
Данный файл должен находиться в директории плагина Editor и иметь имя *Dependencies.xml, где * означает имя директории плагина.
Внутри xml, как правило есть 2 секции:
- androidPackages. Зависимости, которые будут использоваться при Android сборке
- iosPods. Зависимости, которые будут использоваться при iOS сборке.
При конфликте (например при установки Pod'ов в iOS) потребуется модифицировать xml файл и подгонять его под нужные версии.
Под Android (Gradle) сборка, как правило проходит безболезненно.
‼️ℹ️Ниже приведены важные при работе с плагинами моменты, которые позволят избежать потенциальных проблем и сделать процесс разработки на Unity 3D более удобным и эффективным.
Важно:
- Следить за правильным подключением плагинов: все плагины необходимо устанавливать в папки по умолчанию (место будет предложено Unity при установке Unity Package).
Некоторые плагины "нацелены" на папки по умолчанию, и при размещении в альтернативном месте возрастает риск неопределенного поведения.
- Соблюдать версионность EDM4U: устанавливаемая версия должна соответствовать либо быть выше текущей версии, используемой в проекте
- Корректно размещать и именовать xml, отвечающий за решение платформенных зависимостей в EDM4U
- Тестировать работоспособность проекта после каждого изменения или добавления нового плагина.
❗Если в проекте требуется активно использовать предоставляемые плагинами API (например различные системы аналитики), я рекомендую выделить отдельный сервис/сервисы, которые будут использовать этот плагин.
Плагины продолжение 👇
#архитектура #плагины #Unity3D
Плагины продолжение
Слой сервисов и работа с плагинами
Напомню, слой сервисов разбирали в одной из предыдущих публикаций
Тезисно:
- Слой сервисов отвечает за набор дополнительных сервисов, которые потребуются например для сбора и анализа данных об игроках и их действиях в игре.
- Представляет собой набор классов с публичными методами.
- Сервисный класс должен предоставлять публичный доступ к API, который реализует сервис.
- Сервис создается один раз в нужном узле composition tree.
Далее в виде явной зависимости передаваться в контекстах вниз по иерархии composition tree.
ℹ️Например, если в проекте есть необходимость интегрировать несколько плагинов для работы с аналитикой: AppMetrica, Firebase, Amplitude, Appsflyer, Adjust, Tenjin, и т.д.
Итоговый сервис должен представлять собой один класс, который в конструкторе инстанцирует, инициализирует и дожидается (может происходить асинхронно) готовности каждой системы и имеет набор нужным публичных методов для работы с аналитикой.
При создании инстанса класса используется контекст (мы писали тут), в который можно передать нужные ключи/токены для инициализации плагинов.
Например, пусть сервис для работы с аналитикой называется AnalyticService, тогда один из публичных методов может выглядеть так:
В коде из контекста, вы всегда сможете получить доступ к AnalyticService и вызвать метод Track с нужными параметрами.
Резюмирую все вышесказанное
Сторонние плагины для Unity 3D, совместно с UPM и EDM4U дают значительные преимущества для разработчиков 👇 :
- расширяют возможности Unity, предоставляя готовые решения для сложных задач, таких как интеграция с внешними сервисами, взаимодействие с социальными сетями, поддержка анимации, управление физикой и многое другое.
- облегчают обносления: используя UPM и EDM4U, разработчики могут легко обновлять плагины до последних версий семантического управления версиями.
- гарантируют качество и поддержку: сторонние плагины находятся на поддержке и обновлении у разработчиков. Это гарантирует качество и надежность решений.
- ускоряют разработку: позволяют сэкономить время и ускорить процесс создания игр и приложений в Unity 3D.
- упрощают процесс разработки и повышают понимание кода через использование сервисного слоя в composition tree проекта.
❗Напомню, что ни один плагин не застрахован от багов, поэтому обязательно внимательно тестируйте заявленный функционал.
Благодарю за внимание!
Вопросы в комментариях приветствуются!
Плагины продолжение
Слой сервисов и работа с плагинами
Напомню, слой сервисов разбирали в одной из предыдущих публикаций
Тезисно:
- Слой сервисов отвечает за набор дополнительных сервисов, которые потребуются например для сбора и анализа данных об игроках и их действиях в игре.
- Представляет собой набор классов с публичными методами.
- Сервисный класс должен предоставлять публичный доступ к API, который реализует сервис.
- Сервис создается один раз в нужном узле composition tree.
Далее в виде явной зависимости передаваться в контекстах вниз по иерархии composition tree.
ℹ️Например, если в проекте есть необходимость интегрировать несколько плагинов для работы с аналитикой: AppMetrica, Firebase, Amplitude, Appsflyer, Adjust, Tenjin, и т.д.
Итоговый сервис должен представлять собой один класс, который в конструкторе инстанцирует, инициализирует и дожидается (может происходить асинхронно) готовности каждой системы и имеет набор нужным публичных методов для работы с аналитикой.
При создании инстанса класса используется контекст (мы писали тут), в который можно передать нужные ключи/токены для инициализации плагинов.
Например, пусть сервис для работы с аналитикой называется AnalyticService, тогда один из публичных методов может выглядеть так:
public void Track(string eventName, Dictionary<string, object> data)
{
...
}
В коде из контекста, вы всегда сможете получить доступ к AnalyticService и вызвать метод Track с нужными параметрами.
Резюмирую все вышесказанное
Сторонние плагины для Unity 3D, совместно с UPM и EDM4U дают значительные преимущества для разработчиков 👇 :
- расширяют возможности Unity, предоставляя готовые решения для сложных задач, таких как интеграция с внешними сервисами, взаимодействие с социальными сетями, поддержка анимации, управление физикой и многое другое.
- облегчают обносления: используя UPM и EDM4U, разработчики могут легко обновлять плагины до последних версий семантического управления версиями.
- гарантируют качество и поддержку: сторонние плагины находятся на поддержке и обновлении у разработчиков. Это гарантирует качество и надежность решений.
- ускоряют разработку: позволяют сэкономить время и ускорить процесс создания игр и приложений в Unity 3D.
- упрощают процесс разработки и повышают понимание кода через использование сервисного слоя в composition tree проекта.
❗Напомню, что ни один плагин не застрахован от багов, поэтому обязательно внимательно тестируйте заявленный функционал.
Благодарю за внимание!
Вопросы в комментариях приветствуются!
#сериализация #десериализация #Unity3D
Приветствую, друзья 👋
Сегодня говорим про сериализацию и десериализацию.
Существует множество ключевых компонентов, влияющих технический успех и состоятельность проекта.
Одним из наиболее важных аспектов для опытных разработчиков является процесс сериализации и десериализации данных.
Плохо спроектированный процесс сериализации и десериализации отрицательно влияет на производительность: приводит к утечкам памяти, снижению скорости загрузки уровней и др.
Итак 📝
📌Сериализация и десериализация - это процессы преобразования объектов и структур данных в формат, который может быть сохранен в файле или передан по сети, и обратно.
Это означает перевод данных между объектами в памяти и их внешними представлениями, такими как файлы конфигурации, сохранения игры или данные сетевой игры.
Полученные в результате сериализации/десериализации объекты содержат информацию о визуальных компонентах, поведении, физических параметрах и других важных аспектах игрового мира.
Для обеспечения целостности и согласованности игрового опыта важно, чтобы эти данные могли быть сохранены и восстановлены.
В каких случаях необходимо сохранение и восстановление данных?
➡️ Поддержание возможности завершения и продолжения игры в любой момент: сериализация позволяет сохранять прогресс игры, состояния персонажей и другие важные параметры игры.
➡️ Синхронизация в сетевых и многопользовательских проектах:
Для данной категории проектов сериализация и десериализация позволяют синхронизировать состояния игрового мира между разными участниками и управлять передачей данных по сети.
➡️ Сохранение пользовательских настроек и ресурсов:
Сериализация позволяет сохранять пользовательские настройки, конфигурации уровней и другие ресурсы в удобном формате.
‼️ Сериализация/десериализация способна оказывать негативное влияние на производительность.
Рассмотрим методы, позволяющие разработчикам управлять процессом сериализации и десериализации с минимальными негативными воздействиями на производительность:
1. Использование пула объектов.
Огромный пласт и отдельная тема. Подобный подход используют разработчики уровня Senior+.
2. Использование Newtonsoft.Json (JsonNET).
Данный подход имеет низкий входной порог и широко применяется в проектах на Unity3D для управления сериализацией и десериализацией.
Именно по этой причине данный подход будет разобран в рамках публикации.
Поехали 🚘
JsonNET широко используется в различных проектах на C#, включая веб-приложения, приложения для мобильных устройств, сервисы и т. д.
Библиотека является одной из наиболее популярных и надежных для работы с JSON в .NET-приложениях.
Предоставляет мощные инструменты для настройки процесса преобразования данных в формат JSON и обратно.
Позволяет гибко управлять иерархической структурой объектов, обрабатывать специфичные типы данных и применять различные стратегии именования.
Основные возможности и характеристики JsonNET:
➡️ Сериализация и десериализация:
Позволяет легко сериализовать .NET-объекты в JSON и десериализовать JSON в .NET-объекты.
➡️ Гибкая настройка:
Предоставляет множество параметров и настроек для контроля процесса сериализации и десериализации, включая атрибуты и альтернативные имена полей.
➡️ Интеграция с LINQ (Language Integrated Query):
Позволяет выполнять запросы и манипулировать данными JSON как структурированными.
➡️ Поддержка динамических данных:
Предоставляет поддержку динамических объектов для работы с неизвестными заранее структурами данных.
➡️ Обработка специальных типов:
Умеет работать с различными специальными типами данных: даты, перечислениями и байтовыми массивами.
➡️ Пользовательские конвертеры:
Возможность определить свои собственные конвертеры для специфических типов данных и управлять процессом сериализации и десериализации.
➡️ Поддержка атрибутов:
Поддерживает атрибуты для более точного управления сериализацией и десериализацией.
➡️ Поддержка JSON Schema:
Позволяет валидировать и генерировать схемы на основе объектов.
Отдельной затрону конвертеры в JsonNET
Хорошего дня!
Приветствую, друзья 👋
Сегодня говорим про сериализацию и десериализацию.
Существует множество ключевых компонентов, влияющих технический успех и состоятельность проекта.
Одним из наиболее важных аспектов для опытных разработчиков является процесс сериализации и десериализации данных.
Плохо спроектированный процесс сериализации и десериализации отрицательно влияет на производительность: приводит к утечкам памяти, снижению скорости загрузки уровней и др.
Итак 📝
📌Сериализация и десериализация - это процессы преобразования объектов и структур данных в формат, который может быть сохранен в файле или передан по сети, и обратно.
Это означает перевод данных между объектами в памяти и их внешними представлениями, такими как файлы конфигурации, сохранения игры или данные сетевой игры.
Полученные в результате сериализации/десериализации объекты содержат информацию о визуальных компонентах, поведении, физических параметрах и других важных аспектах игрового мира.
Для обеспечения целостности и согласованности игрового опыта важно, чтобы эти данные могли быть сохранены и восстановлены.
В каких случаях необходимо сохранение и восстановление данных?
➡️ Поддержание возможности завершения и продолжения игры в любой момент: сериализация позволяет сохранять прогресс игры, состояния персонажей и другие важные параметры игры.
➡️ Синхронизация в сетевых и многопользовательских проектах:
Для данной категории проектов сериализация и десериализация позволяют синхронизировать состояния игрового мира между разными участниками и управлять передачей данных по сети.
➡️ Сохранение пользовательских настроек и ресурсов:
Сериализация позволяет сохранять пользовательские настройки, конфигурации уровней и другие ресурсы в удобном формате.
‼️ Сериализация/десериализация способна оказывать негативное влияние на производительность.
Рассмотрим методы, позволяющие разработчикам управлять процессом сериализации и десериализации с минимальными негативными воздействиями на производительность:
1. Использование пула объектов.
Огромный пласт и отдельная тема. Подобный подход используют разработчики уровня Senior+.
2. Использование Newtonsoft.Json (JsonNET).
Данный подход имеет низкий входной порог и широко применяется в проектах на Unity3D для управления сериализацией и десериализацией.
Именно по этой причине данный подход будет разобран в рамках публикации.
Поехали 🚘
JsonNET широко используется в различных проектах на C#, включая веб-приложения, приложения для мобильных устройств, сервисы и т. д.
Библиотека является одной из наиболее популярных и надежных для работы с JSON в .NET-приложениях.
Предоставляет мощные инструменты для настройки процесса преобразования данных в формат JSON и обратно.
Позволяет гибко управлять иерархической структурой объектов, обрабатывать специфичные типы данных и применять различные стратегии именования.
Основные возможности и характеристики JsonNET:
➡️ Сериализация и десериализация:
Позволяет легко сериализовать .NET-объекты в JSON и десериализовать JSON в .NET-объекты.
➡️ Гибкая настройка:
Предоставляет множество параметров и настроек для контроля процесса сериализации и десериализации, включая атрибуты и альтернативные имена полей.
➡️ Интеграция с LINQ (Language Integrated Query):
Позволяет выполнять запросы и манипулировать данными JSON как структурированными.
➡️ Поддержка динамических данных:
Предоставляет поддержку динамических объектов для работы с неизвестными заранее структурами данных.
➡️ Обработка специальных типов:
Умеет работать с различными специальными типами данных: даты, перечислениями и байтовыми массивами.
➡️ Пользовательские конвертеры:
Возможность определить свои собственные конвертеры для специфических типов данных и управлять процессом сериализации и десериализации.
➡️ Поддержка атрибутов:
Поддерживает атрибуты для более точного управления сериализацией и десериализацией.
➡️ Поддержка JSON Schema:
Позволяет валидировать и генерировать схемы на основе объектов.
Отдельной затрону конвертеры в JsonNET
Хорошего дня!
#Unity3D
Друзья, приветствую👋
Предлагаю запустить цикл вопрос/ответ!
Жду ваши вопросы в комментариях!
В рамках недели буду порционно отвечать на каждые 5-10 в зависимости от объема.
Хорошего дня.
Друзья, приветствую👋
Предлагаю запустить цикл вопрос/ответ!
Жду ваши вопросы в комментариях!
В рамках недели буду порционно отвечать на каждые 5-10 в зависимости от объема.
Хорошего дня.
#архитектура #делегаты #event #action #Unity3D
Реактивное программирование vs делегаты в C#, Unity 3D
Приветствую 👋
Сегодня говорим про реактивное программирование vs делегаты (delegate) в C#, Unity 3D.
Для начала поясню, почему в статье я рассматриваю именно delegate, а не event или Action.
В C# Action, event и delegate являются ключевыми элементами, используемыми для работы с методами как с объектами. Это позволяет реализовывать такие концепции, как обратные вызовы (callbacks) и событийно-ориентированное программирование.
Delegate является основой для Action и event, где
- Action предоставляет удобный способ использования делегатов без возвращаемого значения
- event использует делегаты, обеспечивая контролируемый способ подписки на уведомления и обработки событий.
Поэтому в статье я буду рассматривать именно delegate.
Но для начала приведу основные отличия delegate, Action, event:
- Delegate - это тип, который представляет ссылки на методы с определённой сигнатурой и возвращаемым типом.
Это означает, что мы можем использовать переменные delegate для хранения ссылок на методы.
Delegate обеспечивает возможность передачи методов как аргументов методам или в качестве типов возвращаемых значений.
Delegate поддерживает многоадресные вызовы, позволяя вызывать несколько методов подписанных на делегат (multicast делегаты).
- Action - это обобщённый делегат, который не возвращает значение (возвращаемый тип void) и может принимать от 0 до 16 параметров.
Action является удобным способом использования делегатов, не требуя объявлять новый тип делегата для каждой сигнатуры метода.
По сути, Action предназначен для ситуаций, когда нужно передать методы, не возвращающие значение.
- Event - это способ, с помощью которого класс или объект может предоставлять уведомления.
Итак event (события):
-используют делегаты для обработки уведомлений.
- реализует паттерн Observer, где издатель уведомляет подписчиков о том, что произошло определённое событие.
- ограничивают способность внешнего кода вызывать делегат. Внешний код может подписаться на событие или отписаться от него, но не может напрямую вызвать делегат события.
- добавляют уровень инкапсуляции к делегатам, обеспечивая более безопасную и управляемую модель подписки на уведомления.
❗Реактивное программирование и использование делегатов в C# представляют собой два различных, но похожих подхода к обработке и передаче данных.
Оба механизма имеют свои преимущества и недостатки, и выбор между ними зависит от конкретных требований к проекту.
продолжение 🔽
Реактивное программирование vs делегаты в C#, Unity 3D
Приветствую 👋
Сегодня говорим про реактивное программирование vs делегаты (delegate) в C#, Unity 3D.
Для начала поясню, почему в статье я рассматриваю именно delegate, а не event или Action.
В C# Action, event и delegate являются ключевыми элементами, используемыми для работы с методами как с объектами. Это позволяет реализовывать такие концепции, как обратные вызовы (callbacks) и событийно-ориентированное программирование.
Delegate является основой для Action и event, где
- Action предоставляет удобный способ использования делегатов без возвращаемого значения
- event использует делегаты, обеспечивая контролируемый способ подписки на уведомления и обработки событий.
Поэтому в статье я буду рассматривать именно delegate.
Но для начала приведу основные отличия delegate, Action, event:
- Delegate - это тип, который представляет ссылки на методы с определённой сигнатурой и возвращаемым типом.
Это означает, что мы можем использовать переменные delegate для хранения ссылок на методы.
Delegate обеспечивает возможность передачи методов как аргументов методам или в качестве типов возвращаемых значений.
Delegate поддерживает многоадресные вызовы, позволяя вызывать несколько методов подписанных на делегат (multicast делегаты).
- Action - это обобщённый делегат, который не возвращает значение (возвращаемый тип void) и может принимать от 0 до 16 параметров.
Action является удобным способом использования делегатов, не требуя объявлять новый тип делегата для каждой сигнатуры метода.
По сути, Action предназначен для ситуаций, когда нужно передать методы, не возвращающие значение.
- Event - это способ, с помощью которого класс или объект может предоставлять уведомления.
Итак event (события):
-используют делегаты для обработки уведомлений.
- реализует паттерн Observer, где издатель уведомляет подписчиков о том, что произошло определённое событие.
- ограничивают способность внешнего кода вызывать делегат. Внешний код может подписаться на событие или отписаться от него, но не может напрямую вызвать делегат события.
- добавляют уровень инкапсуляции к делегатам, обеспечивая более безопасную и управляемую модель подписки на уведомления.
❗Реактивное программирование и использование делегатов в C# представляют собой два различных, но похожих подхода к обработке и передаче данных.
Оба механизма имеют свои преимущества и недостатки, и выбор между ними зависит от конкретных требований к проекту.
продолжение 🔽
#архитектура #делегаты #event #action #Unity3D
Реактивное программирование vs делегаты в C#, Unity 3D продолжение 🔽
Рассмотрим ключевые моменты каждого подхода и выделим тонкости, связанные с делегатами.
Реактивное программирование - это парадигма, ориентированная на потоки данных и распространение изменений.
Это значит, что можно легко выразить статические или динамические потоки данных в программе, а также реагировать на их изменения.
Например, при изменении реактивных характеристик игрока в профиле, мы всегда можем подписаться на изменение нужных характеристик и сделать обработку детерминированной.
Также можно получить и использовать текущие значение реактивных характеристик, если этого требует наша логика.
В реактивном программировании необходимо помнить, как работает ReactiveProperty и ReactiveCommand. Краткий обзор.
При вдумчивом подходе в коде не будет никаких сюрпризов.
Вы сможете неразрывно писать код, даже когда логика требует выполнить реактивную команду и получить и обработать результат.
Подробнее тут.
Плюсы:
- Упрощение работы с потоками данных.
Реактивное программирование позволяет обрабатывать запросы, упрощая работу с потоками данных и их синхронизацию.
- Лучшая масштабируемость и отзывчивость.
Игры, написанные с использованием реактивного подхода, часто более отзывчивы и легче масштабируются благодаря эффективному управлению потоками данных.
Делегаты работают медленнее, когда выполняется множество подписок.
- Выразительность и лаконичность кода.
Реактивное программирование позволяет выражать сложные потоки данных и их взаимодействия более лаконично и наглядно.
Минусы:
- Для разработчиков может быть сложно освоить парадигму реактивного программирования и научиться думать в её категориях.
- Отладка реактивного подхода может быть более сложной, если мы будем задействовать асинхронщину.
Продолжение 🔽
Реактивное программирование vs делегаты в C#, Unity 3D продолжение 🔽
Рассмотрим ключевые моменты каждого подхода и выделим тонкости, связанные с делегатами.
Реактивное программирование - это парадигма, ориентированная на потоки данных и распространение изменений.
Это значит, что можно легко выразить статические или динамические потоки данных в программе, а также реагировать на их изменения.
Например, при изменении реактивных характеристик игрока в профиле, мы всегда можем подписаться на изменение нужных характеристик и сделать обработку детерминированной.
Также можно получить и использовать текущие значение реактивных характеристик, если этого требует наша логика.
В реактивном программировании необходимо помнить, как работает ReactiveProperty и ReactiveCommand. Краткий обзор.
При вдумчивом подходе в коде не будет никаких сюрпризов.
Вы сможете неразрывно писать код, даже когда логика требует выполнить реактивную команду и получить и обработать результат.
Подробнее тут.
Плюсы:
- Упрощение работы с потоками данных.
Реактивное программирование позволяет обрабатывать запросы, упрощая работу с потоками данных и их синхронизацию.
- Лучшая масштабируемость и отзывчивость.
Игры, написанные с использованием реактивного подхода, часто более отзывчивы и легче масштабируются благодаря эффективному управлению потоками данных.
Делегаты работают медленнее, когда выполняется множество подписок.
- Выразительность и лаконичность кода.
Реактивное программирование позволяет выражать сложные потоки данных и их взаимодействия более лаконично и наглядно.
Минусы:
- Для разработчиков может быть сложно освоить парадигму реактивного программирования и научиться думать в её категориях.
- Отладка реактивного подхода может быть более сложной, если мы будем задействовать асинхронщину.
Продолжение 🔽
#архитектура #делегаты #event #action #Unity3D
Реактивное программирование vs делегаты в C#, Unity 3D продолжение 🔽
Делегаты в C# - это типы, которые представляют собой ссылки на методы.
С их помощью можно передавать методы в качестве аргументов другим методам, что делает делегаты удобным средством для реализации обратных вызовов и событий.
Плюсы:
- Делегаты позволяют создавать гибкие и масштабируемые приложения благодаря возможности использования методов в качестве параметров.
- Multicast делегаты могут ссылаться сразу на несколько методов, что позволяет легко реализовывать паттерн Observer.
Минусы:
- Сложности с multicast делегатами.
Хотя multicast делегаты предоставляют мощные возможности, управление порядком вызова и обработка возвращаемых значений могут быть сложными.
- Ограниченность в сравнении с реактивным программированием.
Делегаты могут быть менее выразительными при работе с сложными потоками данных по сравнению с реактивным программированием.
- Неявные тонкости, которые могут запутать начинающих разработчиков.
Продолжение 🔽
Реактивное программирование vs делегаты в C#, Unity 3D продолжение 🔽
Делегаты в C# - это типы, которые представляют собой ссылки на методы.
С их помощью можно передавать методы в качестве аргументов другим методам, что делает делегаты удобным средством для реализации обратных вызовов и событий.
Плюсы:
- Делегаты позволяют создавать гибкие и масштабируемые приложения благодаря возможности использования методов в качестве параметров.
- Multicast делегаты могут ссылаться сразу на несколько методов, что позволяет легко реализовывать паттерн Observer.
Минусы:
- Сложности с multicast делегатами.
Хотя multicast делегаты предоставляют мощные возможности, управление порядком вызова и обработка возвращаемых значений могут быть сложными.
- Ограниченность в сравнении с реактивным программированием.
Делегаты могут быть менее выразительными при работе с сложными потоками данных по сравнению с реактивным программированием.
- Неявные тонкости, которые могут запутать начинающих разработчиков.
Продолжение 🔽
#GC #Unity3D
Приветствую 👋
Подведу итог опроса ➡️ Сколько поколений (количество) использует GC в Unity?
Вводные: используем il2cpp backend с выключенным Incremental GC.
Поясню, что такое поколения:
- Поколения (одно и более) означают, что к частям (фрагментам) кучи применяются критерии возраста.
Даже в алгоритме с одним поколением объекты сортируются по возрасту.
GC выполняет подчистку, в том числе опираясь на эти критерии.
- При отсутствии поколений GC все объекты обрабатываются одинаково, независимо от того, как долго они существовали в памяти.
❗В Unity при использовании il2cpp backend с выключенным Incremental GC используется Boehm-Demers-Weiser (BDW) garbage collector.
Алгоритм работы - Mark-and-Sweep.
Основные этапы работы алгоритма:
- Mark
Сборщик мусора начинает с набора объектов, называемых "корневыми" (Root).
Корневые объекты это те, которые напрямую доступны из стека (например, локальные переменные и параметры функций) или из глобальных переменных.
Сборщик мусора обходит все объекты, доступные из корней, следуя ссылкам между объектами. Каждый достижимый (доступный) объект отмечается как "живой".
Этот процесс продолжается рекурсивно, пока не будут найдены все объекты, доступные из корней.
- Sweep
Сборщик мусора просматривает все объекты в управляемой куче и ищет те, которые не были отмечены на этапе отметки.
Все неотмеченные объекты считаются "мусором" и удаляются, то есть память, которую они занимали, освобождается.
После завершения этапа очистки сборщик мусора снимает отметки с всех оставшихся объектов, чтобы подготовить их к следующему циклу сборки мусора.
Важные моменты в реализации BDW:
- Сканирование Root
- Трассировка объектов. Строит граф объектов и вычисляет их доступность
- Ведет подсчет ссылок на объекты. Требуется для того, чтобы определить, когда на объект больше никто не ссылается
- ❗Не поддерживает поколения
- Выполняет процедуру финализации для недоступных объектов
- Работает в режиме stop the world. Это означает, что выполнение кода приложения периодически полностью приостанавливается.
Поэтому правильным ответом на вопрос будет:
В Unity при использовании il2cpp backend с выключенным Incremental GC поколения не используются!
35% участников ответило правильно 🤝
Всем хорошего дня 👋
Приветствую 👋
Подведу итог опроса ➡️ Сколько поколений (количество) использует GC в Unity?
Вводные: используем il2cpp backend с выключенным Incremental GC.
Поясню, что такое поколения:
- Поколения (одно и более) означают, что к частям (фрагментам) кучи применяются критерии возраста.
Даже в алгоритме с одним поколением объекты сортируются по возрасту.
GC выполняет подчистку, в том числе опираясь на эти критерии.
- При отсутствии поколений GC все объекты обрабатываются одинаково, независимо от того, как долго они существовали в памяти.
❗В Unity при использовании il2cpp backend с выключенным Incremental GC используется Boehm-Demers-Weiser (BDW) garbage collector.
Алгоритм работы - Mark-and-Sweep.
Основные этапы работы алгоритма:
- Mark
Сборщик мусора начинает с набора объектов, называемых "корневыми" (Root).
Корневые объекты это те, которые напрямую доступны из стека (например, локальные переменные и параметры функций) или из глобальных переменных.
Сборщик мусора обходит все объекты, доступные из корней, следуя ссылкам между объектами. Каждый достижимый (доступный) объект отмечается как "живой".
Этот процесс продолжается рекурсивно, пока не будут найдены все объекты, доступные из корней.
- Sweep
Сборщик мусора просматривает все объекты в управляемой куче и ищет те, которые не были отмечены на этапе отметки.
Все неотмеченные объекты считаются "мусором" и удаляются, то есть память, которую они занимали, освобождается.
После завершения этапа очистки сборщик мусора снимает отметки с всех оставшихся объектов, чтобы подготовить их к следующему циклу сборки мусора.
Важные моменты в реализации BDW:
- Сканирование Root
- Трассировка объектов. Строит граф объектов и вычисляет их доступность
- Ведет подсчет ссылок на объекты. Требуется для того, чтобы определить, когда на объект больше никто не ссылается
- ❗Не поддерживает поколения
- Выполняет процедуру финализации для недоступных объектов
- Работает в режиме stop the world. Это означает, что выполнение кода приложения периодически полностью приостанавливается.
Поэтому правильным ответом на вопрос будет:
В Unity при использовании il2cpp backend с выключенным Incremental GC поколения не используются!
35% участников ответило правильно 🤝
Всем хорошего дня 👋
#Unity3D #тестирование
Тестирование в Unity 3D на платформах Windows, Android и iOS: что, как и какими инструментами?
Тестирование - часть разработки игр, одна из важных составляющих фундамента, на котором строится всё здание вашего проекта.
Оно позволяет выявить узкие места, которые могут возникнуть после выхода продукта в мир, понять, насколько он стабилен и соответствует заявленным критериям по производительности, обеспечивая высокое качество на различных платформах: Windows, Android и iOS.
Особое внимание стоит уделять аспектам, связанным с монетизацией, ведь от их работы напрямую зависит прибыльность и успех игры.
Рассмотрим, что именно следует проверять, какими методами и инструментами это делать и на какие подводные камни обратить внимание.
Что тестировать?
🟢 Функциональность
Здесь мы погружаемся в саму суть игры: игровые механики, логику, взаимодействие пользователя с приложением.
Каждая кнопка, каждый жест должны работать безупречно, чтобы игроки могли полностью окунуться в созданный вами мир.
🟢 Производительность
Высокий FPS, быстрое время загрузки, оптимальное использование памяти и ресурсов процессора - всё это критически важно, особенно на мобильных устройствах с ограниченными ресурсами.
Игра должна не только выглядеть красиво, но и работать плавно.
🟢 Совместимость
Мир мобильных устройств разнообразен: разные модели, разрешения экранов, версии операционных систем.
Убедитесь, что игра корректно функционирует на всевозможных устройствах, чтобы охватить максимально широкую аудиторию.
🟢 Стабильность
Нет ничего хуже, чем игра, которая внезапно вылетает или зависает.
Выявление сбоев, критических ошибок и ситуаций, когда приложение может быть принудительно закрыто системой, должно быть в списке приоритетных задач.
🟢 Пользовательский интерфейс (UI/UX)
Интерфейс - лицо вашей игры.
Он должен быть не только красивым, но и интуитивно понятным и отзывчивым.
Тестируйте отображение и отклик элементов интерфейса на различных платформах и разрешениях экранов.
🟢 Сетевые функции
Если ваша игра включает мультиплеер или другие сетевые взаимодействия, убедитесь в безупречной работе этих функций.
Синхронизация, задержки, соединение с сервером - всё это влияет на впечатление игрока.
🟢 Тестирование локализаций
Ваша игра может достичь игроков из разных стран.
Различные языковые локали могут содержать специфичные символы или использовать различные форматы данных.
‼️Например, отличие в десятичных разделителях ("." и ",") может привести к неправильной работе приложения.
🟢 Монетизация
Монетизация - финансовый показатель востребованности вашего проекта, её проверка становится первоочерёдной задачей на этапе выхода продукта в мир.
Тестирование монетизации заключается в проверке корректной работы встроенных покупок, рекламы и других механизмов.
Без стабильной и надёжной системы монетизации даже самая увлекательная игра может не оправдать ожиданий разработчиков.
Продолжение 🔽
Тестирование в Unity 3D на платформах Windows, Android и iOS: что, как и какими инструментами?
Тестирование - часть разработки игр, одна из важных составляющих фундамента, на котором строится всё здание вашего проекта.
Оно позволяет выявить узкие места, которые могут возникнуть после выхода продукта в мир, понять, насколько он стабилен и соответствует заявленным критериям по производительности, обеспечивая высокое качество на различных платформах: Windows, Android и iOS.
Особое внимание стоит уделять аспектам, связанным с монетизацией, ведь от их работы напрямую зависит прибыльность и успех игры.
Рассмотрим, что именно следует проверять, какими методами и инструментами это делать и на какие подводные камни обратить внимание.
Что тестировать?
🟢 Функциональность
Здесь мы погружаемся в саму суть игры: игровые механики, логику, взаимодействие пользователя с приложением.
Каждая кнопка, каждый жест должны работать безупречно, чтобы игроки могли полностью окунуться в созданный вами мир.
🟢 Производительность
Высокий FPS, быстрое время загрузки, оптимальное использование памяти и ресурсов процессора - всё это критически важно, особенно на мобильных устройствах с ограниченными ресурсами.
Игра должна не только выглядеть красиво, но и работать плавно.
🟢 Совместимость
Мир мобильных устройств разнообразен: разные модели, разрешения экранов, версии операционных систем.
Убедитесь, что игра корректно функционирует на всевозможных устройствах, чтобы охватить максимально широкую аудиторию.
🟢 Стабильность
Нет ничего хуже, чем игра, которая внезапно вылетает или зависает.
Выявление сбоев, критических ошибок и ситуаций, когда приложение может быть принудительно закрыто системой, должно быть в списке приоритетных задач.
🟢 Пользовательский интерфейс (UI/UX)
Интерфейс - лицо вашей игры.
Он должен быть не только красивым, но и интуитивно понятным и отзывчивым.
Тестируйте отображение и отклик элементов интерфейса на различных платформах и разрешениях экранов.
🟢 Сетевые функции
Если ваша игра включает мультиплеер или другие сетевые взаимодействия, убедитесь в безупречной работе этих функций.
Синхронизация, задержки, соединение с сервером - всё это влияет на впечатление игрока.
🟢 Тестирование локализаций
Ваша игра может достичь игроков из разных стран.
Различные языковые локали могут содержать специфичные символы или использовать различные форматы данных.
‼️Например, отличие в десятичных разделителях ("." и ",") может привести к неправильной работе приложения.
🟢 Монетизация
Монетизация - финансовый показатель востребованности вашего проекта, её проверка становится первоочерёдной задачей на этапе выхода продукта в мир.
Тестирование монетизации заключается в проверке корректной работы встроенных покупок, рекламы и других механизмов.
Без стабильной и надёжной системы монетизации даже самая увлекательная игра может не оправдать ожиданий разработчиков.
Продолжение 🔽
#Unity3D #тестирование
Что еще нельзя оставлять без внимания в процессе тестирования игр:
🟢 Шейдеры
Речь о проверке шейдеров для различных графических архитектур в Unity, особенно при ориентации приложения на широкий спектр устройств на платформах Windows, Android и iOS.
Графические процессоры Adreno и Mali охватывают большую часть Android-устройств, в то время как Metal используется на устройствах Apple.
Особенности тестирования шейдеров:
Adreno: Известен своей эффективностью при работе с некоторыми типами вычислений, но может сталкиваться с проблемами при работе со сложными шейдерами, содержащими динамическое ветвление.
Проверять необходимо на различных моделях Adreno (например, серии Adreno 600), чтобы выявить узкие места.
Mali: Шейдеры для этих GPU иногда демонстрируют пониженную производительность при использовании сложных текстурных операций и большого количества инструкций ALU.
Для выявления проблем с производительностью используйте Mali Offline Compiler.
Metal: На iOS-устройствах необходимо удостовериться, что шейдеры работают корректно и оптимизированы для архитектуры Metal.
‼️Важно тестировать шейдеры на реальных устройствах, чтобы проверить, как они обрабатываются на уровне компиляции Metal и избежать потенциальных ошибок рендеринга.
Оптимизируйте ресурсы: старайтесь минимизировать количество draw call'ов и сложность шейдеров, чтобы избежать перегрузки GPU.
🟢 Тестирование нативных окон запроса разрешений
Речь про проверку системы при наличие/отсутствии пользовательских разрешений, таких как запросы на трекинг IDFA и push-уведомления.
Ошибки при реализации данных запросов могут привести к проблемам при модерации приложения в сторе.
Рекомендации по проверке:
- Избегать блокировки логики игры: никогда не делайте так, чтобы игра не могла продолжить работу, если пользователь отклоняет запрос разрешений. Например, если игрок не принял трекинг IDFA, интерфейс должен корректно обрабатывать это событие и не блокировать дальнейший прогресс.
- Тестирование на отказ: проверяйте, что приложение корректно реагирует на случаи, когда разрешение не принято.
Это поможет избежать ситуаций, когда ревьюер App Store или Google Play не может протестировать приложение должным образом, что приводит к отклонению.
🟢 FTUE и воронки игроков
FTUE (First Time User Experience) играет ключевую роль в удержании пользователей.
Анализ воронки игроков позволяет понять, насколько хорошо новая аудитория воспринимает ваш проект.
Рекомендации по тестированию FTUE:
Анализ цепочки действий игроков: аналитическая система должна отслеживать каждый шаг пользователя после первого запуска игры.
Сколько пользователей запустило игру, сколько прошло туториал, сколько достигло первого уровня и т.д.
‼️Метрики удержания: собирайте данные о количестве пользователей, покинувших игру на разных этапах. Это поможет выявить проблемные зоны и улучшить ранний игровой опыт.
Продолжение 🔽
Что еще нельзя оставлять без внимания в процессе тестирования игр:
🟢 Шейдеры
Речь о проверке шейдеров для различных графических архитектур в Unity, особенно при ориентации приложения на широкий спектр устройств на платформах Windows, Android и iOS.
Графические процессоры Adreno и Mali охватывают большую часть Android-устройств, в то время как Metal используется на устройствах Apple.
Особенности тестирования шейдеров:
Adreno: Известен своей эффективностью при работе с некоторыми типами вычислений, но может сталкиваться с проблемами при работе со сложными шейдерами, содержащими динамическое ветвление.
Проверять необходимо на различных моделях Adreno (например, серии Adreno 600), чтобы выявить узкие места.
Mali: Шейдеры для этих GPU иногда демонстрируют пониженную производительность при использовании сложных текстурных операций и большого количества инструкций ALU.
Для выявления проблем с производительностью используйте Mali Offline Compiler.
Metal: На iOS-устройствах необходимо удостовериться, что шейдеры работают корректно и оптимизированы для архитектуры Metal.
‼️Важно тестировать шейдеры на реальных устройствах, чтобы проверить, как они обрабатываются на уровне компиляции Metal и избежать потенциальных ошибок рендеринга.
Оптимизируйте ресурсы: старайтесь минимизировать количество draw call'ов и сложность шейдеров, чтобы избежать перегрузки GPU.
🟢 Тестирование нативных окон запроса разрешений
Речь про проверку системы при наличие/отсутствии пользовательских разрешений, таких как запросы на трекинг IDFA и push-уведомления.
Ошибки при реализации данных запросов могут привести к проблемам при модерации приложения в сторе.
Рекомендации по проверке:
- Избегать блокировки логики игры: никогда не делайте так, чтобы игра не могла продолжить работу, если пользователь отклоняет запрос разрешений. Например, если игрок не принял трекинг IDFA, интерфейс должен корректно обрабатывать это событие и не блокировать дальнейший прогресс.
- Тестирование на отказ: проверяйте, что приложение корректно реагирует на случаи, когда разрешение не принято.
Это поможет избежать ситуаций, когда ревьюер App Store или Google Play не может протестировать приложение должным образом, что приводит к отклонению.
🟢 FTUE и воронки игроков
FTUE (First Time User Experience) играет ключевую роль в удержании пользователей.
Анализ воронки игроков позволяет понять, насколько хорошо новая аудитория воспринимает ваш проект.
Рекомендации по тестированию FTUE:
Анализ цепочки действий игроков: аналитическая система должна отслеживать каждый шаг пользователя после первого запуска игры.
Сколько пользователей запустило игру, сколько прошло туториал, сколько достигло первого уровня и т.д.
‼️Метрики удержания: собирайте данные о количестве пользователей, покинувших игру на разных этапах. Это поможет выявить проблемные зоны и улучшить ранний игровой опыт.
Продолжение 🔽
#Unity3D #тестирование
Также не забываем про потенциально узкие места 🔽
🟢 Папки Resources
Часто разработчики для хранения ассетов используют папку Resources в Unity, это может казаться удобным способом хранения для загрузки во время выполнения.
‼️Однако её чрезмерное использование может привести к проблемам с производительностью и управлением памятью:
Загрузка всех ассетов: При старте Unity загружает все файлы в папке Resources в память, что увеличивает время загрузки и потребление ресурсов.
Сложность управления: ассеты, загруженные через Resources.Load, не могут быть легко управляемы или обновляемы при выпуске патчей.
Рекомендации:
Используйте Addressables - это более гибкий и оптимизированный подход к управлению ассетами, позволяющий загружать их по запросу и лучше контролировать использование памяти.
Addressables поддерживает загрузку ассетов из разных источников, включая удалённые серверы, что значительно улучшает производительность.
🟢 Папка StreamingAssets
StreamingAssets - специальная папка, где можно хранить файлы, которые нужно загружать в неизменённом виде во время выполнения (например, видео, звуковые файлы и другие данные).
Файлы из этой папки не упаковываются в игровые сборки и могут быть загружены напрямую с диска.
Рекомендации по использованию StreamingAssets:
Медиафайлы и конфигурации: используйте эту папку для хранения больших файлов или конфигурационных данных, которые не нуждаются в обработке Unity.
Платформенные особенности: учтите, что на разных платформах пути доступа к этой папке могут отличаться, поэтому важно протестировать корректность загрузки файлов на Windows, Android и iOS.
‼️Вложенные усилия в тестирование помогут создать высококачественный продукт, способный конкурировать на рынке и завоевывать доверие игроков.
В рамках текущей публикации я рассмотрел какие акценты необходимо расставлять в процессе тестирования.
В рамках следующей публикации разберем набор инструментов для тестирования.
Хорошего дня! 👋
Вопросы жду в комментариях!
Также не забываем про потенциально узкие места 🔽
🟢 Папки Resources
Часто разработчики для хранения ассетов используют папку Resources в Unity, это может казаться удобным способом хранения для загрузки во время выполнения.
‼️Однако её чрезмерное использование может привести к проблемам с производительностью и управлением памятью:
Загрузка всех ассетов: При старте Unity загружает все файлы в папке Resources в память, что увеличивает время загрузки и потребление ресурсов.
Сложность управления: ассеты, загруженные через Resources.Load, не могут быть легко управляемы или обновляемы при выпуске патчей.
Рекомендации:
Используйте Addressables - это более гибкий и оптимизированный подход к управлению ассетами, позволяющий загружать их по запросу и лучше контролировать использование памяти.
Addressables поддерживает загрузку ассетов из разных источников, включая удалённые серверы, что значительно улучшает производительность.
🟢 Папка StreamingAssets
StreamingAssets - специальная папка, где можно хранить файлы, которые нужно загружать в неизменённом виде во время выполнения (например, видео, звуковые файлы и другие данные).
Файлы из этой папки не упаковываются в игровые сборки и могут быть загружены напрямую с диска.
Рекомендации по использованию StreamingAssets:
Медиафайлы и конфигурации: используйте эту папку для хранения больших файлов или конфигурационных данных, которые не нуждаются в обработке Unity.
Платформенные особенности: учтите, что на разных платформах пути доступа к этой папке могут отличаться, поэтому важно протестировать корректность загрузки файлов на Windows, Android и iOS.
‼️Вложенные усилия в тестирование помогут создать высококачественный продукт, способный конкурировать на рынке и завоевывать доверие игроков.
В рамках текущей публикации я рассмотрел какие акценты необходимо расставлять в процессе тестирования.
В рамках следующей публикации разберем набор инструментов для тестирования.
Хорошего дня! 👋
Вопросы жду в комментариях!