Редактор карт

Функционал

  1. Выбирать размер уровня. Количество ячеек по вертикали и горизонтали. Дефолтное значение 10х15.
  2. Назначать дефолтный тайл, который заполняет всё пространство уровня. Чтобы один уровень, где больше поля, а другой где больше океана.
  3. Выбирать текущий активный тайл из списка доступных в игре типов террейна. Соответственно, этот список надо рядом выводить.
  4. По клику левой кнопкой мыши на клетку уровня назначать выбранный тип террейна. По клику правой кнопкой мыши назначать дефолтный тип террейна.
  5. Также со списком юнитов. Нужно выводить список доступных юнитов, выбирать одного из них и по ЛКМ ставить его в выбранную ячейку. По ПКМ удалять юнит. Запрещать ставить юниты в клетки, где уже есть юниты. Также запрещать ставить морские юниты не на море, а сухопутные юниты на море. Также должен быть выбор команды, за которую выставляются юниты. Визуально юниты должны отображаться той команды, которая сейчас активна.
  6. Сохранять и загружать карты в разные файлы. У нас в прототипе их должно быть несколько.
  7. Для прототипа не обязательно, но желательно. Перетаскивание юнита между ячейками. Чтобы не удалять и выставлять заново, если нужно поправить позицию. Для этого если на юните нажата ЛКМ и затем ЛКМ отпущена в другой клетке, то если клетка валидна для установки юнита, то он в ней создается, а в старой клетке удаляется.
В первую очередь редактор нам нужен для внутренних нужд, но если получиться отдать его игрокам, то будет хорошо. Работать он должен в своей сцене, отдельно от сцены с геймплеем.

Формат карты

Карта представляет из себя ScriptableObject типа MapObject, со следующей инфой:
  • Ширина и высота поля
  • Массив тайлов - в него построчно записаны все тайлы (слева-направо, снизу-вверх, то есть [y*width+x]). При желании можно сделать список списков, но особого смысла в этом не вижу.
  • Список юнитов:
    • Положение юнита
    • Тип юнита
    • Индекс команды, которой принадлежит юнит
  • Список команд:
    • Кто управляет командой (человек, idle AI - пропускает ход, AI)
    • Flipped - в какую сторону смотрят юниты команды изначально.
Поподробнее про тип тайла. Каждый тайл - тоже ScriptableObject типа TileSpriteObject (точнее референс на него). В таком объекте:
  • Имя тайла (просто для нормального вывода в списках)
  • Спрайт тайла (в теории - несколько спрайтов для анимации)
  • Тип тайла (земля/дорога/вода/...) - так как у одного типа может быть несколько тайлов (переходные).
Список всех этих тайлов хранится в еще одном (и единственном) ScriptableObject'е TileSpritesListObject (Assrts/ScriptableObjects/Tiles/Tiles List). Сюда и надо добавлять все созданные тайлы. 
В редактор соответственно надо добавить референс на этот объект и либо считывать все тайлы из списка, либо через GetTilesOfType(TileParameters.Type type) или Dictionary<TileParameters.Type, List<TileSpriteObject>> GetGroupedTiles() получить сгруппированные по типам тайлы для более удобного отображения. Затем эти ссылки добавлять в MapObject при редактировании.

Для работы с ассетами есть ScriptableObjectUtility с функциями CreateAsset, SaveAsset и SaveAssetWithName. Сохранять их все стоит в "Assets/ScriptableObjects/Maps" (в редакторе можно будет искать карты для редактирования только по этой папке например). Далее оттуда они будут линковаться к лоадеру карт, который будет выбирать желаемую карту.
Comments