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

Вы узнаете, как анализировать узкие места с помощью Unity Profiler, оптимизировать шейдеры, снизить нагрузку на CPU и GPU, уменьшить размер сборки и повысить стабильность FPS. Материал подойдёт разработчикам, которые хотят создавать лёгкие и производительные проекты на Unity без потери качества визуала.
- Почему оптимизация в Unity важна?
- Основные принципы оптимизации Unity
- Оптимизация графики в Unity
- Оптимизация кода и логики игры
- Оптимизация физики в Unity
- Оптимизация UI и анимаций
- Оптимизация загрузки и управления ресурсами
- Уменьшение размера сборки
- Инструменты для отладки и тестирования
- Частые ошибки и советы по оптимизации
- Топ эпических провалов в оптимизации:
- Советы, которые реально работают:
- Заключение
- Рекомендуем посмотреть курсы по созданию игр на Unity
Почему оптимизация в Unity важна?
Слушайте, давайте начистоту: Unity - это как швейцарский нож в мире игровых движков. Вроде всё может, но за эту универсальность приходится платить. И платить, я вам скажу, порой приходится производительностью (а иногда и нервами разработчиков).
Начнём с того, что Unity, при всей своей демократичности, имеет несколько... скажем так, особенностей. Первая и самая "забавная" - это то, что движок очень любит загружать один поток CPU (да-да, тот самый основной поток Unity). И неважно, что у вас процессор с 8 ядрами последнего поколения - Unity, как верный пёс, будет упорно использовать преимущественно одно из них. Конечно, есть Jobs System и DOTS, но давайте будем честными - это всё ещё больше похоже на экспериментальные фичи, чем на production-ready решения.
Особенно "весело" становится, когда речь заходит о мобильных устройствах. То, что прекрасно летает на вашем игровом ПК, может превратить среднестатистический смартфон в портативную грелку. А если вы нацелились на консоли... о, это отдельная история! Xbox One, например, с его "бодрым" процессором может преподнести немало сюрпризов (и не всегда приятных).
Но самое интересное - это то, как плохая оптимизация влияет на пользовательский опыт. Знаете, что происходит, когда FPS падает ниже комфортного уровня? Правильно - пользователи начинают писать "увлекательные" отзывы в магазинах приложений. И поверьте моему опыту - никакие гениальные геймплейные механики не спасут игру, которая тормозит как слайд-шоу на презентации PowerPoint.
Причём требования к производительности сильно различаются в зависимости от платформы. Если для мобильных игр достаточно стабильных 30 FPS (хотя лучше, конечно, 60), то для VR нужно выжимать все 90, а то и 120 кадров в секунду. И попробуйте-ка обеспечить такую производительность, когда каждый кадр нужно рендерить дважды - по одному для каждого глаза!

Вот поэтому оптимизация в Unity - это не просто пункт в TODO-листе, который можно отложить на потом. Это непрерывный процесс, который лучше начинать ещё на этапе прототипирования. Иначе рискуете в один прекрасный момент обнаружить, что ваша игра превратилась в эффективный инструмент для тестирования терпения пользователей.
Основные принципы оптимизации Unity
Знаете, что самое забавное в оптимизации? То, как разработчики обычно к ней подходят. "А давайте оставим это на последнюю неделю перед релизом!" - говорят они, и я в такие моменты не знаю - смеяться или плакать.
Планирование оптимизации на ранних этапах - это как страховка жизни для вашего проекта. Поверьте человеку, который видел не один проект, похороненный под грудой перформанс-issues за неделю до релиза. Нет ничего веселее, чем пытаться переписывать core-механики игры, когда маркетинг уже запустил рекламную кампанию (спойлер: это сарказм).
Давайте поговорим об инструментах. Unity, надо отдать ему должное, предоставляет целый арсенал для охоты на производительность:
| Инструмент | Для чего нужен | Когда использовать |
|---|---|---|
| Unity Profiler | Анализ производительности CPU, GPU, памяти | Постоянно. Серьёзно, это ваш лучший друг |
| Deep Profiling | Детальный анализ методов (но осторожно - замедляет!) | Когда точно знаете, что ищете |
| Frame Debugger | Анализ рендеринга покадрово | При оптимизации графики |
| Memory Profiler | Поиск утечек памяти | Когда игра внезапно "съедает" всю память |
| GPU Profiler | Анализ нагрузки на видеокарту | Но только когда действительно нужно! |

