Создайте систему, которая будет генерировать сетку стен и полов из текстового файла.

Цели

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

Затем мой grid_manager прочитает этот файл и сгенерирует из него сетку. Я хочу, чтобы мой grid_manager был достаточно умен, чтобы принимать прямоугольную матрицу любого размера, если в ней есть допустимые теги.

Оттуда мой grid_manager сможет сгенерировать пол с соответствующими игровыми объектами.

Спрайт

Во-первых, давайте просто создадим спрайт стены и превратим его в сборный, как и все остальные мои спрайты.

В целях тестирования я собираюсь придерживаться правила хранить важные вещи в ярких цветах и ​​использовать землистые цвета для неважных элементов игры.

Для моей стены подойдет серовато-коричневый цвет.

Между прочим, я получаю все свои цвета, спамя кнопку случайный выбор на этом веб-сайте, пока не найду то, что мне нужно.

Мы здесь :

Сборный

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

Поместите стены в мою сетку

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

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

Зачем нужна эта реализация?

Я выбрал именно так, потому что могу быть уверен, что такая реализация возможна. У Unity может быть более элегантный вариант, но я не знаю, что это такое.

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

Одна из моих будущих целей - создать веб-портал, где друзья, семьи и фанаты смогут создавать уровни для моей игры с помощью простого редактора сетки. Моя реализация настроена таким образом, что эта цель не будет слишком сложной. Я могу просто создать API, который сможет генерировать текстовые файлы на основе входных данных в редакторе сетки.

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

Как это работает

Мой код стал немного запутаннее, но я сохранил все компоненты такими же и расширил свой игровой объект grid_manager.

Я убрал сериализацию строк и столбцов и вместо этого создал метод, который будет читать локальный текстовый файл по некоторому пути, который я передаю в вызов метода.

Этот метод автоматически определит размер моей матрицы и передаст ее содержимое моему grid_generator.

Этот бизнес по передаче моего пути моему файловому ридеру важен, потому что он позволит мне контролировать, какой уровень я рисую на экране, когда я вызываю свой grid_generator из master_manager.

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

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

С какими неприятностями я столкнулся?

Ну, я использую Ruby на своей повседневной работе, и я почти никогда не использовал C #, поэтому мне потребовалось около часа, чтобы понять, как читать из локального текстового файла в Unity. К счастью, матричный синтаксис C # очень удобен, так что это было несложно.

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

После небольшого исправления ошибок все заработало!

Результат :

Ресурсы, используемые сегодня

Я создал всю сегодняшнюю работу следующим образом:

  1. Официальная документация по C #
  2. Официальная документация единства

3. различные потоки переполнения стека

Это все на сегодня!

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