Как сделать сохранения в Unity 5
В этом уроке мы разберем как сделать сохранения в Unity 5. В связи с тем, что в Unity уже добавлен свой собственный сериализатор в формат Json, но он не поддерживает такие вещи как List или Dictionary, то пользоваться мы будем библиотекой NewtonSoft.Json, её необходимо скачать. Откроем Window->AssetStore в поиске наберите Json, а далее необходимо выбрать бесплатный ассет Json .Net For Unity и установить его в ваш проект. После этого вам будут доступны все действия с сериализацией, при указании библиотеки NewtonSoft.Json.
Для начала необходимо создать класс, который будет хранить данные. Так как стандартный класс Unity наследуется от MonoBehaviour он подцепляет кучу ненужных данных, поэтому мы создадим класс Player.
//Ставим атрибут о том, что этот объект // можно сериализовать [Serializable] public class Player { //делаем примерные данные public int Hp; public float Strength; public List WeaponIds; public Player() { WeaponIds = new List(); WeaponIds.Add(0); } }
Итак, допустим у нас есть персонаж, который должен сохранять свои значения и загружать их вновь. Сделаем ему скрипт:
public class PlayerController : MonoBehaviour { //текущее действие public bool Save; //Объект, хранящий все данные public Player CurrentPlayer; private void Start() { //Создаем новый объект с данными CurrentPlayer = new Player(); } //Начинаем сохранение/загрузку по клику private void OnMouseDown() { //Сохраняем или загружаем if (Save) { //Выставляем настройки сохранения JsonSerializerSettings settings = new JsonSerializerSettings { //показывает тип приводимого объекта в "$type" //Помогает выгрузить обратно из Json в исходный тип TypeNameHandling = TypeNameHandling.All, //Запрещает ссылки, указывающие на такой же объект //чтоб небыло рекурсий по типу //Vector2.one.one.one и т.д. ReferenceLoopHandling = ReferenceLoopHandling.Ignore, //Вид отображения файла, не влияет на продуктивность //но влияет на размер и читабельность для человека Formatting = Formatting.None }; //Теперь заносим все наши данные о классе в файл, находящийся //в streamingAssets(там лучше держать сейвы, чтоб ошибок не было) //JsonConvert.SerializeObject(CurrentPlayer, settings) преобразует класс //в json формат File.WriteAllText(Application.streamingAssetsPath + "/Saves/" + "/Save.json", JsonConvert.SerializeObject(CurrentPlayer, settings)); } else { //Если это загрузка, то мы так же выставляем настройки выгрузки JsonSerializerSettings settings = new JsonSerializerSettings { //это соответствует сохранению, чтоб выгружал и преобразовывал в указанный класс TypeNameHandling = TypeNameHandling.All, //Указывает как создаются объекты при десериализации //В данном случае мы всегда создаем новые экземпляры ObjectCreationHandling = ObjectCreationHandling.Replace }; //Мы проводим десериализацию и заменяем ей наш объект с данными CurrentPlayer = JsonConvert.DeserializeObject(File.ReadAllText(Application.streamingAssetsPath + "/Saves/" + "/Save.json"),settings); //Выведем наши результаты выгрузки Debug.Log(CurrentPlayer.Hp); } } }
Теперь изменим данные в инспекторе и сохраним их (поставив галочку и нажав на персонажа). Далее изменим их вновь, уберем галочку и нажмем на персонажа. Наши данные поменялись на те, которые мы сохраняли прежде. В инспекторе должен быть примерно такой вид:
По итогу данного урока мы сделали сохранения в Unity 5 при помощи библиотеки Newtonsoft.Json