Gamedev
Vlad Koltsov

Генерация уровней в игре как в Soul Knight

Пример генерации карты WhatIsLove

Уровни в игре я решил сделать в виде комнат соединенными мостами. Что-то подобное вы можете увидеть в игре - Soul Knight, только у меня в 3D.
Трудность была в том, что комнаты должны быть разного размера. Сам размер комнат сделать разным задача на одну строчку, а вот соединить их между собой оказалось не просто.
Опыта в подобном у меня опыта мало, поэтому решил сделать так как придумал своей головушкой.
В общем поехали!

Начальная комната WhatIsLove

Начинается все с одной комнаты, у которой есть 4 возможных позиции спавна, которые занесены в лист, следующей комнаты. Позиции спавна - красные ромбики.

Спавн одной комнаты WhatIsLove

Когда комната спавнится - позиция удаляется с листа и деактивируется в игровой области(не удаляется) и после в лист заноситься такие-же позиции со второй комнаты. На скрине вы видите 6 возможных позиций для спавна комнаты.
Так можно заспавнить бесконечное количество комнат, пока Unity не скажет вам пока. На видосе в начале их около 30.
Как уже писал у каждой комнаты свой размер и поэтому нужно было вычислять размер моста, который будет соединять комнаты между собой.

Демонстрация объектов для генерации мостов WhatIsLove

Вопрос с мостами я решил так - на краях комнаты есть объекты генерации моста , на стороне созданной комнаты активируется тот самый объект.
На нем включается скрипт и он детектит такой же объект в комнате напротив и после создания моста - выключается. Размер моста равен позиция второго объекта - позиция первого объекта, а позиция - это центр между этими точками.
После полной генерации уровня, все оставшийся позиции спавна и объекты генерации мостов деактивируется, чтобы не засорять мапу.

{ "author_name": "Vlad Koltsov", "author_type": "self", "tags": [], "comments": 25, "likes": 40, "favorites": 130, "is_advertisement": false, "subsite_label": "gamedev", "id": 269217, "is_wide": false, "is_ugc": true, "date": "Thu, 26 Nov 2020 14:07:39 +0300", "is_special": false }
0
25 комментариев
Популярные
По порядку
Написать комментарий...
3

Чёт припоминаю что есть куча готовых алгоритмов для генерации, при этом достаточно мощных, почему бы ими не воспользоваться?

Ответить
21

Потому что если все время пользоваться готовым, то ничего нового крутого не изобретешь. Иногда нужно делать велосипед.
Кодзиме объяснять приходится это, ппц)

Ответить
3

Зачем изобретать молоток? Странная у вас нить рассуждения.

Ответить
–1

Потому что вместо молотка придумали такие штуки как пистолет для гвоздей и т.д. теперь не странно?

Ответить
4

Когда придумывали пистолет для гвоздей пользовались другой логикой. Для решения задачи создавали более современный способ основанный на уже имеющихся и популярных технологиях. Нужно соединять уже созданное в новое, а не мастырить писку из копейки. 

Ответить
0

Не нужно спорить ради спора.

Ответить
7

Готовое зачастую имеет две проблемы: оно или избыточно, или недостаточно. А иногда и то и другое одновременно.

Ответить
3

Либо генератор Вселенной со всеми физическими законами, либо генератор квадрата, третьего не дано.)

Ответить
2

Одна поправка: не зачастую, а, сука, всегда.

Ответить
0

вот это прям жиза)

Ответить
3

Ну у этой задачи на самом деле будет куча вариантов по решению. Автор воспользовался интуитивным решением, оно работает и ему подходит. Почему бы и нет. Со своим решением по крайней мере всегда будет проще работать

Ответить
1

Козя, ты сам воспользовался готовой картой Америки и Ридус у тебя за 10 минут полштата проходил. Не стыдно было после релиза?

Ответить
0

мне захотелось сделать самому, это как раз то что мне нужно ни больше ни меньше. Ну и плюс дальше будет проще дорабатывать.

Ответить
1

Если вы не стеснены временем или ресурсами, это самый верный способ. При всех естесственныфх минусах переизобретений велосипеда, присутствуют весомые плюсы: саморазвитие изобретателя и дружелюбное отношение к будущему переписыванию собственных решений.

Ответить
0

Решения по генерации сильно связаны с особенностями и требованиями игры. Это же не Speed Tree - сгенерил красивое деревце и воткнул как декор.
Для многих решений разбираться и допиливать придется больше, чем пользы получишь.
Не всегда, конечно, нужно смотреть.

Ответить
2

правильно я понимаю, что центры комнат всегда находятся на определенной сетке? (см.скрин) может тогда проще настроить алгоритм именно на генерацию ячеек в такой сетке? в этом случае у тебя будет больше контроля

Ответить
0

Правильно понимаешь ) Вот видео, сначало тестил просто на колайдерах. Можно сказать внутри этих ячеек появляется сама комната. Можно сказать тут все комнаты максимального размера

Ответить
1

Ага, ясно.
По поводу хранения сетки. Сейчас у тебя комнаты добавляются в какой-то список-дерево скорее всего. Из-за этого будет очень сложно добавить дополнительные проходы между комнатами, которые были созданы на разных этапах построения дерева. Мне кажется, именно поэтому у тебя получаются очень длинные ветки-туннели, которые никак между собой не соединены. По геймплею такое очень сложно играется обычно.
Если же хранить именно таблицу i-j, и просто заполнить её ячейками-комнатами, тогда строить проходы между ними можно разными способами и с бОльшим контролем происходящего.
В целом я люблю велосипеды. Поэтому поддерживаю твоё начинание! Буду следить за развитием алгоритма.

Ответить

Комментарий удален

0

скинь проект

Ответить
0

чутка попозже, мейби скину 

Ответить
0

Длинные тупиковые кишки (привет Торгаст) это попытка вывести из себя игрока. Не надо так. 

Ответить
0

Сделал такое количество комнат прост для примера :) Да и в принципе, можно сделать так чтоб игрок сам создавал мосты из комнаты в комнату, как вариант решения.

Ответить
0

побуду токсиком) это самый типичный алгоритм построения тупиковых лабиринтов и алгоритмов таких на ютубе полно. даже с "авторской" идеей про точки спавна.
к сожалению, играть в такое вообще не интересно, я сам так делал на какой-то из джемов. 
только я не делал мостов, не знаю зачем игроку видеть как соединяются эти комнаты. разве что это заложено геймплеем

Ответить
0

Как-то тоже игрался с генерацией комнат. Развивайте дальше концепт. "Мост" это всего лишь условность, он же является комнатой. Которому можно менять размеры вторым проходом генерации. А ещё "мост" можно использовать для объединения комнат в одну... Удачи

Ответить
0

Насчёт объединения комнат спасибо, неплохая идейка )

Ответить

Комментарии

null