Чтение из json в Unity 5.6

Здравствуй, читатель!

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

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

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

Графическая составляющая

Первым делом набросал в Фотошопе разметку интерфейса:

GUI ангара

Далее разметил это в unity:

2017-10-01_21-40-20

После чего сделал префабы для кнопок категорий и кнопок конкретных частей.

Подготовка данных к чтению

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

Код

Для частей игрока параметров больше и их структура сложнее: имя, категория, точка опоры, точки крепления.

На этом моменте уже можно набросать примерный json-файлик с описанием отдельных объектов.

Код

Но создавать по файлику на каждую кнопку как-то неразумно. Нам нужен массив!

Код
Cам массив должен быть параметром некоего внешнего объекта.

Подготовка необходимых классов

И вот тут начинается веселье. C# строго типирован, и, как оказалось, вы не можете просто так разобрать json-строку в динамический объект, из которого потом будете забирать нужные данные. Нееет. Вам необходимо описать формат того, что будет считывать Unity из файла.

Здесь на помощь приходит вид/тип/семейство классов под тэгом Serializable. В unity 5 такие классы описываются следующим образом:

Код

Класс! Этого достаточно, чтобы считать из json-строки один экземпляр. Как же быть с массивом? Нужно создать сериализуемый класс, содержащий один параметр — массив объектов нужного класса. (Ваш кэп)

Код

Теперь то всё? Теперь все — можем считать и разобрать наш json, содержащий массив описаний кнопок категорий.

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

Переходим к считыванию!

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

Код

Далее я написал два метода: чтение json из переданного файла и создание кнопок из префаба.

Код

Пишем скрипт, который будет управлять самой кнопкой, определяем в нем методы для установки параметров.

Код

Добавляем передачу параметров и установку координат в наш класс-создатель:

Код

Готово! Мы великолепны, теперь после загрузки сцены игра считает json, создает и размещает кнопки без нашего участия.

Под спойлером код для создания кнопок в нижней части.

Резюмируя, алгоритм для работы с данными из конфигов следующий:

  • Продумать нужные параметры
  • Создать сериализуемые классы с этими параметрами, если планируете получать массивы — классы с параметром-массивом классов.
  • Получить json в коде
  • Присвоить считанные данные нужным переменным/выполнить какие-то действия

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

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

Также предлагаю прямо в браузере поиграть в мою первую игру на unity и рассказать о своих результатах (мой рекорд — 120 очков, кто больше?). Буду рад обратной связи, до новых статей!

Полезные ссылки:

© 2020 CAsperovskii BLOG.RU // Дизайн и поддержка: GoodwinPress.ru