Создаём 2,5D-игру жанра Dungeon Crawling в Unity

Автор оригинала: Backspace Bouken
  • Перевод
В этой статье мы расскажем, как можно воссоздать старые игры жанра dungeon crawler в Unity.



Eye of the Beholder (1991 год) и SMT If (1994 год)


Базовый ассет «карты» для уровня нашего подземелья.

Большинство dungeon crawler-ов 90-х, в том числе и наш — это листы спрайтов, выстроенные в виде коридора. Хотя с технической точки зрения мы используем 3D-движок, никакие меши не рендерятся. Подземелья — это просто сетки, составленные из разных типов блоков, хранящиеся в карте вместе с данными монстров и объектов.

Чтобы отобразить любую перспективу для заданной координаты [x, y] сетки и направления взгляда игрока, мы можем вычислить, какие фрагменты стен нужно рендерить. Если блок находится непосредственно перед игроком, то нужно показать самую крупную плоскую стену. Если в двух квадратах вперёд и влево есть ещё одна стена, то нужно показать боковую панель, соответствующую этому расстоянию. Каждый блок в определённом радиусе вокруг игрока определяет, какие спрайты видимы.


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

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

Добавьте статический фон, и получите стены с потолком…

Вот как сцена выглядит в Unity...


А вот как она выглядит через ортогональную камеру!

То есть воспользовавшись массивом спрайтов, системой рендеринга на основе сеток и ортогональной камерой, мы получили минималистичный dungeon crawler в 2.5D. Он очень плоский, а движение ограничено тайлами, между которыми игрок по сути телепортируется. Выглядит всё это не очень.

К счастью, движение достаточно легко имитировать, и здесь нам пригодится 3D-движок. Ходьба в Backspace Bouken заключается в кратковременном увеличении текущего кадра, за которым следует возврат и немедленный повторный рендеринг, теперь уже с точки следующего тайла. Небольшое раскачивание камеры даёт ощущение совершения шага вперёд.


Если вы, как и мы, хотите создать множество вариантов фона, то при ходьбе можно случайным образом менять пол.

С ходьбой всё просто, но как насчёт поворотов? С ними труднее.

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


Префабы — это ваши друзья.

Но помните, что мы используем очень точно направленную ортографическую камеру для рендеринга 2D-спрайтов в координатах экрана, поэтому не стоит ожидать, что их можно просто вращать в 3D. Вместо этого мы рендерим каждую структуру в Render Texture и выполняем поворот относительно них.


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

Отрендерим этот вид в ещё одну Render Texture и в UI/кадр, так и получим внешний вид игры. При помощи этой системы можно рендерить и всевозможные объекты, просто помещая их «внутрь» рендерящихся на экране блоков и создав спрайты для каждого из расстояний в блоках.

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

    +1
    Не один час провёл в лабиринтах Eye of the Beholder. Коллеги вдвоём дружной командой проходили — пилот и штурман, зарисовывая карту на миллиметровке, потом находили все секретки, прощупывая каждую стену. Помню персонаж вор отмычками помогал двери открывать.
    Спасибо за перевод.
      +4
      Хотя с технической точки зрения мы используем 3D-движок, никакие меши не рендерятся.

      Смыслиии??? Автор врет, уж простите. Если включить режим отображения wireframe в окне сцены то будет видно, что очень даже рендерятся! Просто они, блин, плоские! Но все еще меши!
      Юнитевские маркетологи только людей путают своим «2D»
        0
        что-то не одной картинки не вижу в статье… их бы на хабр перезалить, не?
          0
          Спасибо, перезалил :)
          0
          Я чот не вкурил почему вместо перспективной камеры используется ортогональная камера + искаженные спрайты… Pixel Perfect? Вроде в Думе так не поступали, искажала все камера + фильтрация… Могу ошибаться конечно
            0
            У меня такой вопрос: разве не проще будет использовать трехмерные объекты с пиксельными текстурами? А мобов легко можно заменить на плоский меш, который напрямую будет направлен к камере и тогда можно не костылить так.
              0
              Тогда у вас пиксели будут не ортогональны экрану.
              Если подключить SRP легко можно было бы рендерить в таргет меньшего размера и потом апскейлить с point фильтрацией до размера экрана. Ну или через постэффект можно, но это менее оптимально. Да и в принципе скейл вверх-вниз не будет хорошо выглядеть так, как заранее прорисованные спрайты.

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

            Самое читаемое