Генератор уровней

Генерируемый уровень в UDK
По мере приближения к необходимости вплотную заняться созданием арта для игры, меня все больше пугает объем работ, который предстоит осилить в одиночку. Чтобы сделать игру продолжительностью хотя бы в 2 часа, нужно воссоздать целый город или по крайней мере несколько полноценных кварталов. Можно, конечно, максимально замедлить передвижение персонажа, создав на пути кучу ловушек, головоломок и препятствий, но игрок может устать от однотипного пейзажа местности или просто надоест месить одних и тех же супостатов. Да и ловушек разнообразных тоже столько не придумать… Все упирается в контент.

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


Все же я, наверное, больше программист, чем кто бы-то ни было еще. Для меня создание генератора уровня — вызов! Мне хочется решить эту задачу, а дубасить тонны контента в 3D-редакторе совершенно не хочется. Я могу это делать, но не хочу :(

Итак, генератор уровней. Что же он должен делать? Вероятно, эту задачу можно разбить на ряд более простых или, скажем так, более отдельных задач. Я сперва попробую решить задачу в двух измерениях — на плоскости. Пусть это будет бесконечный платформер. Далее, по мере роста, можно будет добавить и третье измерение. Тогда мы уже сможем слепить генератор 3D-шутеров от первого лица (FPS) :) Но это будет в лучшем случае через год (да, я оптимист!) :)

Платформер с генерируемыми уровнями на UDK
На данный момент, я вижу три крупных функциональных блока:

  1. Генератор ландшафта
    Он будет создавать пол, по которому будет перемещаться персонаж, стены, всевозможные сооружения, укрепления и укрытия.
  2. Генератор препятствий
    Этот функциональный элемент будет формировать препятствия на пути персонажа исходя из его физических возможностей (скорость бега, высота прыжка, возможность лазать, ползать и т.д.) Также эта система будет отвечать за создание интерактивных элементов (дверей, лифтов и т.д.), и, возможно, за расстановку врагов, если считать врагов препятствием.
  3. Генератор миссий
    Эта система будет отвечать за создание небольших историй-заданий для игрока: кого-то спасти, что-то найти, куда-то проникнуть, что-то охранять и т.д. Здесь мне, возможно, поможет некоторое знакомство с основами искусственного интеллекта в создании лингвистических систем. Как-то я читал небольшую книжку, в которой описывалась технология генерации русских сказок. Советую также ознакомиться с деревьями решений и цепями Маркова :)

Генератор ландшафта

Начал я с самого простого. Как видно из картинки в начале статьи — уже кое-что получилось. Но это действительно самое простое.

За основу я взял абстракцию и назвал ее «Блок». У блока есть входы/выходы. Пока я еще точно не решил, может ли вход быть и выходом и наоборот, но уже совершенно ясно, что блок должен иметь точки, при помощи которых он будет соединяться с другими блоками. Назову их сокетами (sockets). Каждый блок может иметь произвольное число сокетов. У сокета есть направление: вправо, влево, вверх, вниз. Подробнее на рисунке ниже.

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

Блоком может являться что угодно: комната, кусок местности, кусок моста или какой-нибудь линии электропередачи. Наша задача — намоделировать достаточное число блоков для обеспечения разнообразия.

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

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

Если говорить о генерируемых уровнях в контексте конкретного игрового движка (в данный момент — Unreal Engine 3 или UDK), то здесь следует иметь в виду несколько основных моментов. Во-первых, сразу стоит забыть о предрассчитанном освещении. В генерируемом окружении возможно только динамическое освещение. Во-вторых, встроенные алгоритмы поиска пути для NPC (NavMesh, PathNodes) оказываются бесполезными. Нужно сразу готовиться к написанию своих алгоритмов поиска пути в динамическом окружении. И в третьих… Ну, не знаю — время покажет :)

Кстати говоря, в Unity, кажется, можно работать напрямую с текстурами. Это позволит создать еще и генератор текстур для произвольного раскрашивания помещений. В свое время я делал прототип генератора текстур на Flash с применением Pixel Bender. Получалось довольно занятно.

