Game-Ready моделька по концепту
После ухода с Атомика появилось время доделать свои проекты.
Так же, веду блог в телеге по разработке игр и советам в арте, залетайте: @Cod3Art
Artstation: https://www.artstation.com/artwork/EvR2KA
После ухода с Атомика появилось время доделать свои проекты.
Так же, веду блог в телеге по разработке игр и советам в арте, залетайте: @Cod3Art
Artstation: https://www.artstation.com/artwork/EvR2KA
Это продолжение поста Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля, ч.1
Дисклеймер: игра была написана как простенькая, но познавательная демка именно для PowerVR MBX и именно для Axim X51v. Именно поэтому здесь нет нормального Update-таймера, расчёта дельты времени, а игра прибита к константным временным отрезкам и величинам скорости!
Итак, как же игры подобного планы работают «под капотом»? По факту, обычно мы с вами никуда не едем: фоновые модели ландшафта и дороги просто скроллятся и телепортируются друг за другом, когда одна из частей уходят за экран, что создаёт эффект бесконечной дороги. И эта техника используется во многих играх! Что же касается машинок, от которых мы должны лавировать, то это не мы едем на них, это они едут на нас! По итогу создаётся эффект будто мы с вами куда-то едем и уворачиваемся от машинок, хотя на деле это не так!
Начинаем с реализации базовой вещи в архитектуре любой современной игры, а именно системы игровых объектов. В нашей игре нет необходимости в реализации сложного графа сцены с комплексной компонентной системой, или, например, ECS. Хватит классического линейного списка игровых объектов (который использовался, например, в Half-Life), по которому объект World проходится каждый кадр, вызывая необходимые функции для обновления состояния объекта и его отрисовки:
public abstract class Entity
{
public Transform Transform;
public abstract void Update();
public abstract void Draw();
}
public void Spawn(Entity ent)
{
if(ent != null)
Entities.Add(ent);
}
public void Remove(Entity ent)
{
entityRemovalList.Add(ent);
}
public void Update()
{
sky.Update();
renderer.Update();
spawner.Update();
foreach (Entity ent in Entities)
ent.Update();
foreach (Entity ent in entityRemovalList)
Entities.Remove(ent);
entityRemovalList.Clear();
}
public void Draw()
{
sky.Draw();
renderer.Draw();
foreach (Entity ent in Entities)
ent.Draw();
}
Самым первым нашим объектом будет машинка игрока, которой можно будет управлять!
Модельки я взял лоуполи со скетчфаба, вот ссылка на ВАЗ 21099 и VW Golf Mk2. Спасибо авторам моделей за их работу!
Наследуемся от Entity и реализуем абстрактные методы с логикой объекта. Здесь мы получаем состояние аппаратных кнопок влево и вправо, в зависимости от них вычисляем направление поворота машинки и, собственно, поворачиваем машинку путём сложения с координатой X вычисленного направления, помноженного на «скорость» поворота машинки. Для лучшего визуального эффекта, мы также плавно поворачиваем машинку эффектом а-ля EaseIn/EaseOut:
float hVel = Engine.Current.Input.GetKeyState(GamepadKey.Left) ? -1 : (Engine.Current.Input.GetKeyState(GamepadKey.Right) ? 1 : 0);
Transform.Position.X += hVel * SteerSpeed;
Transform.Rotation.Y = MathUtils.lerp(Transform.Rotation.Y, 180 + (hVel * 35), 0.1f);
Теперь нам нужно, чтобы машинка где-то «ездила». Для этого мы моделируем в блендере примитивный кусок дороги с элементами ландшафта:
А затем реализуем примитивный рендерер фона, который будет скроллить два одинаковых seamless-куска уровня и как я уже говорил ранее, просто телепортировать их друг за другом, создавая эффект бесконечности.
public SectorRenderer()
{
road = Model.FromFile("road.mdl");
roadMaterial.Diffuse = Texture2D.FromFile("road.tex");
terrain = Model.FromFile("terrain.mdl");
terrainMaterial.Diffuse = Texture2D.FromFile("grass.tex");
sector1.Position.Y = -4;
sector2.Position.Y = -4;
sector2.Position.Z = SectorSize;
}
public void Update()
{
sector1.Position.Z -= ScrollingSpeed;
sector2.Position.Z -= ScrollingSpeed;
if (sector1.Position.Z + SectorSize < 0)
sector1.Position.Z = SectorSize;
if (sector2.Position.Z + SectorSize < 0)
sector2.Position.Z = SectorSize;
}
public void Draw()
{
Engine.Current.Graphics.DrawModel(road, sector1, roadMaterial);
Engine.Current.Graphics.DrawModel(terrain, sector1, terrainMaterial);
Engine.Current.Graphics.DrawModel(road, sector2, roadMaterial);
Engine.Current.Graphics.DrawModel(terrain, sector2, terrainMaterial);
}
Где terrain.mdl — окружающий ландшафт, а road.mdl — собственно, сам меш дороги. Получаем вот такой эффект:
Артефакты на видео — следствие проблем с точностью float у MBX Lite в процессе клиппинга геометрии при ближней плоскости отсечения в 0.1f. Меняем на 1.0f и всё снова работает нормально :)
Чуть изменяем проекцию, переместив камеру выше и наклонив на 45 градусов и игра уже похожа на Traffic Racer!
Переходим к реализации машин трафика. Модельки их машин будут загружаться при старте игры:
private static void LoadTrafficModel(int idx, string name)
{
PreloadedCars[idx] = Model.FromFile(name + ".mdl");
PreloadedMaterials[idx].Diffuse = Texture2D.FromFile(name + ".tex");
}
public static void Preload()
{
PreloadedCars = new Model[1];
PreloadedMaterials = new Material[1];
LoadTrafficModel(0, "traffic1");
}
А сама их логика предельно проста. При спавне, машинка выбирает себе полосу, по которой будет ехать и рандомный множитель скорости, который вносит разнообразие в игру:
Rand rand = new Random();
Transform.Position.X = Game.Current.world.PickLane(rand .Next(0, 4));
Transform.Position.Y = Game.Current.world.Player.Transform.Position.Y;
Transform.Position.Z = rand .Next(ZOffset, ZOffsetMax);
selectedBias = rand.Next(0, SpeedBias.Length - 1);
int carModel = rand .Next(0, PreloadedCars.Length - 1);
model = PreloadedCars[carModel];
material = PreloadedMaterials[carModel];
А при обновлении, машинка просто продолжает ехать вниз! Логика простая до жути, даже без перестроений.
Transform.Position.Z -= BaseSpeed * SpeedBias[selectedBias];
Переходим к обработке столкновений. Помним, что мы на этапе конвертации моделей посчитали Axis Aligned Bounding Box для каждой модели? В качестве алгоритма мы будем использовать классический AABB — или Rect vs rect:
public bool Intersects(BoundingBox box)
{
return (X < box.X + box.X2 && Y < box.Y + box.Y2 && Z < box.Z + box.Z2 && box.X < X + X2 && box.Y < Y + Y2 && box.Z < Z + Z2);
}
Теперь для проверки столкновения между ними, нам надо посчитать абсолютный Bounding Box для каждого игрового объекта:
Bounds = model.Bounds;
Bounds.X += Transform.Position.X;
Bounds.Y += Transform.Position.Y;
Bounds.Z += Transform.Position.Z;
Затем итерируемся по списку всех игровых объектов в сцене, и если у нас есть машинка трафика, то проверяем на столкновение с машинкой игрока. Если столкнулись, то помечаем машинку игрока как разбитую и предлагаем игроку рестартнуть игру.
foreach (Entity ent in Game.Current.World.Entities)
{
if (ent is TrafficCar)
{
if (Player.Bounds.Intersects(((TrafficCar)ent).Bounds))
{
// TODO: Damage logic
Player.IsDestroyed = true;
}
}
}
Уже что-то немного похожее на игру. Добавим конечное препятствие — необходимость рестарта при столкновении с другой машинкой и для демки пока-что хватит.
public void Draw()
{
string scoreFmt = string.Format("Score: {0} x{1}", Game.Current.world.Statistics.Score, 1);
Engine.Current.Graphics.DrawString(scoreFmt, 15, 15, StatsColor);
if (Game.Current.world.Player.IsDestroyed)
{
int measure = Engine.Current.Graphics.MeasureString(RestartString);
Engine.Current.Graphics.DrawString("Press Return to restart", Engine.Current.Graphics.ViewWidth / 2 - (measure / 2), Engine.Current.Graphics.ViewHeight / 2, StatsColor);
}
}
Вот что у нас получилось:
Правда, что на МКАДе каждый вечер такое? Я просто не с МСК :)
Вот такой у нас получился материал про PowerVR MBX! С выходом iPhone, этот GPU дал толчок для появления красивых мобильных игр с уровнем графики, близким к полноценным домашним консолям… жаль, что золотая эра интересных, самодостаточных и бездонатных мобильных игр и закончилась во времена iPhone 5 :(
В остальном же, надеюсь материал был достаточно интересен и познавателен для всех моих читателей, даже тех, кто никогда не программировал игры! Был у вас Dell Axim X51v? Пишите в комментариях!
Исходный код демки и бинарники можно найти на моём гитхабе.
Материал написан при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud , чтобы не пропускать новые статьи каждую неделю! А ещё у меня есть своя телега, куда я публикую бэкстейдж статей и вовремя публикую ссылки на новый материал!
А ещё я собираю деньги на проект с уже настоящим, физическим ТАЗом и его электронным дооснащением бортовым компьютером "по самому дешману" своими руками! Уже собрано 50.000 рублей из планируемых 70.000 на машину, из них 45.000 моих личных сбережений и 5.000 рублей - помощь читателей, за что вам большое спасибо :)
Fantasy Interior Environment - фэнтези среда
Функции:
Высокое внимание к деталям
Уникальные концепции активов
Высококачественные активы
Готово к игре / Оптимизировано
Управляемые параметры в экземплярах материалов
Количество уникальных сеток: 182
Столкновение: Да. Сделано внутри ЕС
LOD: Да, до 4 LOD
Количество материалов и экземпляров материалов: 181
Количество текстур: 485
Разрешение текстур: 1K, 2K
Поддерживаемые платформы разработки:
Окна: Да
Мак: Да
Stats & Achievements Integration - интеграция статов и ачивок в игру.
Технические детали
ВАЖНО
Этот плагин безопасно использовать на клиенте, в отличие от WebAPI. Этот плагин не будет работать должным образом без правильной настройки статистики и достижений в вашей учетной записи Steamworks, связанной с вашим идентификатором приложения Steam. Вы можете протестировать этот плагин с ограниченной функциональностью, используя Spacewar AppID (480). Пожалуйста, используйте документацию и примеры содержания в качестве руководства; однако для работы с вашим личным AppID Steamworks может потребоваться некоторая настройка Blueprints.
Требует:
ОнлайнПодсистема
OnlineSubsystemUtils
ОнлайнПодсистемаSteam
Они уже должны быть предустановлены вместе с движком и автоматически включаться, как только вы включите плагин в своем проекте.
Содержимое плагина
Количество уровней: 1
Количество чертежей: 2
Количество классов C++: 8
Поддерживаемые целевые платформы сборки: Win64, Win32.
Replicated Building System - системы создания реплик (сам не совсем понял суть) )
Технические детали
Функции:
Поддержка одиночной или многопользовательской игры!
Вы можете вращать свой предмет
Вы можете сбросить ротацию вашего предмета.
Вы можете брать свои вещи туда и обратно
Вы можете увеличивать или уменьшать масштаб предмета для своего персонажа.
Вы можете установить пределы увеличения и уменьшения масштаба.
Вы можете настроить автоматическую привязку вашего предмета
Вы можете отфильтровать свой элемент для автоматической привязки.
Вы можете легко изменить настраиваемые допустимые и недопустимые материалы.
Вы можете легко изменить допустимые и недопустимые цвета.
Количество чертежей: 9
Реплицация по сети: Да ✔️
Поддерживаемые платформы разработки: Windows, Mac.
Поддерживаемые целевые платформы сборки: Windows, Mac, Linux, Android, iOS.
Advanced CRT TV - VCR - VHS Effects - Эффект CRT экрана и ВХС... для тех кто помнит))
Технические детали
Общие эффекты: хроматический, расстояние, эмиссия, интенсивность/яркость экрана, шероховатость, множитель, насыщенность/ненасыщенность, интенсивность вертикального трассировочного луча, повторение вертикального трассировочного луча, скорость вертикального трассировочного луча, количество виньетирования.
Эффекты развертки: количество разверток, интенсивность развертки, четкость нечетной развертки, скорость вертикального сдвига развертки.
Масштаб экрана: Масштаб экрана (горизонтальный), Масштаб экрана (вертикальный)
Качество сигнала: случайная частота горизонтального смещения, случайная сила горизонтального смещения, частота скачка экрана, интенсивность скачка экрана, интенсивность белого шума, шкала белого шума.
Эффекты видеомагнитофона: интенсивность цветового торнадо, плотность шума слежения, уровень шума слежения, шкала шума слежения, плотность Warp BeltInt
Монохромный экран: черно-белый или зеленый экран, монохромный экран
Настройки люминофора: соотношение фосфора (X/Y), масштаб люминофора, видимость люминофора, маска слота/маска тени
Пикселизация: масштаб пикселизации, переключатель пикселизации
Метка времени: Райто метки времени (X/Y), Масштаб метки времени, Непрозрачность метки времени, Сдвиг метки времени (по горизонтали), Сдвиг метки времени (по вертикали).
Обновление за январь 2021 года!
Искажение сигнала
Этот новый эффект добавляет на экран искажение красного цвета. Например, плохой прием сигнала антенны.
Бочковое искажение
Эти параметры добавляют настраиваемую бочкообразную форму искажения и фальшивое стеклянное отражение на экране.
Stylized Modular Crystal Mine - стилизованная шахта кристаллов
Технические детали
Функции:
70 статических сеток
Огонь и летающие частицы FX
Процедурная листва для расположения кристаллов.
Чертеж огромных цепей с использованием сплайнов
Схема рельсов с вагоном, следующим по шлицу
Каждый ассет имеет коллизию, лоды и карту освещения.
Модульные шахтные туннели
Настраиваемые кристаллы
Рудные породы
Количество уникальных сеток: 65
Столкновение: Да, генерируется автоматически и для каждого полигона.
ЛОДы: Да
Количество материалов и экземпляров материалов: 12 материалов и 39 экземпляров материалов.
Количество текстур: 99
Разрешение текстур: 1к,2к
Окна: Да
Мак: Да
Данная работа сделана на Онлайн-курсе "С разбега в Синематик" | JCenterS Это шуточная реклама курса @rsakutin С Нуля до Junior за ОДНО видео, надеюсь это видео ни кого не обидит. Сюжет повторяет рекламный ролик Restoration: 1984 Super Bowl APPLE MACINTOSH Ad by Ridley Scott Сайт курса https://jcenters-courses.com/courses/ Ссылка на ролик @rsakutin https://www.youtube.com/watch?v=YKf1Yo58RYA&t=518s #cinematic #macintosh #apple #1984 #junior #tutorials #unity #unrealengine5
Делитесь в комментариях, какие курсы вы проходили и были ли вам они полезны в жизни.
Мы решили сделать игру, где можно будет и постреляться один на один, просто повыживать, и постреляться с бандитами. Мы совместили несколько хороших игр, и получили уютный выживач с другом.
Атмосфера в игре, в дождь
Игра демки не имеет, зато на главной странице очень много интересных гифок! Вышла она относительно недавно, и сама игра уже почти готова.
Пока записывал эти гифки, наиграл 4 часа, с другом время прошло быстро)
Посмотреть игру - *клик*
Друг наезжает на мою мину
Игра, где вы сможете выживать, сражаться с зомби и бандитами, а также все это делать вместе с другом!
Всего в игре присутствует 3 режима,
1) выживач.
2) 1 vs 1 с другом ( играть можно в 3-ем ).
3) копия игры ready or not (но называется ready or no ).
Я отошел поесть
В игре есть квесты, их правда не много, зато сам мир я считаю наполненным, и в 3 режимах играется шикарно.
На обложку потратил 5000, но я ожидал за такие деньги другого результата, потому что я бы с опытом работы в год сделал лучше.
Но трейлер получился неплохой)
Сел в машину друга
Работали мы над ней вместе, сейчас активно ведем работу над новым проектом, поэтому ждем всех в стиме)
В стиме вы можете посмотреть трейлер этой игры, атмосферные скриншоты, и много интересных гифок!
Приветствую! Меня зовут Максим.
Я работаю в сфере 3D-моделирования персонажей уже 4 года. Хотя мне еще не довелось поработать над крупными проектами, я нацелен на это. Мои работы можно увидеть на Artstation: https://www.artstation.com/drethamore и в моем дневнике по моделированию на ВКонтакте: https://vk.com/drethamore_3d.
Приглашаю начинающих присоединиться к процессу разработки 3D-персонажей. Я готов провести вас от начала и до конца этого творческого пути: от создания концепции до окончательного рендеринга. Помимо технических навыков, успех в этой области зависит от вашей самодисциплины. Я не ставлю жестких сроков и не обещаю мгновенных успехов. Весь процесс обучения будет основан на вашем темпе и усилиях. Обучение абсолютно бесплатное, я делаю это с удовольствием (за исключением, конечно, возможных пожертвований).
Зачем мне это надо? Я хочу попробовать себя в роли наставника и развить soft-скилы. Прошедший мной путь в мире 3D-моделирования был полон ошибок, и я убежден, что лучше учиться на чужих неудачах, чем делать их самому. Моя цель — помочь вам преодолеть преграды, которые могут возникнуть, и научить создавать собственные произведения искусства. В процессе обучения я буду предоставлять вам необходимые материалы и руководство, а также предлагать личные проекты. Вы также познакомитесь с такими программами, как Blender, ZBrush, Marmoset Toolbag, Photoshop, Substance Painter, PureRef.
В ходе обучения вы найдете свою специализацию, будь то создание органических существ (монстров, зверей, животных) или работы с персонажами в различных стилях (киберпанк, стимпанк, дизельпанк и т. д.).
У меня нет опыта преподавания, поэтому я буду учиться вместе с вами.
Что я требую от вас: желание учиться и стремление стать 3D-художником по персонажам в индустрии GameDev.
Что я предлагаю: полезные материалы, личные проекты для закрепления знаний и четкий план обучения.
Если вы еще не передумали, давайте обсудим детали в Telegram: https://t.me/drethamore.
Здравствуйте, меня зовут Максим!
Я 3D Character Artist с 4 летним опытом. К сожалению, я не успел поработать с топовыми проектами, но я стремлюсь к этому. Artstation: https://www.artstation.com/drethamore.
Дневник по моделированию: https://vk.com/drethamore_3d
Приглашаю новичков и продвинутых пользователей, тех, кто не знает, куда двигаться, принять участие в разработке 3D персонажей. Я проведу вас, за ручку, до конечной разработки 3D персонажей, начиная концептом заканчивая рендерами. Не обещаю, что вы найдёте работу и что вы станете сразу делать шедевры. Это зависит всё от вашего упорства. Сроками никого не гружу. Всё делаете сами, в зависимости от накопленных сил. За обучение не возьму и копейки. Всё делаю в удовольствие. (ну кроме пожертвований:) )
Зачем мне это надо? Хочу испытать себя в роли наставника и прокачать soft скилы. Я прошёл через множество ошибок и знаю, что лучше поучиться на чужих ошибках, нежели получать их самому и в одиночку. Моей задачей будет: провести вас по полному пайплайну, сломать барьер, который не даёт вам моделировать самому и научить делать свои творения. Вы будете обучаться сами, а я буду направлять, давать нужные и полезные материалы (взятые с интернета) и предлагать личные проекты. Изучите обязательные программы: Blender, ZBrush, Marmoset ToolBag, Photoshop, Substance Painter, PureRef.
В процессе обучения, вы выберите свою нишу. Возможно, вам захочется углубиться в органику (Создавать монстров, зверей, животных) или остаться и делать людей с разными стилями(киберпанк, стимпанк, дизельпанк...)
У меня нет опыта в наставничестве, поэтому я буду учиться также, как и вы).
С Вас потребуется: Желание учиться (именно по направлению: 3D художник по персонажам в сфере GameDev)
С меня: полезные и пошаговые материалы и личные проекты для закрепление знаний
Если Вы ещё не передумали и готовы "страдать" (в хорошем смысле), можем обсудить детально в телеграмме(https://t.me/drethamore).
Промо код : LOWLYPOLY
Мегапак «Стилизованные космические корабли» со стилизованными текстурами, которые можно добавить в любой игровой проект.
Функции:
14 космических кораблей
Polycount от 2630 до 25000
Стилизованное текстурирование
2048x2048 пикселей.
Готовность к мобильному/PBR
Промо код : LOWLYPOLY