А теперь о самом интересном - цикле оптимизации. Я называю это "Танцем с профайлером":
- Измеряем (и желательно на реальном устройстве, а не на вашем супер-ПК)
- Улучшаем (только одну вещь за раз, иначе потом не поймёте, что помогло)
- Тестируем (и молимся, чтобы не сломать чего-нибудь ещё)
- Повторяем (потому что оптимизация - это не спринт, это марафон)
И знаете что? Самое важное - это знать, когда остановиться. Потому что есть такая шутка среди разработчиков: "Преждевременная оптимизация - корень всех зол". Хотя, честно говоря, после стольких лет в геймдеве я бы сказал, что корень всех зол - это отсутствие оптимизации вообще.
А, и ещё один про-тип: ведите лог оптимизации. Записывайте, что меняли и какой эффект это дало. Потому что нет ничего хуже, чем через месяц пытаться вспомнить, почему вы отключили тот или иной фичу - особенно когда продюсер спрашивает, почему у главного героя больше нет крутых партикл-эффектов при ходьбе.
Оптимизация графики в Unity
Давайте поговорим о графике - той самой области, где большинство разработчиков почему-то уверены, что "больше = лучше". Спойлер: нет, не лучше, особенно когда ваша игра превращает телефон пользователя в портативную электроплитку.
Работа с рендерингом и освещением
Начнём с извечного вопроса: Forward или Deferred рендеринг? Это как выбор между механической и автоматической коробкой передач - каждый вариант хорош в своей ситуации:
- Forward рендеринг - ваш выбор для мобильных игр и проектов с небольшим количеством источников света. Работает быстрее в простых сценах и менее прожорлив к памяти (а на мобилках память - это святое).
- Deferred рендеринг - для тех, кто любит много динамического освещения и не боится повышенных требований к железу. Правда, есть один нюанс - прозрачные объекты всё равно придётся рендерить в Forward режиме (сюрприз!).
А теперь про освещение. Знаете, что я часто вижу в проектах начинающих разработчиков? Правильно - десятки динамических источников света, каждый со своими тенями. И потом все удивляются, почему GPU рыдает в уголке.
Вот вам простой рецепт:
- Используйте запечённое (baked) освещение везде, где только можно
- Динамические источники света - только для действительно важных эффектов
- Тени? Только от самых важных источников света
- HDR, SSAO, MSAA - все эти красивые аббревиатуры лучше отключить на мобильных устройствах
Оптимизация материалов и шейдеров
О, шейдеры - моя любимая тема! Знаете, что самое забавное? Большинство разработчиков используют Стандартный шейдер Unity для всего подряд, как будто это универсальное решение всех проблем. Спойлер: это не так.
Вот вам несколько правил работы с шейдерами:
- Используйте максимально простые шейдеры. Каждая инструкция в шейдере - это дополнительное время обработки
- Прозрачные материалы? Только по крайней необходимости. Они убивают батчинг и заставляют движок делать дополнительные проходы рендеринга
- Компрессия текстур - DXT для PC/консолей, ASTC для мобильных устройств. И да, ETC2 тоже подойдёт, если вы не гонитесь за качеством
Работа с текстурами и моделями
А теперь самое "вкусное" - текстуры и модели. Знаете, что я обожаю находить в проектах? Текстуры размером 4096x4096 для UI элементов размером 100x100 пикселей. Это как ездить на Ferrari за хлебом - можно, но зачем?
Вот вам чек-лист для работы с графикой:
- Атласы спрайтов - обязательно! Особенно для UI
- Сжатие текстур - подбирайте оптимальный формат для каждой платформы
- LOD (Level of Detail) для 3D моделей - чем дальше объект, тем меньше полигонов ему нужно
- Occlusion Culling - но только если у вас действительно сложная сцена с множеством перекрывающихся объектов
- Static/Dynamic Batching - отличный способ уменьшить количество draw calls, но помните про ограничения по размеру меша для динамического батчинга
И напоследок - самый важный совет: профилируйте, профилируйте и ещё раз профилируйте. Потому что иногда самые невинные на первый взгляд вещи могут оказаться настоящими убийцами производительности.
P.S. И да, тот крутой пост-процессинг эффект, который вы хотите добавить? Скорее всего, он того не стоит. Особенно на мобильных устройствах.
Оптимизация кода и логики игры
Поговорим о коде. Знаете, что общего между плохо оптимизированным кодом и старым анекдотом? Оба могут быть очень смешными, но только до тех пор, пока вам не придётся с ними работать.
Общие принципы оптимизации кода
Начнём с главного греха Unity-разработчиков - злоупотребления Update(). Я часто вижу код, где Update() используется как универсальное решение всех проблем. Это примерно как забивать гвозди микроскопом - технически возможно, но есть способы получше.
Вот вам пример типичного "антипаттерна":
void Update() {
player = GameObject.FindWithTag("Player"); // Каждый кадр! Серьёзно?
if(Vector3.Distance(transform.position, player.transform.position) < 10f) {
// Что-то делаем...
}
}А вот как это должно выглядеть:
private Transform playerTransform; // Кэшируем ссылку
void Start() {
playerTransform = GameObject.FindWithTag("Player").transform;
}
void Update() {
if((transform.position - playerTransform.position).sqrMagnitude < 100f) { // sqrMagnitude быстрее Distance
// Что-то делаем...
}
}Работа с памятью
О, сборщик мусора (GC) - наш старый "друг"! Знаете, почему игра иногда подвисает на долю секунды? Скорее всего, это GC решил прибраться в самый неподходящий момент.
Несколько правил для минимизации генерации мусора:
- Используйте пулы объектов вместо Instantiate/Destroy
- Предпочитайте структуры классам для маленьких объектов
- Избегайте создания временных строк и массивов в часто вызываемых методах
- Используйте StringBuilder для сложных операций со строками
// Плохо - создаём новые строки каждый кадр
void Update() {
debugText.text = "Position: " + transform.position.ToString();
}
// Хорошо - переиспользуем StringBuilder
private StringBuilder sb = new StringBuilder(100);
void Update() {
sb.Clear()
.Append("Position: ")
.Append(transform.position);
debugText.text = sb.ToString();
}Использование асинхронных процессов
Корутины в Unity - это как швейцарский нож для асинхронных операций. Только не превращайте их в швейцарский сыр с дырками в производительности.
// Распределяем тяжёлые вычисления между кадрами
IEnumerator ProcessLargeArray() {
var waitForEndOfFrame = new WaitForEndOfFrame();
for(int i = 0; i < hugeArray.Length; i++) {
ProcessElement(hugeArray[i]);
if(i % 100 == 0) // Обрабатываем по 100 элементов за кадр
yield return waitForEndOfFrame;
}
}И последний, но важный момент: профилируйте свой код! Unity Profiler покажет вам все "узкие места" вашего кода. И поверьте, иногда результаты могут вас удивить - например, когда вы обнаружите, что безобидный на первый взгляд foreach генерирует кучу мусора на каждой итерации.
P.S. И да, тот крутой паттерн проектирования, который вы хотите использовать? Возможно, простой синглтон справится не хуже, а памяти съест меньше. Иногда простота - это не признак примитивности, а признак мудрости.
Оптимизация физики в Unity
Физика в Unity - это как джинн из бутылки: очень мощная штука, но если не обращаться с ней аккуратно, можно получить совсем не то, что хотелось. Особенно когда речь идет о производительности.
Давайте я расскажу вам историю из жизни: однажды ко мне пришли ребята с "небольшой" проблемой - их игра отлично работала на высокопроизводительных устройствах, но превращалась в слайд-шоу на более слабых. Причина? Они использовали MeshCollider для каждого камушка на уровне. Каждого. Камушка.
Вот вам таблица основных настроек физики и их влияния на производительность:
| Настройка | Влияние на производительность | Рекомендация |
|---|---|---|
| Fixed Timestep | Критическое | 0.02 для мобильных, 0.01 для ПК |
| Collision Detection | Высокое | Discrete для большинства объектов |
| Interpolate | Среднее | Только для важных движущихся объектов |
| Sleep Mode | Среднее | StartAwake для статичных объектов |
| Auto Sync Transforms | Высокое | Отключить, если не нужна точная физика |
Основные правила оптимизации физики:
- Используйте простые коллайдеры:
- Box, Sphere, Capsule - ваши лучшие друзья
- MeshCollider - только в крайнем случае, и желательно с флагом convex
- Compound colliders для сложных объектов вместо MeshCollider
- Хитрости с Rigidbody:
// Если объект редко двигается if (rb.velocity.sqrMagnitude < 0.001f) rb.Sleep(); // Для объектов, которым не нужна точная физика rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
- Оптимизация слоев коллизий:
- Используйте матрицу коллизий для ограничения ненужных проверок
- Группируйте похожие объекты в одном слое
- Не забывайте про Trigger коллайдеры - они легче в обработке
- Fixed Timestep:
// В ProjectSettings/Time Time.fixedDeltaTime = 1.0f / targetPhysicsFPS; // Например, 1.0f/50.0f для 50 физических обновлений в секунду
И самый важный совет: не все объекты нуждаются в физике! Я видел проекты, где разработчики добавляли Rigidbody к декоративным элементам "на всякий случай". Спойлер: этот "случай" обычно выражается в падении FPS.
P.S. И помните - Unity Physics (встроенная физика) и Physics2D (2D физика) - это разные системы. Не смешивайте их без необходимости, каждая из них создает свою нагрузку на процессор.
Оптимизация UI и анимаций
Знаете, что может убить производительность вашей игры быстрее, чем неоптимизированная физика? Правильно - UI! Особенно когда каждый второй элемент интерфейса пересчитывает свой layout каждый кадр, а ведь именно так часто и происходит в "боевых" проектах.
Оптимизация пользовательского интерфейса
Давайте для начала развенчаем главный миф: CanvasGroup.alpha = 0 - это НЕ то же самое, что gameObject.SetActive(false). Первый вариант просто делает объект прозрачным, но UI всё равно обрабатывается. Это как выключить монитор, не выключая компьютер - энергию он всё равно потребляет.
Вот вам несколько золотых правил оптимизации UI:
// Плохо - пересчитываем layout каждый кадр
void Update() {
textElement.text = score.ToString();
layoutElement.preferredWidth = someValue;
}
// Хорошо - обновляем только при изменении
private int lastScore = -1;
void Update() {
if (score != lastScore) {
textElement.text = score.ToString();
lastScore = score;
// Вызываем LayoutRebuilder только когда действительно нужно
LayoutRebuilder.MarkLayoutForRebuild(rectTransform);
}
}Советы по оптимизации UI:
- Используйте один Canvas для статических элементов и отдельный для динамических
- Отключайте Raycast Target для некликабельных элементов
- TextMeshPro вместо стандартного Text - это не просто модный тренд, а реальная оптимизация
- Избегайте вложенных Layout Groups - каждый уровень вложенности это дополнительные расчёты
Оптимизация анимаций
А теперь поговорим об анимациях. Animator в Unity - мощный инструмент, но иногда эта мощь используется во зло производительности.
// Антипаттерн - анимируем через Update
void Update() {
transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime);
}
// Лучше использовать Animator или DOTween
void Start() {
transform.DORotate(new Vector3(0, 360, 0), duration, RotateMode.FastBeyond360)
.SetEase(Ease.Linear)
.SetLoops(-1);
}Основные принципы оптимизации анимаций:
- Отключайте Animator для объектов вне камеры
- Используйте простые анимации для UI вместо сложных эффектов
- Оптимизируйте кривые анимации - меньше ключевых кадров = меньше вычислений
- Не запускайте одновременно Animator и DOTween для одного объекта
И мой любимый совет - используйте Timeline только там, где он действительно нужен. Это как швейцарский нож - крутая штука, но не нужно им масло на хлеб намазывать.
P.S. И да, тот крутой эффект пульсации для всех кнопок в меню? Может быть, достаточно будет простого масштабирования по клику? Иногда меньше действительно значит больше, особенно когда речь идет о производительности.
Оптимизация загрузки и управления ресурсами
Знаете, что я часто вижу в проектах? Папку Resources размером с хороший торрент-сайт. А потом разработчики удивляются, почему их игра грузится дольше, чем Windows Update.
Использование Addressables
Addressables - это как курьерская служба для ваших ресурсов: доставляет только то, что нужно, и только когда нужно. В отличие от старой доброй системы Resources, которая работает по принципу "загрузим всё, вдруг пригодится".
// Старый подход с Resources
void LoadLevel() {
var allStuff = Resources.LoadAll("LevelAssets"); // Загружаем ВСЁ
// Молимся, чтобы память не закончилась
}
// С Addressables
async void LoadLevelSmarter() {
var levelHandle = Addressables.LoadAssetAsync("Level1");
var level = await levelHandle.Task;
// Загружаем только то, что нужно
}Преимущества Addressables:
- Асинхронная загрузка - никаких фризов
- Загрузка по требованию - экономим память
- Автоматическое управление зависимостями
- Возможность загрузки с CDN
Уменьшение размера сборки
А теперь о наболевшем - размере игры. Вот таблица форматов и их влияния на размер:
| Тип файла | Формат | Влияние на размер | Рекомендации |
|---|---|---|---|
| Аудио | MP3 | Среднее | Для фоновой музыки |
| Ogg Vorbis | Низкое | Для эффектов | |
| WAV | Высокое | Только для критичных звуков | |
| Текстуры | PNG | Высокое | Для UI с прозрачностью |
| JPG | Среднее | Для фонов без прозрачности | |
| ETC2 | Низкое | Для 3D текстур на Android |
Советы по оптимизации ресурсов:
- Используйте компрессию аудио:
// В настройках аудио-клипа Force To Mono = true; // Если стерео не критично Load In Background = true; // Асинхронная загрузка Load Type = Compressed In Memory // Для большинства звуков
- Оптимизация текстур:
- Используйте разные настройки компрессии для разных платформ
- Включайте MipMaps только для текстур, которые действительно масштабируются
- Отключите Read/Write Enabled, если не меняете текстуры в рантайме
- Стриминг ресурсов:
// Настройка стриминга текстур QualitySettings.streamingMipmapMemoryBudget = 512; // Мегабайты
И самый важный совет: регулярно проводите "ревизию" ассетов. Удаляйте неиспользуемые ресурсы, они как старые вещи в шкафу - вроде жалко выбросить, но только место занимают.
P.S. И нет, тот набор из 100 HD текстур травы "на будущее" вам скорее всего не понадобится. Особенно если вы делаете 2D-платформер.
Инструменты для отладки и тестирования
Знаете, что общего между детективом и разработчиком, ищущим проблемы с производительностью? Правильно - оба нуждаются в правильных инструментах. Давайте разберем наш Unity-детективный набор.
Unity Profiler
Это как рентген для вашей игры. Показывает всё, что происходит внутри, вплоть до самых мелких деталей.
// Добавляем собственные маркеры в профайлер
void HeavyMethod() {
Profiler.BeginSample("MyHeavyCalculations");
// Какие-то сложные вычисления
Profiler.EndSample();
}Основные вкладки профайлера:
| Вкладка | Что показывает | Когда использовать |
|---|---|---|
| CPU | Нагрузка на процессор | Поиск тяжелых методов и скриптов |
| Memory | Использование памяти | Отслеживание утечек памяти |
| GPU | Нагрузка на видеокарту | Оптимизация графики |
| Timeline | Временная шкала выполнения | Анализ последовательности операций |
| Physics | Физические вычисления | Оптимизация физики |
Memory Profiler
Отдельный разговор про Memory Profiler - это как финансовый аудитор, который показывает, куда утекают ваши "ресурсы":
// Плохо - создаем много временных объектов
void Update() {
var tempList = new List();
// Что-то делаем...
}
// Хорошо - переиспользуем список
private List reuseableList = new List();
void Update() {
reuseableList.Clear();
// Используем список...
}Frame Debugger
Frame Debugger - это как замедленная съемка для рендеринга. Показывает каждый draw call, каждый шейдер, каждую текстуру. Особенно полезен, когда вы видите что-то вроде:
Draw Calls: 1500 Expected: ~100 Reason: ???
Debug.Log и его друзья
// Разные уровни логирования
Debug.Log("Обычное сообщение");
Debug.LogWarning("Что-то подозрительное");
Debug.LogError("Всё совсем плохо");
// Условный лог только в редакторе
[Conditional("UNITY_EDITOR")]
void DebugLog(string message) {
Debug.Log(message);
}И помните - логи в билде это как GPS-трекер для вора: чем больше следов вы оставляете, тем проще найти проблему, но и тем больше ресурсов это потребляет.
P.S. А знаете, что самое забавное в отладке? То, что после часа поиска сложной проблемы часто оказывается, что вы просто забыли включить компонент на объекте. Классика!
Частые ошибки и советы по оптимизации
За годы работы с Unity я насмотрелся на такое количество "креативных" решений, что впору писать книгу "Как не надо оптимизировать игры". Давайте я поделюсь самыми "интересными" находками и тем, как их избежать.
Топ эпических провалов в оптимизации:
- "А давайте оставим оптимизацию на последнюю неделю!"
// Типичный код за неделю до релиза
void FixEverything() {
// TODO: Магическим образом оптимизировать всё
throw new Exception("Why didn't we start earlier?");
}Решение: Начинайте оптимизацию с первого дня разработки. Серьезно.
- "GameObject.Find в Update - а что такого?"
// Худший кошмар профайлера
void Update() {
var player = GameObject.Find("Player");
// 60 раз в секунду ищем объект по имени. Гениально!
}Решение: Кэшируйте ссылки в Start или Awake.
- "Давайте добавим физику всему!"
// Реальный код из одного проекта
foreach (var leaf in forestLeaves) {
leaf.AddComponent();
// Потому что реалистичность!
}Решение: Используйте физику только там, где она действительно нужна.
- "Корутины везде - это же модно!"
// Don't do this
IEnumerator UpdateEveryFrame() {
while (true) {
// Делаем что-то
yield return null;
}
}Решение: Используйте Update для регулярных обновлений, корутины - для асинхронных операций.
Советы, которые реально работают:
- Профилируйте на целевом устройстве
- Ваш супер-ПК не покажет реальных проблем
- Тестируйте на самых слабых поддерживаемых устройствах
- Ведите лог оптимизаций
- Оптимизируйте по приоритетам
- Сначала исправляйте критические падения FPS
- Потом занимайтесь общей производительностью
- В последнюю очередь - косметическими улучшениями
- Не оптимизируйте вслепую
- Всегда измеряйте "до" и "после"
- Делайте только одно изменение за раз
- Документируйте результаты
И самый главный совет: помните, что иногда лучшая оптимизация - это удаление ненужной функциональности. Как говорил один мудрый программист: "Самый быстрый код - это код, который не выполняется".
P.S. И да, тот крутой шейдер с 1000 инструкций для отражения в луже? Может, просто использовать текстуру с нормалмапом? Иногда простые решения работают лучше сложных.
Заключение
Путешествие в мир оптимизации Unity - это бесконечный процесс обучения, экспериментов и иногда откровенной магии с цифрами. После 13 лет работы с движком я могу сказать одно: нет универсальных решений, но есть универсальные принципы. Подведем итоги:
- Оптимизация Unity начинается с анализа. Используйте Profiler и тестирование на целевых устройствах, чтобы понимать реальные проблемы.
- Производительность зависит от графики, кода и физики. Упрощайте материалы, используйте LOD и избегайте лишних вызовов Update().
- Работайте с памятью аккуратно. Избегайте частого Instantiate и Destroy, применяйте Object Pool.
- Оптимизируйте ресурсы. Используйте Addressables и компрессию текстур для уменьшения размера игры.
- Регулярно профилируйте и тестируйте проект. Оптимизация — непрерывный процесс, который повышает стабильность и комфорт игрока.
Если вы хотите углубить свои знания в Unity и научиться применять описанные техники оптимизации на практике, рекомендую ознакомиться с подборкой лучших курсов по Unity. Там вы найдете образовательные программы разного уровня сложности, которые помогут вам освоить не только базовые принципы работы с движком, но и продвинутые методы оптимизации, о которых мы говорили в этой статье.
Рекомендуем посмотреть курсы по созданию игр на Unity
| Курс | Школа | Цена | Рассрочка | Длительность | Дата начала | Ссылка на курс |
|---|---|---|---|---|---|---|
Разработчик игр на Unity | Eduson Academy 137 отзывов | Цена 129 900 ₽ 287 496 ₽ Ещё -11% по промокоду | От 5 412 ₽/мес 11 979 ₽/мес | Длительность 6 месяцев | Старт В любое время | Подробнее |
Unity-разработчик | XYZ School 21 отзыв | Цена 138 600 ₽ 252 000 ₽ Ещё -18% по промокоду | От 4 000 ₽/мес | Длительность 10 месяцев | Старт 20 августа | Подробнее |
Разработчик игр на Unity | Нетология 47 отзывов | Цена 111 400 ₽ 206 384 ₽ с промокодом kursy-online | От 2 866 ₽/мес Это кредит в банке без %. Но в некоторых курсах стоимость считается от полной цены курса, без скидки. Соответственно возможно все равно будет переплата. Уточняйте этот момент у менеджеров школы. | Длительность 7 месяцев | Старт 24 августа | Подробнее |
Разработчик игр на Unity с нуля | Skillbox 262 отзыва | Цена 43 750 ₽ 87 500 ₽ Ещё -20% по промокоду | От 1 823 ₽/мес Без переплат на 2 года. | Длительность 3 месяца | Старт 18 августа | Подробнее |
Разработчик игр на Unity. Продвинутый уровень | Otus 76 отзывов | Цена 93 600 ₽ 104 000 ₽ | От 9 360 ₽/мес | Длительность 4 месяца | Старт 1 сентября | Подробнее |

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

Специалист по адаптации новых сотрудников в цифровых командах: как onboarding стал отдельной профессией

Аналитик рекрутинга: кто считает воронку найма, стоимость кандидата и эффективность каналов
