Сохранение игровых данных в фаил

В любой игре, ну или почти, не обойтись без сохранения и загрузки. Система сохранения уже встроена в Unity и она достаточно удобная. Но, одно дело, когда сохранения где-то там в реестре Windows например. А парой удобнее, когда всё под рукой, так сказать. Да и не хорошо забивать реестр различными данными, если есть возможность сохранить всё отдельно. Мы рассмотрим простой способ сохранения игровых данных, с использованием языка разметки XML. Ну и само-собой добавим возможность загружать настройки из файла. Скрипт, который мы напишем в данном уроке, Вы сможете без проблем использовать в своей игре.

Преступим. Создаем новый C# скрипт, например LoadSaveXML.
Подключаем System.Xml и System.IO:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Xml;

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

public string saveFileName = "PlayerPrefs";
public float soundValue;
public float musicValue;
public int[] array;

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

public void OnApplicationQuit()
{
	XmlDocument xmlDoc = new XmlDocument();
	XmlNode rootNode = xmlDoc.CreateElement("SaveData");
	xmlDoc.AppendChild(rootNode);
	
	XmlNode userNode;
	
	userNode = xmlDoc.CreateElement("MusicValue");
	userNode.InnerText = musicValue.ToString();
	rootNode.AppendChild(userNode);
	
	userNode = xmlDoc.CreateElement("SoundValue");
	userNode.InnerText = soundValue.ToString();
	rootNode.AppendChild(userNode);
	
	for(int i = 0; i < array.Length; i++)
	{
		userNode = xmlDoc.CreateElement("Array_" + i);
		userNode.InnerText = array[i].ToString();
		rootNode.AppendChild(userNode);
	}
	
	xmlDoc.Save(Application.dataPath + "/" + saveFileName + ".xml");
}

Путь файла с сохранениями Application.dataPath, подробнее о том, где можно найти файл смотрите здесь.

Теперь добавим функцию загрузки данных из файла:

public void LoadSettings()
{
	if(File.Exists(Application.dataPath + "/" + saveFileName + ".xml"))
	{
		XmlTextReader keyReader = new XmlTextReader(Application.dataPath + "/" + saveFileName + ".xml");
		for(int i = 0; i < array.Length; i++)
		{
			keyReader.ReadToFollowing("Array_" + i);
			array[i] = int.Parse(keyReader.ReadString());
		}
		keyReader.Close();
		
		XmlTextReader reader = new XmlTextReader(Application.dataPath + "/" + saveFileName + ".xml");
		while (reader.Read())
		{
			if (reader.IsStartElement("MusicValue")) 
			{
				musicValue = float.Parse(keyReader.ReadString());
			}
			if (reader.IsStartElement("SoundValue")) 
			{
				soundValue = float.Parse(keyReader.ReadString());
			}
		}
		reader.Close();
	}
}

Здесь с начала делается проверка, существует ли файл, если да, то читается массив, затем остальное. Как видите тут всё достаточно просто и наглядно, можно добавлять или удалять блоки сохранения/загрузки. Важно понимать, что значения сохраняются как string, это значит их необходимо обратно конвертировать в нужный тип. Например, int.Parse(string) и т.п.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика