Как сделать неон в юнити 2д
Трудно представить современную игру без анимаций. Сегодня я расскажу о том как работаю с 2д анимациями на Юнити через фреймворк Actors. Описанный мною подход реализуется легко на любых движках и языках. Ну а проект на юнити можно скачать отсюда.
Проблема
Зачем свое решение писать если в Unity уже есть Mecanim? Я много работаю с 2д анимациями и могу ответственно сказать, что использовать меканим для 2д это как стрелять из пушки по воробьям. Много ассетов,много абстракций, много оверхеда, много гибкости и мало смысла.
Дело вкуса и предпочтений но для того чтобы настроить простейшие связи анимаций нужно
- Добавить animator на объект
- Сделать animator controller ( особенно жесть если анимация всего 1 или 2 ).
- Понять, что лучше для этих целей использовать component animation. Который Legacy. Который в общем-то не дает нам ничего кроме массива анимаций и проигрывания. Да еще и с лишними вызовами методов со стороны движка хрен знает чего и для чего.
Допускается что мы будем использовать и Animator Controller и Component Animation и работать уже с двумя логическими единицами - Нужно создать anim clip и загрузить туда свою 2д анимацию. Кто этим никогда серьезно не занимался не прелставляет какой это гемор. Спасает разве что PowerSprite Animator от Powerhoof.
- Настроить animator controller закончив это дело настоящим итальянским болоньезе,с кучей второстепенных скриптов и невнятной логики.
- Goto 1. и так пока весь проект незавалится кучей бесмысленных ассетов с animator и anim clip.
БОЛОНЬЕЗ НЯМ
Я не говорю, что mecanim плох, я говорю вот об этом:
Описываем задачу
Чертить тонны схем и из какого места должны вылазить методы не моё , но прежде чем погрузиться в код надо хотя бы примерно представлять что мы будем делать.
- Мы создаем систему которая будет работать БЕЗ юнити аниматора и анимклипов.
- Нам нужно иметь возможность загружать несколько анимаций для объекта.
- Нам нужен функционал позволяющий проигрывать цепочку анимаций. Хотя бы цепочку из двух анимаций.
- Было бы неплохо при вызове анимации получить назад время на проигрывание выбранной анимации.
- Нам нужно иметь возможность работать с анимациями через скрипты если это потребуется.
- Простое api чтобы назначать и сбрасывать анимации у сущностей.
- Работает из Actors разумеется.
Что мне нравится в системах анимаций так это то, что их можно сделать какими угодно сложными или простыми.
В конечном итоге у нас должно получиться что-то такое:
sequence
sequences
Нам нужны ID для анимаций. Я предпочитаю использовать константы, но это так же легко делается через enum.
ComponentAnimator
Это компонент для екс. В общем-то это то что мы будем вешать на наши сущности.
Здесь нам интересен AnimatorGuide. Именно он позволит тонко работать с анимациями и добавлять к ним "события" и "скрипты".
AnimatorGuide
AnimatorGuide это аналог Mecanim в коде. С помощью animator guide можно легко настроить логику для базовых анимаций. Например все юниты проигрывают idle если скорость = 0 или меняют анимацию на бег если скорость выше 0.
AnimatorGuide по умолчанию не делает ничего. Напишем AnimatorGuidePawn который прикажет всем сущностям у которых он есть стоять на месте. Каждый раз когда мы создаем новую сущность она начнет проигрывать idle. Если мы в коде игры ( например в АИ скриптах ) перезапишем анимацию, то cAnimator.overriding не даст работать методу handle в AnimatorGuide. Так же нам не придется создавать по копии класса AnimatorGuidePawn для каждого юнита. Можно будет просто повесить один и тот же AnimatorGuidePawn через Instance.
ProcessorAnimator
Создаем процессор ( или еще их называют системами ) который будет обрабатывать все сущности с нашими компонентами ComponentAnimator и ComponentRenderer. ComponentRenderer просто хранит ссылку на SpriteRenderer.
game.locals.time_between_frames хранит время через которое нам надо обновлять кадры. В целях простоты мы не делаем локального времени для каждой отдельной секвенции, однако добавить это очень просто.
Осталось прикрутить API и сделать загрузку анимаций.
Метод ниже позволяет проиграть анимацию у сущности. Мы выбираем тип анимации, сколько раз она должна проиграться и c какого кадра. Мы так же считаем время нужное на проигрывание анимации и кешируем его в компоненте/возвращаем обратно.
anim.loop и anim.random_frame просто удобные константы чтобы указать что нам нужно сыграть анимацию бесконечно раз или нам нужен случайный кадр. Эти контанты добавляем к структуре anim```
Последний метод который нам понадобится это animationReset Мы просто сбрасываем кадры до нуля и говорим, что больше не перезаписываем анимацию чтобы наш animator guide мог решить сам какую анимацию нужно запустить.
Загрузка анимаций
Делаем все из кода. Просто и быстро. Box.Load это обертка Resources.Load в фреймворке с возможностью кеширования. Последняя секвенция интересная. Мы в ней пишем, что после проигрывания анимации Grab нужно проиграть анимацию Walk
($"
Результат
У нас на руках простое, легкорасширяемое решение по анимациям. Зарисуем же чтонибудь на экране. В самом начале поста я показывал как у нас это будет выглядить в скриптах игры.
Интереснее всего этот отыгрыш. После четырёх отыгрышей anim.grab отыграется anim.walk так как мы ее указали в настройках анимации для этого юнита.
Проект на unity можно скачать здесь.
Это не самая совершенная система, но ее не сложно дополнить нужными фишками. Но хочется особенно подчеркнуть : keep it simple, code fast.
А как справляетесь с анимациями вы? Делитесь мыслями и идеями в комментариях, будет интересно почитать :)
В этом посте мы рассмотрим как можно применить подход Двигателя на Тёмной Материи для создания бесконечного 2D фона.
Если вы сталкивались с мобильными играми в общественном транспорте, то наверняка могли заметить, что одними из самых популярных в поездке являются игры жанра Endless runner, например, Subway Surfers, а для любителей археологии примером может послужить Электроника ИМ23 “Автослалом”. Основным признаком данного жанра является бесконечно перемещающийся элемента(персонаж или другой объект), который обычно самостоятельно движется вперёд навстречу препятствиям, а управление даётся только для возможности эти препятствия избегать. Бесконечное перемещение подразумевает бесконечное пространство доступное для движения игрока, создание которых является не самой простой задачей, как могло бы показаться на первый взгляд. Этим постом мы открываем цикл, в котором рассмотрим элементы, которые помогут создать такие бесконечные, в каком-то смысле, миры.
Если поискать в интернете информацию по бесконечным пространствам для Unity, то одним из самых популярных туториалов будет создание бесконечных фоновых объектов для сайдскроллеров. В нашем случае мы немного усложним задачу и попробуем сделать бесконечный фон для топ-даун камеры. В качестве примера будет реализован бесконечный фон для космического пространства, в котором будет перемещаться модель космического корабля.
Проблематика
Первым что приходит в голову, когда вас просят сделать корабль, который перемещается в пространстве, это добавить модель корабля, задать ему вектор скорости, привязать к нему камеру, подложить фон и начать сдвигать корабль вдоль вектора, помноженного на Time.deltaTime . Если откинуть очевидные вещи с ограниченными размерами фона, которые в любом случае придётся решать, главной проблемой бесконечного перемещения окажется координатное пространство Unity, которое привязано к переменным типа float и с увеличением координат точность будет падать. Для более точного описания проблемы вы можете посмотреть вот это видео "64 Bit In Kerbal Space Program".
Dark Matter Engine
Для решения данного вопроса можно использовать подход, с помощью которого работает Двигатель на Тёмной Материи из “Футурамы”. Если коротко описать принцип его действия, то двигатель двигает не корабль, а пространство вокруг корабля. То есть, в нашем случае вместо того чтобы двигать вдоль вектора скорости наш корабль мы будем двигать все объекты вокруг него в противоположном направлении. Таким образом, если наша камера привязана к кораблю, то мы всегда будем оставаться в точке начала координат и наша точность не будет падать из-за увеличения расстояния. Да и в целом для решения вопроса с бесконечным перемещением, выбрать началом координат наше положение выглядит более красивым решением, нежели привязываться к какой-либо другой точке в пространстве.
Задача
Сделать перемещение космического корабля вдоль бесконечного 2D фона. Корабль можно поворачивать вокруг оси Z при помощи клика по правой/левой стороне экрана. Камера всегда будет сонаправлена с вектором движения корабля.
Решение
Я не буду распространять ассеты, которые используются для примера. Найти подходящие вам ресурсы это тоже большая работа и я предлагаю вам в этом потренироваться, если не знаете с чего начать, то можно посетить бесплатный itch.io или поискать в интернете "Free game assets" .
Нам понадобится текстура для корабля и текстура для фона. Основное требование к фону будет его зацикленность как в вертикальном, так и в горизонтальном направлении.
- Добавьте в проект текстуры корабля и фона, для фона необходимо выставить Mesh type - Full rect и Wrap mode - Repeat
- Создайте структуру объектов такого содержания
- Добавьте текстуру для корабля
- Добавьте текстуру для фона, выставите Draw mode - Tiled и Order in Layer = -1
- Создайте скрипт UniverseHandler, добавьте его к объекту Universe
Результат
Как можно увидеть в результирующей гифке объект фона смещается в начальное положение по направлению, в котором достигается сдвиг на изначальный размер фона, за счёт чего достигается визуальная бесшовность его перемещения.
Альтернативные решения
Программирование - это такая область, в которой в целом нет абсолютно правильных решений, перед программистом при решении практически любой задачи открывается довольно большой выбор методов, при помощи которых будут выполняться поставленные условия. В данном случае также можно поступить несколькими способами. Например, можно вместо спрайта сделать объект типа quad и настроив материал, который также использует тайловую структуру управлять её смещением, что избавит нас от перемещения объекта совсем. Если же вернуться к более классическому варианту, то можно скомбинировать обычное перемещение объекта и сдвиг центра координат для всей сцены сразу, по достижению каких-либо пределов.
Заключение
Когда мы задумываемся о создании бесконечных пространств подход Двигателя на Тёмной Материи является основным средством обхода ограничений точности для Unity. Совмещённый с обычными передвижениями сдвиг центра координат тоже можно отнести в эту же группу. Приведённый же пример прекрасно подходит для создания фонов и эффекта параллакса. Однако, работа с более сложными объектами требует иных подходов и для создания реальных неограниченных пространств необходимо ввести множество других механик. Эти вопросы мы рассмотрим в следующих статьях цикла про бесконечные миры. Пока! =)
Итак, урок посвящен частицам в Unity3d. Предназначен скорее для новичков, но каждый, думаю, найдет что-то для себя интересное. Движок сегодня очень популярен и не осваивает его только ленивый. К тому же проект, над которым я сейчас работаю мы делаем тоже на Юнити.
Пару вводных фраз о самих эффектах, чтобы понимать что к чему куда и как. Мое личное мнение, что 70% отлично выглядящего эффекта составляет правильно сделанная, качественная текстура. Сюда же входят цвета, наилучшим образом передающие суть эффекта, ее размер, анимированная она или нет, с альфа каналом или без. Текстура всегда должна быть оптимальной. К примеру, нет смысла делать маленькую искру на листе 256х256. Тут достаточно 8х8 или 16х16. Оставшиеся 30% успеха создаются умело настроенным поведением частиц. Чтобы развить этот навык – смотрите больше референсов, подмечайте различные эффекты в жизни, в кино, в играх. Изучайте физику вещей. Очень хороши замедленные съемки всякого рода взрывов, выстрелов, горящего огня и т.д.
Начнем. Перед тем, как настраивать эффект необходимо определиться из каких частей он будет состоять. В нашем примере – это пламя, искры, дым и немного искажения в стиле горячего воздуха в пустыне . Всегда помните, что чем проще и оптимальнее эффект, тем больше их можно использовать на сцене и тем меньше все будет тормозить. Далее мы определяемся с общим видом эффекта – что это будет. Собираем референсы, изучаем, как ведет себя огонь в горящих бочках, что там горит – это дает понимание какой будет дым по цвету и по интенсивности. Бывает неплохо набросать эффект, несколько фаз его развития на бумаге, чтобы понимать что делать. Своеобразная раскадровка.
Запускаем Юнити. У меня версия 4.1. В какой-то из предыдущих версий была переделана система частиц, поэтому на очень старых версиях редактора урок может быть не актуален. Из меню выбираем GameObject>Create Other>Particle System. У нас появилась система частиц с летящими белыми пятнами. В правом нижнем углу вьюпорта должно появиться маленькое окошко, которое помогает запускать симуляцию эффектов, останавливать их, ставить на паузу, менять скорость проигрывания (ВНИМАНИЕ! Скорость самого эффекта изменяется не здесь).Это позволяет отловить различные артефакты и косяки при очень быстрых эффектах, например выстрел. Чтобы понимать размер эффекта относительно мира я рекомендую настраивать на уже готовых объектах. В нашем случае – это бочка. Ставим бочку в координаты 0,0,0, вводя их в свитке Inspector в окошки сабсвитка Transform. Если свитка нет, то в меню Window включите его, а так же свиток Hierarchy. Далее выбираем нашу Particle System и ставим ее так же в 0,0,0. И чуть поднимаем вверх, чтобы огонь горел не на самом дне, а начинался чуть выше. Систему частиц можно переименовать, кликнув по ней в свитке Hierarchy и нажав F2. Я назвал нашу систему частиц FireMetalBarrelы.
ОГОНЬ
рис. 002 Выбирать эмитеры(после того, как Вы их создали, конечно) можно в свитке Hierarchy.
Первое, что мы должны сделать, чтобы увидеть не дефолтные белые шарики, а нужную текстуру – это сделать материал и текстуру огня. Сразу оговорюсь, что делать текстуры то еще развлечение. Достаточно долгая и кропотливая работа. Но как я уже говорил – это стоит того в итоге. Я использую свои давние наработки, которые я делал для игры Deep Black. Для текстур огня и дыма я использовал FumeFX плагин для 3dsmax. Моделировал различные взрывы, интенсивность, направления и т.д. Потом рендерил в серии кадров. Так я получал различной интенсивности и размера огненные всполохи. С дымом чуть проще. Как? Расскажу позже.
Итак, чтобы создать новый материал достаточно кликнуть правой кнопкой по любому месту в папке Materials (для моего проекта)
Возвращаемся в наш редактор частиц, выбираем эмитер FireMetalBarrel и сразу же переходим в самый нижний сабсвиток Renderer. Ставим галочку (это значит, что он не будет игнорироваться и будет активен ) и разворачиваем его кликом по нему. Render Mode оставляем Billboard. Это значит, что при любом угле обзора текстуры частиц всегда будут направлены в камеру. Снимаем галочки Cast и Receive Shadows так как шейдер материалов, типа Particles не принимает тени и не отбрасывает их. Перетаскиваем наш заготовленный материал в строчку Material и видим что-то отдаленно похожее на огонь. Материал можно так же назначить выбрав его из всех доступных, нажав маленький кружок обведенный зеленым цветом.
Возвращаемся в начало нашего свитка FireMetalBarrel и начинаем настраивать один сабсвиток за другим. Сразу подскажу, что наведя мышку на любой параметр вы увидите всплывающую краткую подсказку о том, что он значит и как работает. Все настроенные параметры я приведу на скриншотах. У некоторых параметров есть опции – они обозначены маленькими черными треугольничками справа от параметра. Constant -постоянная величина, Curve – изменение параметра по кривой, например размер от малого к большому и опять к малому. Random between two constants – случайное значение в промежутке от одного до другого указанных значений. Random between two curves – то же, что и предыдущее, только крайними значениями выступают кривые.
Опишу действие параметров:
Duration – общая продолжительность эффекта. Как показала практика особо не влияет при зацикленных эффектах.
Looping – зацикленность
Prewarm – как бы прогрев эффекта, чтобы он начался уже с основной интенсивностью
Start Delay – задержка в старте проигрывания в секундах
Start Lifetime – Время жизни в секундах
Start Speed – скорость, с которой стартуют частицы
Start Rotation – стартовая повернутость частицы на определенный градус. В нашем случае от 0 до 360.
Start Color – стартовый цвет. Можно регулировать по альфе или по цвету.
Gravity Multiplier – множитель гравитации. 9,82 м/c– гравитация для планеты Земля.
Inherit Velocity – наследуемая скорость для следующих частиц.
Simulation Space – система координат. В нашем случае – world. При Local позволяет частицам перемещаться вместе с эмитером, как например, двигатель космолета. При world – частицы ведут себя, как факел, который несут, т.е. отстают от эмитера.
Play on Awake – частицы стартуют автоматически.
Max Particles – максимальное кол-во частиц одновременно проигрываемых из этого эмитера.
Emission
Rate – количество частиц генерируемое в секунду.
Bursts – Параметр, который позволяет выбрасывать сразу нужное кол-во частиц в указанные промежутки времени, а не одна за другой последовательно. Выключен, в нашем случае.
Shape
Shape – форма эмитера. Конус, сфера, полусфера, бокс, меш.
Angle – угол разброса. В нашем случае 15 градусов.
Radius – радиус эмитера.
Emit from – откуда генерируются частицы. Из одной точки, из всего тела эмитера и т.д.
Random Direction – Задает случайное направление движения частиц. Помогает создать некую мелкую хаотичность в нашем случае с генерацией языков пламени.
Velocity over Lifetime
Параметр позволяет рандомайзить скорость движения частиц в течение их жизни. В нашем случае система координат world и направление вверх, т.е. по Y. Случайная скорость от 0.5 до 1. Получается, что языки пламени движутся с разной скоростью.
Force over Lifetime
Система координат тоже world. Помогает задать влияние небольших сил, которые смещают частицы в стороны по Х и по Y на небольшие расстояния. Y в данном случае почему то работает, не вверх, как в предыдущем.
Color over lifetime
Очень важный параметр, который помогает сделать плавным визуальное появление частицы по альфе и плавным ее пропаданием.
рис. 007 Тут можно регулировать цвета и альфаканал.
Rotation over Lifetime
Параметр позволяет придать некоторое вращение в течение жизни. В нашем случае от -20 до 30 градусов. Частицы вращаются в случайные разные стороны с медленной скоростью, что тоже придает реализма.
Остальные параметры нам оказались без надобности, но Вы можете поэкспериментировать и попытаться настроить еще лучше .
ДЫМ.
Если Вы все сделали правильно, то у Вас должно получиться довольно неплохое пламя. Но, сам эффект еще не готов и на половину и поэтому не стоит расстраиваться, если огонь далек от идеала. Сейчас я расскажу о том, как сделать дым. По сути с ним все просто – это тот же самый огонь лишь клонированный и немного перенастроенный
и с материалом (текстурой дыма). Копируем так – выбираем наш эмитер огня FireMetalBarrel, нажимаем Ctrl+D переименовываем в Smoke и перетаскиваем новый эмитер прямо на FireMetalBarrel, чтобы эмитер Smoke стал дочерним объектом и все они вместе образовывали иерархию. Все это делается в свитке Hierarchy. Подробнее хочу остановиться на том, как сделать текстуру дыма. Тут я не использовал никаких плагинов – только старый добрый Фотошоп и Гугл . Ищем картинку одинокого облака в Гугле. Я нашел вот такую
После небольшой обработки по размерам и десатурейту (превратил в ч/б) и добавления альфа канала путем копирования самого изображения и вставки в канал альфа – имеем нечто похожее на текстуру дыма.
Кстати я рекомендую стараться делать все текстуры кратные степени двойки по сторонам, типа 128х128, 1024х512, 64х16 и т.д. Это сэкономит Вам уйму времени, если надумаете использовать их потом еще в других проектах.
Создаём новый материал Smoke и настраиваем его по образу и подобию материала огня с той разницей, что используем немного другой шейдер и другую текстуру.
Вводим параметры, как показано на рисунке 008.
ИСКРЫ.
Искры, по сути, тот же клонированный огонь с измененными параметрами и другим материалом. Назовем этот эмитер Spark. Настройки для него показаны на рис. 012.
Текстуру можете сделать в Фотошопе – это маленькая точка или точка с небольшим свечением вокруг. Размер текстуры, как я уже говорил в начале 16х16 или около того. Шейдер – Particles/Additive.
ГОРЯЧИЙ ВОЗДУХ.
Здесь опять тот же хорошо настроенный, клонированный и чуть модифицированный эмитер огня, но все дело делает шейдер, который по дефолту не идет с Юнити. У нас он был написан нашими программистами для проекта. Думаю не составит труда найти подобный шейдер в инете.
В завершение хочу добавить, что нет предела совершенству и можно добавить еще несколько украшательств нашему бочечному огню. Например глоу эффект вокруг огня, анимированный источник света с отбрасыванием теней. Еще какие то вещи на Ваш вкус. Но все это увеличивает нагрузку на видеокарту, так что будьте разумны и исходите из реальных условий и требований .
Ну и финальный результат смотрите на видео:
Да, с появлением Сюрикена, работать с частицами в Юнити стало удобнее и приятнее) Хороший урок, многим будет полезен.
Недавно мы рассказали о том, как научиться разработке игр на Unity . Продолжим тему на практике и покажем, как новичку создать на этой платформе первую 2D-игру.
Если вы хотите получить более систематическое образование в области разработки игр, мы рекомендуем рассмотреть факультет разработки игр онлайн-университета GeekBrains.
Двумерные игры сравнительно просты: для них не требуется сложных 3D-моделей, программный код по сравнению с 3D-проектами выглядит понятнее. Такие игры популярны как на десктопах, так и на мобильных устройствах. Unity также позволяет разрабатывать игры и для браузеров.
За последние годы вышло много популярных двумерных игр:
Программная реализация 2D-игр проще не только из-за отсутствия третьего измерения: на самой сцене меньше объектов, вместо трехмерных моделей плоские спрайты, вместо скелетной анимации – покадровая. А еще 2D-игры проще портировать на другие платформы – легче найти новую аудиторию.
Давайте создадим простую игру в жанре пинг-понг 🏓 . Перед тем как приступить к созданию игры, продумайте, какой именно результат хотите получить. На первых этапах рекомендуется использовать схематические шаблоны, чтобы быстрее получить работающий результат. В этой инструкции мы так и поступим. Графических ресурсов использовать не будем: и ракетки, и отбиваемый мяч будем пока отображать простыми белыми спрайтами.
Предварительно рассмотрим основные понятия Unity, без понимания которых будет проблематично создать игру:
Предполагаем, что вы уже установили редактор и создали аккаунт на портале Unity.
В первую очередь создадим новый проект и откроем его настройки (Edit → Project Settings). Во вкладке Editor установим параметр Default Behaviour Mode в значение 2D
Настройка проекта Детальная настройка проекта
Следующим шагом сохраним текущую активную сцену, назвав ее, например, Scene1. Теперь создадим основные игровые объекты: ракетку, мяч и менеджер игры, в котором будет храниться основная логика игры.
1. Создаем пустой объект, переименовываем в GameManager.
Создаем пустой объект
3. Создаем квадратный спрайт, называем его Pad (Assets → Create → Sprites → Square). Аналогично создаем круглый спрайт Ball (Assets → Create → Sprites → Circle). Масштабируем спрайт Pad со следующими параметрами – x:0.5, y:2.5, z:1.
Создаем спрайты
4. Создаем префабы для Pad и Ball, после чего добавляем к ним компонент Box Collider 2D (включаем параметр Is Trigger) и компонент Rigidbody 2D (выставляем параметр Body Type в значение Kinematic).
Добавляем .компонент Box Collider 2D Настраиваем.компонент Box Collider 2D Добавляем компонент Rigidbody 2D Масштабируем спрайты
6. Заполняем скрипты следующим кодом.
GameManager.cs Ball.cs Pad.cs
6. Добавляем к префабу Ball и Pad теги с аналогичными именами. Выделив префабы, в инспекторе мы можем видеть выпадающий список тегов. Там же расположены и кнопки для добавления и редактирования тегов.
7. В настройках камеры выставляем параметр Projection в значение Orthographic, а параметр Clear Flag – в значение Solid Color.
Настройка камеры
8. Настраиваем кнопки, как показано на следующих скриншотах (Edit → Project Settings → Input Manager).
Настройка ввода, основное Настройка ввода, первый игрок Настройка ввода, второй игрок
Вот и всё, игра готова!
Пинг-понг, итоговый результат
Билд для платформы Windows
1. Официальный туториал от Unity, где детально рассмотрен процесс создания roguelike RPG.
2. Youtube-канал Brackeys , где можно найти серию видеоуроков по созданию 2D-платформера.
3. Youtube-канал N3K EN содержит множество уроков как по отдельным компонентам Unity, так и полноценные серии уроков по созданию игр с нуля.
Если у вас мало опыта в разработке игр на Unity, мы рекомендуем обратить внимание на факультет разработки игр GeekBrains . Материал хорошо структурирован и содержит все необходимое для того, чтобы стать профессиональным Unity-разработчиком.
В числе прочего вы разработаете 2D-платформер с физическими загадками и динамическим освещением, научитесь портировать его на мобильные устройства. Кроме того, разработаете полноценную браузерную стратегию, а также игру в жанре двухмерных гонок.
По окончании обучения вы будете иметь портфолио из 4 игр, которое можно показать на собеседовании. Если же какая-то часть материала будет непонятна, вы всегда можете обратиться к персональному преподавателю.
Читайте также: