Это статья для начинающих и несёт чисто обзорный характер о том, как можно хранить уровни своей игры в Unity3D. Если вы гуру Unity3D, эта информация вряд ли вас заинтересует. Тем не менее, жду от вас секретов мастерства хранения уровней в комментариях к посту. Если же вы только начинаете изучение Unity или хотите начать — добро пожаловать под кат.
Небольшое вступление
Я студент, который решил создать свою игру. Так как это мой первый проект и в принципе первый опыт разработки какого-то ПО сложнее университетской лабораторной работы, по ходу дела я наступил на тысячу грабель, но сейчас не об этом. (Про это могу написать в отдельные посты, если кому-то будет интересно.)
Первое, что необходимо было сделать перед разработкой игры — это определиться с технологией. Изначально я планировал выпускать игру на все мобильные платформы, но Unity мне показался избыточным, так что я выбрал другой кросс-платформенный движок libGDX. Спустя два месяца, когда я начал задумываться о том, что в игре, кроме геймплея, неплохо бы иметь монетизацию, я попробовал ввести её, но тут появилось множество непредвиденных проблем. Плюс я был ограничен в графике и инструментах для управления приложением, так что я перенёс всё на Unity3d.
Всё шло гладко и замечательно, пока я не решил добавить уровни в игру. Столкнулся я с непредвиденной проблемой, казалось бы элементарно решаемой для тех кто знает юнити, но для новичков вызывающей вопрос.
Как хранить уровни?
Однозначного ответа на этот вопрос нет. Сколько людей, столько и мнений.
Из-за особенностей старого движка уровни в моей игре представляли собой наборы координат, цвета ребер и вес (последнее для настройки AI) записанные в текстовые файлы.
Пример уровня, чтобы было понятно, как это выглядит:
Раз уж я перешел на юнити, в первую очередь решил узнать, как мудрые люди решают эту проблему, но официальных туториалов (учитывая, что для 2D он всего один) была рандомная генерация уровней, а Google по этой теме давал очень мало информации (большинство видео и статей, скорее отвечали, как хранить сохранения, чем сами уровни). По-сути я нашел два основных подхода к хранению уровней.
Своя сцена на каждый уровень
На мой взгляд, данный подход лучше всего использовать в 3D проектах, а так же в 2D-платформерах.
В юнити существует такая замечательная вещь, как префаб, и по сути все игровые объекты вы можете хранить в виде префаба, который просто будет позднее перетаскиваться на сцену. Таким образом можно собрать из них нужный вам уровень.
В моём конкретном случае этот подход был плох из-за того, как в юнити происходит отрисовка линий. Да, и мне приятнее и удобнее работать в координатах. (И, честно говоря, было лень переделывать руками то, что уже сделано в 16 файлах с уровнями).
Одна сцена и информация в xml, json или txt файлах
По-моему, это отличный метод хранения уровней для различных типов головоломок и простых 2д игр.
Вы создаёте одну сцену, а после этого подгружаете в неё с помощью скрипта файл, в котором хранятся нужны вам данные. По-моему опыту, такой скрипт лучше прикреплять к основной камере. Парсите файл и получаете готовый уровень. Вся настройка происходит в файлах, что в некоторых случаях ускоряет работу. (Да и текстовый файл я могу забить с планшета, сидя на паре.)
Главное, что надо учитывать в юнити, при использовании данного подхода, это то, как он хранит файлы в конечном билде. Сначала я просто перенёс файлы в папку Assets, написал на C# простенький парсер, где указал путь до файла. В редакторе всё работало прекрасно, и я ничего не заподозрив пошел писать скрипт, который отвечает за обход графа. Позднее сделав билд, я заметил, что ничего не происходит. Долгое время копался в коде, пытаясь понять, в чём всё-таки дело. Оказалось, что такие файлы нужно помещать в папку Resources и подгружать как TextAsset, после этого всё стало отлично работать.
Если у кого-то есть свои секреты мастерства, то прошу поделиться в комментариях. Спасибо за внимание.