Обучение путем преподавания и сопровождения практикующих специалистов Базовые знания закрепляются на учебных курсах, которые требуют глубокого понимания, а не заучивания наизусть. Самые актуальные идеи приходят от специалистов по Unity Codecraft, NTC, Lavka razrabotchikov и Kod Manki. Сообщества в Telegram способствуют своевременным обсуждениям, которые опережают устаревшие книги.
Инкапсуляция защищает данные и поведение Инкапсуляция защищает данные и внутреннюю логику класса от внешних изменений. Состояние скрыто и доступно только через управляемые интерфейсы. Это предотвращает непреднамеренные изменения и сохраняет функциональность в пределах класса.
Чистый код означает ясность и простоту обслуживания Чистый код выполняет свою задачу, оставаясь простым для чтения и поддержки. Устраняется двусмысленность, поэтому поведение становится очевидным с первого взгляда. Архитектурные шаблоны применяются только тогда, когда они действительно упрощают обслуживание для решения поставленной задачи.
Принцип "Открыто–закрыто" с помощью расширяемых квестов Программное обеспечение должно быть открыто для расширения, но закрыто для модификации. Базовый тип квеста остается неизменным, в то время как специализированные квесты расширяют поведение за счет наследования. Игровой объект Unity приведен в качестве исключения, поскольку он не может быть расширен за счет наследования.
Замена Лискова позволяет избежать нарушенного наследования Подтипы должны сохранять родительский контракт, чтобы при замене никогда не менялось ожидаемое поведение. Проекты, которые добавляют нерабочую реализацию, такую как стационарная башня, наследующая движущийся модуль, нарушают этот контракт. Замена не должна приводить к исключениям или отсутствию действий.
Зависеть от абстракций; Внедрять реализации Модули высокого уровня полагаются на интерфейсы или абстрактные классы, а не на конкретные типы. Зависимости вводятся с помощью конструкторов, контейнеров или псевдоконструкторов, удобных для использования в MonoBehaviour. Внедрение зависимостей - это практичный способ применения инверсии зависимостей.
Тестовая пирамида от блока до конца Модульные тесты формируют основу и эффективно охватывают бизнес-логику, такую как инвентаризация и восстановление. Они регулярно выявляют регрессии после сборок, отмечая случаи сбоев для быстрого исправления. Интеграционные тесты проверяют взаимодействие между классами, в то время как сквозные тесты запускают полные сценарии в игровом режиме и выполняются медленнее.
Фабрика создает; Конструктор настраивает и собирает Шаблоны создания, структуры и поведения дополняют архитектуру MVX в реальных проектах. Factory фокусируется на создании таких объектов, как враги. Builder шаг за шагом собирает настроенную установку, а затем создает объект с желаемыми параметрами.
MVVM против MVP и предпочтительный ведущий-посредник В MVVM представление подписывается на данные, предоставляемые ViewModel, которые объединяют модель без прямой связи. В классическом MVP представление вызывает методы в Presenter, которые обрабатывают вводимые данные и работают с моделью. Предпочтительный вариант заключается в том, что презентатор содержит ссылки на обе стороны, в то время как View и Model не знают о Презентаторе и независимы друг от друга.
Синглтон: Глобальное удобство при скрытых затратах Синглтон гарантирует наличие единственного постоянно существующего экземпляра и предоставляет глобальный доступ с помощью простой реализации. Ошибки, такие как проверка экземпляра на нулевое значение, нарушают принцип постоянного существования. Это подходит для сквозных сервисов, таких как audio manager, когда внедрение является громоздким, но приводит к неявным зависимостям, неясной инициализации и рискам обслуживания.
Управление игровым процессом с помощью пользовательского игрового цикла Управление игровым процессом осуществляется через пользовательский цикл, а не через множество разрозненных обновлений для одного поведения. Запуск и одно обновление инициализируют систему интерфейсов, таких как IInitGame, IStartGame и прослушиватели исправлений/обновлений. Реализации подключаются к общему контексту, поэтому события жизненного цикла проходят последовательно.
Средство определения местоположения служб для простых глобальных зависимостей Локатор сервисов предоставляет глобальный доступ к необходимым сервисам в качестве прагматичной альтернативы одиночным играм. Он позволяет избежать привязки каждой зависимости к конструкторам, сохраняя при этом логику игрового процесса слабо связанной. Такой подход способствует быстрому доступу к формальным контейнерам DI.
Список
Исправлено накопление обновлений в тяжелых Рамах Функция FixedUpdate запускается в соответствии с fixedDeltaTime, в то время как обновление выполняется по времени кадра. Когда обновление выполняется дольше установленного временного интервала, последовательно запускается несколько функций FixedUpdate, чтобы наверстать упущенное. Unity измеряет прошедшее время и выполняет необходимые фиксированные действия, прежде чем продолжить.
Выбор между сопрограммами, однозадачностью и заданием Сопрограммы, UniTask и Task Task предназначены для различных асинхронных задач. UniTask интегрируется с жизненным циклом Unity, может возвращать значения и работает в веб-сборках, где потоки недоступны. Задачи соответствуют запросам сервера и фоновой работе в других потоках, в то время как сопрограммы остаются полезными, но не могут возвращать значения напрямую.
Сопрограммы как планировщики, ориентированные на доходность, привязанные к монобизнесу Сопрограмма продвигается вперед с помощью инструкций yield, которые приостанавливают выполнение до тех пор, пока не будут выполнены условия, такие как ожидание истечения времени. Цикл Unity проверяет эти инструкции в каждом кадре и возобновляет их, когда они будут готовы. В MonoBehaviour выполняется процедура, чтобы движок мог управлять ее выполнением.
Деревья поведения против полезного искусственного интеллекта для анализа логики противника Иерархические автоматы состояний и деревья поведения отображают патрулирование, атаки и преследования в виде четкой структуры. Behavior3 предоставляет предсказуемые потоки действий противника с четкими состояниями и переходами. Служебный ИИ и GOAP являются признанными подходами, при этом служебный ИИ вычисляет баллы для выбора между действиями.
Детерминированные сценарии или решения, основанные на результатах Поведенческие деревья работают, когда поведение соответствует определенному сценарию, например, патрулирование до обнаружения игрока, а затем атака. Служебный ИИ поддерживает динамичные ситуации, оценивая такие варианты, как атака или перемещение, и выбирая наивысший приоритет. Наилучшее соответствие зависит от того, требуется ли предсказуемость или адаптивный выбор.
Знание путей и доступность сетки в зависимости от маршрута Построение траектории в NavMesh основано на классических алгоритмах, таких как A*. Для тактической игры на основе сетки один алгоритм может помечать все доступные фрагменты в пределах ограничения движения, не создавая траекторий. Затем второй проход вычисляет конкретный маршрут к выбранному пункту назначения.
Сжатие текстур на Android и PNG-файлы во время выполнения Android создает текстуры для хранилища, используя выбранное графическое сжатие, например, ETC2, если устройство поддерживает его. Если оно не поддерживается, Unity может вернуться к исходному формату, например RGBA32. В сборку включена только одна сжатая копия для каждой платформы. Для рендеринга требуются форматы, поддерживаемые графическим процессором, а не raw PNG/JPEG, поэтому загруженные файлы PNG преобразуются в текстуры выбранного формата, а несжатые изображения, такие как RGBA32, могут превышать размер файла PNG.
Этапы создания шейдеров, порядок рендеринга и конвейеры освещения Вершины преобразуются в вершинном шейдере, растрируются на фрагменты и затемняются в фрагментном шейдере. Сначала визуализируются непрозрачные объекты, а затем прорисовываются прозрачные объекты для правильного смешивания. Прямое освещение применяется к каждому объекту с практическими ограничениями, функция Forward+ ослабляет эти ограничения, а функция Deferred применяет освещение в соответствии с геометрией, но с трудом справляется с полупрозрачными поверхностями.
Оптимизация розыгрышей и создание визуальных эффектов Вызов draw - это команда центрального процессора, которая передает работу графическому процессору; большее количество вызовов обычно приводит к снижению производительности. Оптимизация сочетает статическую и динамическую обработку пакетов, создание экземпляров GPU и SRP-пакетировщик для сокращения изменений состояния. Изменение порядка объектов и упрощение шейдеров еще больше сокращают количество проходов. Рябь на плоскости может быть имитирована во фрагментном шейдере с помощью отображения нормалей или реализована как истинная деформация в вершинном шейдере, если сетка плотная. Эффекты экранного пространства были реализованы с помощью пользовательского интерфейса, а пользовательские функции, такие как контуры, были интегрированы, а не написаны с нуля.
Удаленные адресуемые объекты уменьшают размер сборки и затрудняют загрузку При удаленной доставке больших ресурсов объем сборки сократился примерно с 740 МБ до 120 МБ. Персонажи и сцены размещались удаленно и загружались по запросу. Игрокам больше не приходилось загружать все сразу, что помогало при задержках подключения. Затем проект сосредоточился на настройке адресуемых объектов, чтобы этот поток работал надежно.
Консолидируйте общие ресурсы для предотвращения дублирования пакетов Каждый из двух пакетов содержал сборку, которая ссылалась на одну и ту же неадресуемую текстуру через изображение пользовательского интерфейса. Система сборки предупреждала о дублировании содержимого. Исправление заключалось в выделении часто используемых ресурсов в выделенную общую группу. Это позволило избежать дублирования текстур в пакетах и сохранить упорядоченный контент.
Память во время выполнения и подсчет ссылок поддерживают ресурс в рабочем состоянии один раз Даже если два созданных префаба указывают на одну и ту же текстуру, в памяти хранится одна копия с несколькими ссылками. Освобождение ресурса приводит к уменьшению счетчика ссылок, а не к его немедленной выгрузке. Система может отложить освобождение памяти и проверить, используется ли ресурс еще где-либо. Однако дублирующиеся объекты с отдельными копиями будут поддерживать независимые ссылки.
Загрузка ссылок на ресурсы, многооконное использование и безопасный режим выпуска Текстура, переданная как AssetReference в двух окнах пользовательского интерфейса, загружается в каждое из них с помощью LoadAssetAsync. Закрытие одного окна и вызов Addressables.Освобождение этой текстуры не приводит к ее удалению из другого окна. Подсчет ссылок сохраняет ресурс до тех пор, пока все пользователи не освободят его. Даже повторные обновления не приведут к мгновенной очистке, если использование все еще обнаружено или произошла небольшая задержка.
Один ресурс из большого пакета по сравнению с загрузкой всего этого Поведение при загрузке зависит от того, как были упакованы ресурсы и их зависимостей. Если содержимое разделено соответствующим образом, может потребоваться загрузка только целевого ресурса. Если все упаковано вместе, системе может потребоваться загрузить весь файл пакета. Зависимости могут вызывать совместную загрузку, в то время как загрузка, управляемая ссылками, пытается получить только то, что необходимо.
Режим сжатия определяет потоковое и частичное чтение Пакетное сжатие (например, несжатое, LZMA) определяет, может ли среда выполнения передавать потоковую передачу частями или должна распаковывать весь файл целиком. Этот параметр является ключевым для понимания того, можно ли получить доступ к одному небольшому ресурсу без использования полного пакета. По умолчанию используются консервативные, более безопасные варианты, позволяющие избежать ошибок. Знание этих параметров позволяет провести более глубокую оптимизацию при снижении производительности.
Атласы спрайтов вырезают вызовы рисования пользовательского интерфейса на каждом экране Пользовательские спрайты были сгруппированы по экранам в атласы для визуализации всего за несколько вызовов draw. Это объединение улучшило производительность интерфейса и сократило накладные расходы на обработку. Атласы были включены непосредственно в сборку. Тщательный выбор того, какие спрайты совместно используют атлас, помог максимизировать прибыль.
Частицы в пользовательском интерфейсе: слой с холстами или рендеринг в текстуру Оверлейные холсты пользовательского интерфейса не отображают стандартные частицы, поэтому необходимы обходные пути. Может сработать рендеринг частиц в RenderTexture и отображение его в виде изображения. Размещение частиц на выделенном холсте, расположенном слоями между другими холстами, - это еще один способ. Пользовательский подход VFX, основанный на использовании изображений, также позволяет интегрировать визуальные элементы, похожие на частицы, в пользовательский интерфейс.
Производительность пользовательского интерфейса: холсты, маски, группы макетов и объединения в пулы Статический и динамический контент был разделен по холстам, чтобы избежать полной перестройки холста при перемещении элементов. В атласах спрайтов было сокращено количество вызовов отрисовки, в то время как маски использовались экономно, поскольку они добавляют дополнительные проходы. К группам макетов относились осторожно из-за частых пересчетов и перерисовок. Прокручивающиеся списки использовали объединение в пул и деактивацию, чтобы избежать ненужных появлений и обновлений.
Эффективное отображение и скрытие: отключение через альфа-версию с продуманной настройкой анимации Отключение игрового объекта после анимации предпочтительнее, чем просто установка альфа-значения на ноль. Элементы, скрытые в альфа-режиме, по-прежнему участвуют в рендеринге и обновлениях. Некоторые аниматоры позволяют избежать избыточных перестроек холста во время затухания, но самая безопасная оптимизация - это переключение активного состояния, когда это возможно. Начинайте анимацию с включения, а заканчивайте отключением, чтобы свести к минимуму накладные расходы.
Аниматоры для большинства движений пользовательского интерфейса; аниматор при необходимости Простые и упорядоченные движения пользовательского интерфейса, такие как открытие и награждение, были созданы с помощью tweeners. Animator использовался реже из-за больших затрат на простые переходы. Среди многих библиотек анимации PrimeTween выделялась меньшими затратами. Сравнительные тесты показали, что по скорости он находится на среднем уровне, но его профиль распределения делает его привлекательным.
Практический мультиплеер с Photon и Colyseus Опыт включает в себя обучающий серверный шутер с использованием Colyseus и серверной части TypeScript. Клиенты отправляли команды на сервер, который затем инструктировал клиентов, в то время как проекты Photon Fusion опирались на встроенные компоненты. Мультиплеер остается основной областью интереса. В настоящее время проводится специальное обучение для углубления практических знаний.
Прогнозирование на стороне клиента с согласованием на сервере Клиент отправляет входные данные и локально прогнозирует движение в ожидании сервера. Когда приходит разрешенное состояние, клиент выполняет повторное моделирование и, при необходимости, привязывается к правильному положению. Эта коррекция может привести к заметным задержкам при высокой задержке. Цикл обеспечивает баланс между быстродействием и возможной согласованностью.
Компенсация задержки перематывает время назад для получения точных попаданий Для снимков клиент также предоставляет исходную временную метку, чтобы сервер мог вернуться к этому моменту. Сервер имитирует попадание так, как оно могло бы произойти, и транслирует результат. Это создает привычные компромиссы, например, быть убитым после того, как укрылся, и выстрелы, которые, кажется, не фиксируются. Настройка позволяет видеть либо стрелка, либо жертву с другой стороны, но не то и другое идеально.
Встроенные функции и полный цикл обучения Реализованы движения, стрельба и перезарядка, что обеспечивает отображение состояния анимации на стороне клиента. Были созданы прототипы снарядов с самонаведением или на основе raycast. Текущие курсы охватывают регистрацию, авторизацию, привязку к базе данных, голосовую связь и чат. Доступ к наставникам и материалам позволяет неуклонно продвигаться к готовности производства.
Устройство для перемещения нуля на месте: уплотнение, затем заполнение Ненулевые элементы сжимаются при отслеживании следующего индекса записи. Второй проход заполняет остаток нулями, сохраняя порядок ненулевых значений. Временная сложность составляет O(n) из-за линейных проходов. Сложность пространства равна O(1), поскольку оно работает на месте с одним индексом.
Перестройка нормального пользовательского интерфейса и жизненного цикла ресурсов в приобретенном проекте В приобретенной кодовой базе отсутствовала система пользовательского интерфейса; окна были обычными объектами сцены, которые существовали всегда. Прямые ссылки на сцены и использование ресурсов загружали всю игру в память при запуске. Менеджер ресурсов теперь загружает контент по запросу, хотя автоматическую выгрузку — например, удаление закадровых образов персонажей — еще предстоит выполнить. В настоящее время разрабатывается надлежащий менеджер пользовательского интерфейса, внедрение зависимостей и централизованная точка входа для инициализации.
Зеркальное масштабирование за счет целенаправленной внутренней оптимизации Mirror был выбран и сохранен за его открытость, несмотря на проблемы с базовой производительностью. Оригинальная архитектура стала узким местом, которое в сочетании с настройками Mirror по умолчанию снизило скорость работы серверов примерно до 6 кадров в секунду для 70 игроков. Пользовательская настройка Mirror, адаптированная к проекту, позволила увеличить производительность примерно до 560 игроков на машину. Все еще есть возможности для дальнейших улучшений.
Обезглавленный сервер Unity и уход с PlayFab И сервер, и клиент работают в Unity, при этом сервер работает в автономном режиме, а код защищен с помощью defines. Постепенно на замену PlayFab внедряется отдельный, проприетарный серверный модуль. Mirror остается сетевым уровнем из-за возможности его модификации. Опыт работы с серверной частью, полученный в ходе исследований Colyseus, будет полезен для архитектуры, даже если Unity останется средой выполнения.
Используется Unity 2022 LTS; сторонние инструменты инспектора заполняют пробелы Команда разработчиков работает на Unity 2022.3.x, последней версии LTS перед Unity 6. Unity 6 привлекательна, но возможности inspector и сериализации по-прежнему уступают таким решениям, как Odin. TriInspector предлагает бесплатные функции, подобные Odin, такие как атрибуты и утилиты редактирования. Окна редактора, сценарии сборки и пользовательский интерфейс для отладки создаются быстро, а поддержка искусственного интеллекта теперь ускоряет работу с надежными инструментами редактирования.
Разработчики создают сборки с помощью cheat console и чистым завершением В сборках для разработчиков есть консоль с читами для быстрого тестирования в игре и команды. Меню отладки помогают проверять функции во время внедрения. Сессия завершилась четкими следующими шагами и ожидаемым окном обратной связи через отдел кадров. Обсуждение завершилось взаимной благодарностью.