Вообще, задача генерации уровней решаема. Это доказывает огромное количество игр с процедурно генерируемыми уровнями, среди которых известная всем серия Diablo. А чем мы хуже? За работу, товарищи! :)
  • 0
  • 15 ноября 2012, 12:55
  • dimanjy

Комментарии (7)

RSS свернуть / развернуть
+
0
Рандом это интересно с точки зрения программиста, для остальных это выглядит скучно и однообразно. Это всё надоест и примелькается через пол часа игры. Работу дизайнера не заменит не один скрипт.
avatar

Ray

  • 15 ноября 2012, 17:51
+
0
для остальных это выглядит скучно и однообразно
Тогда бы не было столько фанатов Diablo:)

А Вы видели проекты Hellgate London или Torchlight 2? Там и не скажешь, что все это нагенерили.
avatar

dimanjy

  • 15 ноября 2012, 18:02
+
0
На сколько я помню, в диабло рандомными были только подземелья.
Hellgate London играл, вроде как там была довольно «щадящая» генерация, но даже при таком раскладе мне не запомнилось ровном счётом ничего.
Torchlight 2 не пробовал.
В общем я противник рандомных уровней). Всё-таки игра должна быть красивой и запоминающейся, а не бесконечными вариациями одного и того же.

P.S. Я не пытаюсь навязать Вам своё мнение.
avatar

Ray

  • 15 ноября 2012, 21:12
+
0
Да нет, я и сам прекрасно понимаю, что руку творца полностью не заменить бездушной машиной. Просто это, скорее, от безысходности и лени :)

Но с другой стороны, я немного изучал искусственный интеллект и знаком с работами в сфере компьютерного творчества. Именно «компьютерного творчества» — это такой термин. Я даже не представлял, что компьютер на такое способен… Стихи сам пишет, романы сочиняет, картины рисует, музыку создает. В общем, я верю в прогресс.

Ну и сами понимаете, при генерации опять же играет роль база контента. Чем его больше, тем разнообразнее будет игра. Но с генерацией уровней выпустить игру получится раньше. А потом по мере производства арта можно радовать пользователей постоянными обновлениями, незаметно подгружаемыми в процессе.

И вообще, генератор можно использовать не как генератор, а как редактор, упрощающий создание уровней гейм-дизайнером. Вот, взгляните на это видео.
avatar

dimanjy

  • 15 ноября 2012, 21:32
+
0
Интересное видео, в принципе, я таким же макаром собираю уровни (наделал типовых элементов и как конструктор собираю).

«Но с генерацией уровней выпустить игру получится раньше.»
Не факт, кроме контента (как Вы правильно заметили, из бочки и 2х коробок много не сгенеришь) нужно писать и сам генератор.
Тут на самом деле спорно всё это.
И вообще, отпечаток накладывает тот факт, что Вы программист) естественно в 3ds max палкой не загонишь.

У меня есть друг, тоже программист. Так вот он вообще противник всяких интерфейсов, говорит, что намного практичнее вставить нужные значения переменных в самом коде и запустить на выполнение, а не тратить время на разработку интерфейса проги).
avatar

Ray

  • 15 ноября 2012, 22:00
+
0
Еще как вариант полугенерация. Типа ключевые объекты расставляешь на уровне сам, этакие контрольные точки (вход, выход, квестовые точки и т.п.), а остальное пространство между ними заполняется уже автоматически, дорожки между точками рисуются рандомом извиваясь, местами разветвляясь в тупики или замыкаясь в другие такие же дорожки. Пространство между дорожками заполняется рандомными объектами, зданиями, машинками вдоль дорог и прочим контентом. Также спец объектами можно указать области на карте, где должен быть например песчаный ландшафт, или зеленая травка, или должна сгенерироваться гора, или лесок, ну или озеро с водой.
avatar

FinalBoss

  • 20 ноября 2012, 13:28
+
0
А вот и видео в тему :)
www.youtube.com/watch?v=GcM9Ynfzll0
avatar

dimanjy

  • 20 ноября 2012, 16:16

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.