Какие есть инструмерты для создания 2Д мира игры с видом сверху, не pixel art?
Привет всем, где то 3 месяца назад начал работать над своей первой игрой в 2д с видом сверху, до этого не было опыта программирования, только не оконченные курсы по Python на Яндекс. Начал разрабатывать на Godot 4, писал физику и механики игры, вроде пасивок, скилов, дебафов, древа навыков, системы наведения скилов, и тд. написал уже порядка 4к строк кода, и начал создавать наполнение, искал всевозможные ассеты в магазинах, но там везде один пиксель арт, а хотелось более красивых реалистичных текстурок для мобов и перса, тогда я начал покупать ассеты в asset store UE, выгружать их в блендер и там под разными ракурсами рендерить в пнг спрайты для 8 направлений персонажа, монстров и тд. Получилось красиво, то что нужно. Но теперь мне уже пора начинать разрабатывать игровой мир, локации, а так как модельки у меня красивые будут то и мир должен быть более менее. Я пробовал рисовать тайлами, но у меня совсем не получается, и учиться этому мне будет слишком долго чтобы создать что то внятное. Я пришел к двум выводам, что нужно либо изучать инструменты процедурной генерации и рисовать все это, либо купить так же в ассет сторе подходящий ландшафт и сделать его 2Д. Я начал пробовать второй вариант, нашел подходящий ландшафт, но просто не могу понять что с ним делать:
1) на ландшафте колышется трава, облака плывут и кидают тень, течет ручей, если я все это сделаю пнг картинкой то оно будет все застывшее как фото. Если я сделаю всю эту карту 2Д спрайтом анимированным, оно будет неймоверно огромного разрешения и взорвет комп или телефон. Как мне быть?
2) Я пробовал загрузить эту локацию в Blender, с горем пополам загрузилось, там я уже умею выставлять камеру рендерить в PNG и ещё по мелочи, но она загружается без текстур и материалов, просто серебристая модель, как это исправить? Можно ли как то вшить в UE текстуры в модель? Потому что в ручную перебирать огромное множество травы земли камней чтобы найти и подключить к ним соответствующие материалы и текстуры, это будет боль на осень очень много времени.
@calculator212, в идеале хотелось бы что то вроде этого рисованного. Только по мрачнее.
Ну или каким то образом преобразовать купленный ландшафт из UE, сделать в нем анимированные траву и речку, добавить эффект обводки как в Blender и получить что то типо ландшафта из Диабло 4 (стиль) только с эффектом обводки.
mayton2019, ну я думал тут есть люди с опытом разработки игр, инди команды, может кто то занимался переделыванием 3д модели в 2д карту или знает какие нибудь инструменты и решения для того чтобы сильно упростить эту задачу
iRusher, в общем ты немного неправильно задал вопрос. Тебе нужно искать темы с изометрией, есть старое видео с примером того как ассеты натягивают клик, как из ue/unity трафнсформировать наверное есть гайды. В общем на юутубе вбей "godot isometric" и ищи что подойдёт. Видосов с графикой как на первой картинке довольно много, с графикой как на второй поменьше, но что-то можно найти
iRusher, Первый скриншот — просто набор изометрических спрайтов, которые рисуются с соответствующей сортировкой (обычно там есть нюансы по корректировке ошибок сортировки, но это уже частности, а в целом — так). Собирать (собирать, не рисовать) подобные карты можно в любом подходящем редакторе. Например, Tiled. Рисовать спрайты — в абсолютно любом графическом редакторе.
Либо, если карта допускает тайловость, то однозначно нужно использовать изометрический тайлинг. Если делать не тайлами, а большими изображениями (но не тот вариант, что выше), то это будет занимать огромное количество памяти. Тем более, если ещё и с анимацией. Геймдев неразрывно связан с оптимизацией.
> рендерить в пнг спрайты для 8 направлений персонажа, монстров и тд.
Тут зависит от деталей (размеры персонажей, количество кадров и т.п.), но есть высокая вероятность, что вместо этого просто использовать 3d модели в игре было бы лучше. Иначе одни только персонажи могут занимать буквально гигабайты памяти. Насколько знаю, годот позволяет использовать 3d модели в 2d играх.
Что касается второго вопроса — просто научитесь то же самое делать в анриле, а не в блендере. Выставление камеры, настройка материалов, чтобы просто отрендерить — это делается достаточно элементарно.
И ещё. Первый скриншот — это полное 2d. А второй скриншот — это уже 3d. Не пытайтесь сделать второй вариант технологиями 2d. Хотя технически это (близкое к нему) и возможно, но, как ни странно, это потребует высокого уровня скиллов и при этом будет занимать слишком много места — явно не ваш вариант.
Дмитрий, У меня 1024-1024 текстуры в 25 кадров используются для анимации персонажа и врагов, чтобы было достаточно плавно, один кадр анимации весит для персонажа в среднем 400 килобайт, 250-300 килобайт весит кадр некоторых скилов, врагов стараюсь держать в пределах 200 кб кадр. Но везде +- 20-25 кадров в анимации, со скоростью 20-25 фпс.
Я уже столкнулся с тем, что отрендерил персонажа в 2к разрешении, 30 кадров на анимацию, там примерно 1мб весил один кадр, когда запустил в редакторе Godot проект, там наблюдались подлагивания каждые 2-3 сек, если запускал проект не из редактора то лагов не было, но суть я тогда еще понял, что нельзя просто так рендерить в огромном разрешении 2Д спрайты как вздумается.
Читал что в диско элизиум делали как раз 2Д задники, но они поделили это изображение на квадраты 1024 на 1024 и написали логику, которая не загружает эти изображения, а рендерит только в определенном радиусе эти квадраты, таким образом они смогли добиться что эти изображения локации не грузят слишком много, я думал сделать нечто вроде этого..
Я кое как смог добиться того чтобы выставить камеру в UE5 и сделать прозрачным фон, а потом рендерить эффекты скилов, теперь я всё что есть загружаю туда и рендерю от этой камеры, но с локацией сложнее ситуация, я не могу просто отдалить камеру максимально далеко и отрендерить весь остров, во первых я пробовал)) И у меня закрылся UE и сказал что не хватает памяти (RTX 4080 Super 16GB), во вторых у меня камера искажает изображения, там же есть эффекты глубины, а мне нужен изометрический вид в котором нету искажения пространства в зависимости от удаления от центра перспективы. Рисовать тайлами я пробовал, у меня получилось не очень, проблема еще в том, что мои спрайты из 3Д моделей выглядят четкими и реалистичными, поэтому мне нужно в этом же стиле получить ландшафт.
Пример спрайта.
"Первый скриншот — просто набор изометрических спрайтов. "
Я в курсе что деревья и домики это спрайты, мне по этой части очень всё понятно, мне здесь больше интересен ландшафт, да и эта картинка наверное минимально что я хотел бы получить от графики в игре, как максиум корректный пример это Beautiful Desolation только чуть более мультяшное, там тоже 2Д задники сделанные из 3д модели, в интервью разработчики об этом говорили, самый простой способ для меня был бы взять готовую 3Д модель какого нибудь ландшафта и получить его в изометрическом виде 2Д внутри движка UE5, попробовать реализовать логику по оптимизации в Godot 4, потому что нарисовать что-то приличное я точно не смогу, да даже из тайлов собрать.
iRusher, По размерам занимаемой памяти текстур/анимаций. Нужно учитывать один очень важный момент — то, в каком формате текстуры хранятся в видеопамяти. И нередко это argb32. То есть, если вы в движке добавили png 2024×2048, занимающую, к примеру, 200 кб, то в памяти видеокарты она будет занимать уже 16 МБ. Если же это будет какой-нибудь сжатый формат (dxt1/3/5), то размер может быть в районе 4 МБ.
Поэтому гораздо выгоднее использовать настоящие 3d модели — хотя они и рисуются медленнее, чем спрайты, памяти они занимают на порядки меньше. А вот по производительности как раз это не особо критично (конечно же, если использовать нормально оптимизированные модели — если же засунуть хайполи/мидполи, то это может оказаться весьма чувствительно).
Ещё один момент, который сто́ит держать в голове (на всякий случай упоминаю про это) — крайне желательно все размеры текстур делать кратными степени двойки. 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096. Потому что только часть железа умеет работать с произвольными размерами текстур (но даже в этом случае это будет снижать производительность). А всё, что не поддерживает, будет увеличивать размер текстуры до ближайшей степени двойки. То есть, загрузили текстуру 1025×1025 пикселей, а в видеокарте она станет уже 2048×2048 (добавится пустое пространство справа и снизу).
Читал что в диско элизиум делали как раз 2Д задники, но они поделили это изображение на квадраты 1024 на 1024 и написали логику, которая не загружает эти изображения, а рендерит только в определенном радиусе эти квадраты, таким образом они смогли добиться что эти изображения локации не грузят слишком много, я думал сделать нечто вроде этого..
Да, именно такой вариант и возможен. Но это подразумевает асинхронную загрузку текстур в реальном времени. Не сказать, что какая-то прям сложная задача, но точно не для новичков.
я не могу просто отдалить камеру максимально далеко и отрендерить весь остров, во первых я пробовал))
Нет, нужно выставить камеру в левый верхний угол карты, отрендерить, передвинуть камеру правее, отрендерить, передвинуть ещё правее, отрендерить.. Таким образом отработав всю ширину, затем сдвинуть камеру ниже и повторить всё то же самое. Есть и готовые плагины для этого.
камера искажает изображения, там же есть эффекты глубины, а мне нужен изометрический вид в котором нету искажения пространства в зависимости от удаления от центра перспективы.
Переключите камеру в ортогональный режим.
мне здесь больше интересен ландшафт,
С ландшафтом там всё то же самое — он состоит из таких же спрайтов.
Нет, нужно выставить камеру в левый верхний угол карты, отрендерить, передвинуть камеру правее, отрендерить, передвинуть ещё правее, отрендерить.. Таким образом отработав всю ширину, затем сдвинуть камеру ниже и повторить всё то же самое. Есть и готовые плагины для этого.
Искал вроде плагины в эпик сторе, ничего подобного так и не нашел, если не затруднит скиньте название..
Да, именно такой вариант и возможен. Но это подразумевает асинхронную загрузку текстур в реальном времени. Не сказать, что какая-то прям сложная задача, но точно не для новичков.
В любом случае мне будет легче сделать это, чем нарисовать, я вроде и новичок, но как-то уже +-4к строк кода в своей игре написал для различных механик и физики, да и предстоит ещё написать не меньше явно, если выбирать между тем чтобы научиться рисовать кое как, и получить красивые ландшафты но разработать решение для оптимизации, я бы выбрал второе)
Ещё один момент, который сто́ит держать в голове (на всякий случай упоминаю про это) — крайне желательно все размеры текстур делать кратными степени двойки. 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096. Потому что только часть железа умеет работать с произвольными размерами текстур (но даже в этом случае это будет снижать производительность). А всё, что не поддерживает, будет увеличивать размер текстуры до ближайшей степени двойки. То есть, загрузили текстуру 1025×1025 пикселей, а в видеокарте она станет уже 2048×2048 (добавится пустое пространство справа и снизу).
Большое вам спасибо за ценную информацию, я к слову вообще на это не обращал внимание, и точно помню что у меня есть и 960х960 и 742х742 в проекте, нужно будет все перерендерить... Вообще конечно это не очень хорошая новость для меня, ведь 512 и 1024 большой разбег, при определенном размере спрайта 1024 может быть слишком много, а 512 будет мыло.
Поэтому гораздо выгоднее использовать настоящие 3d модели — хотя они и рисуются медленнее, чем спрайты, памяти они занимают на порядки меньше. А вот по производительности как раз это не особо критично (конечно же, если использовать нормально оптимизированные модели — если же засунуть хайполи/мидполи, то это может оказаться весьма чувствительно).
Я уже не один раз понял, что мне намного проще было бы решить некоторые моменты если бы я делал игру в 3Д, но я делаю игру с множеством механик, ARPG ориентированную на магию, билды и всякое такое, с управлением скилами как в доте, и поэтому выбрал Godot, потому что python-подбный язык стал для меня простым в освоении, если бы я начинал учиться в UE, сомневаюсь что у меня бы получилось с моим около нулевым уровнем программирования написать так много всего.