Как можно хранить уровни в Unity3D

в 0:37, , рубрики: Песочница, метки: , , , , ,

Это статья для начинающих и несёт чисто обзорный характер о том, как можно хранить уровни своей игры в Unity3D. Если вы гуру Unity3D, эта информация вряд ли вас заинтересует. Тем не менее, жду от вас секретов мастерства хранения уровней в комментариях к посту. Если же вы только начинаете изучение Unity или хотите начать — добро пожаловать под кат.

Небольшое вступление

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

Первое, что необходимо было сделать перед разработкой игры — это определиться с технологией. Изначально я планировал выпускать игру на все мобильные платформы, но Unity мне показался избыточным, так что я выбрал другой кросс-платформенный движок libGDX. Спустя два месяца, когда я начал задумываться о том, что в игре, кроме геймплея, неплохо бы иметь монетизацию, я попробовал ввести её, но тут появилось множество непредвиденных проблем. Плюс я был ограничен в графике и инструментах для управления приложением, так что я перенёс всё на Unity3d.

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

Как хранить уровни?

Однозначного ответа на этот вопрос нет. Сколько людей, столько и мнений.

Из-за особенностей старого движка уровни в моей игре представляли собой наборы координат, цвета ребер и вес (последнее для настройки AI) записанные в текстовые файлы.

Пример уровня, чтобы было понятно, как это выглядит:

Как можно хранить уровни в Unity3D - 1

Раз уж я перешел на юнити, в первую очередь решил узнать, как мудрые люди решают эту проблему, но официальных туториалов (учитывая, что для 2D он всего один) была рандомная генерация уровней, а Google по этой теме давал очень мало информации (большинство видео и статей, скорее отвечали, как хранить сохранения, чем сами уровни). По-сути я нашел два основных подхода к хранению уровней.

Своя сцена на каждый уровень

Как можно хранить уровни в Unity3D - 2

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

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

В моём конкретном случае этот подход был плох из-за того, как в юнити происходит отрисовка линий. Да, и мне приятнее и удобнее работать в координатах. (И, честно говоря, было лень переделывать руками то, что уже сделано в 16 файлах с уровнями).

Одна сцена и информация в xml, json или txt файлах

image

По-моему, это отличный метод хранения уровней для различных типов головоломок и простых 2д игр.

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

Главное, что надо учитывать в юнити, при использовании данного подхода, это то, как он хранит файлы в конечном билде. Сначала я просто перенёс файлы в папку Assets, написал на C# простенький парсер, где указал путь до файла. В редакторе всё работало прекрасно, и я ничего не заподозрив пошел писать скрипт, который отвечает за обход графа. Позднее сделав билд, я заметил, что ничего не происходит. Долгое время копался в коде, пытаясь понять, в чём всё-таки дело. Оказалось, что такие файлы нужно помещать в папку Resources и подгружать как TextAsset, после этого всё стало отлично работать.

Если у кого-то есть свои секреты мастерства, то прошу поделиться в комментариях. Спасибо за внимание.


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js