Простейшая система сохранения/загрузки данных в Unity3D
Все данные будут сохраняться в TXT файл построчно. Начнём.
1. Создаём JavaScript с именем SaveLoad.
2. Удалим всё из файла
3. Так как функция записи и чтения из файла не доступна для JS, нам нужно импортировать класс System.IO, как в C#.
import System.IO;
4. Теперь создадим статичные переменные для того, чтобы их можно было использовать в другом скрипте:
static var playerDataPath : String; //Полный путь до файла, будет создаваться в функциях
static var playerDataName : String = "data.txt"; //Название файла с нашими данными
5. Создадим функцию записи в файл. Функция статичная, чтобы можно было использовать её в другом скрипте (это можно не делать, как и статичные переменные, если вы не будете вызывать функцию из другого скрипта), а статичные функции должны располагаться перед функцией Start:
static function WriteData(dataString:String/*если будем записывать данные из переменной "на лету"*/) {
playerDataPath = Application.dataPath +'/'+ playerDataName; //Полный путь к файлу = положение нашей игры + название файла (файл будет сохраняться в папку _Data)
var dataWriter : StreamWriter = new StreamWriter(playerDataPath); //Реализует запись в строку и, если нет нашего файла, создаёт его по указанному пути
dataWriter.WriteLine(playerName); //Пишем первую строку из переменной
dataWriter.WriteLine("Вторая строка"); //Пишем вторую строку
dataWriter.Flush(); //Очищает буфер
dataWriter.Close(); //Закрывает объект StreamWriter
}
Если вы будете использовать функцию записи несколько раз, то каждый раз строки будут перезаписываться
Теперь можно использовать эту функцию для записи данных в файл.
6. Чтение файла. Тут всё немного легче. Пишем функцию чтение и наш скрипт будет готов:
static function ReadData() {
playerDataPath = Application.dataPath +'/'+ playerDataName; //Восстанавливаем полный путь к файлу
var dataReader = new File.OpenText(playerDataPath); //Реализует чтение строки
var line1 = dataReader.ReadLine(); //Читаем первую строку
var line2 = dataReader.ReadLine(); //Читаем вторую строку
Debug.Log("Строка 1: "+line1); //Выводим в Debug первую строку
Debug.Log("Строка 2: "+line2); //И вторую строку
dataReader.Close(); //Закрываем объект OpenText
}
Вот и всё. Если вы хотите, чтобы, при чтении файла, ваши переменные могли быть использованы в другом скрипте, то нужно просто добавить их в самое начало скрипта:
static var line1;
static var line2;
Переменные должны быть статичными, чтобы их можно было читать из другого скрипта!
Вот уже созданный файл с данными в моей игре:
Вот путь до файла (exe > папка с игрой > _Data папка с файлами):
ВАЖНО! Все данные, при чтении файла, выводятся в переменные, как String (возможно, потому что я не задавал переменным тип). Поэтому, чтобы перевести из String переменной в числовую типа int/float, нужно воспользоваться встроенным парсером. будет выглядеть так: переменная_которая_должна_быть_типа_float: float = float.Parse(line1); //Для float — переменную, которую нужно перевести ставим в скобки. Так же и для int, просто ставим его вместо float
Спасибо за внимание! Надеюсь, я вам помог. Этот способ не самый практичный, но самый лёгкий.
P.S. У меня есть небольшая проблема. Дело в том, что, при игре в полный экран, у меня моргает изображение. Подскажите, из-за чего может быть такая вещь.
14 комментариев
В общем, автор — молодец, но готовься к наплыву школое**в.
На мой взгляд сохранять временные данные об игре в реестр не правильно.
Для каждого сохранения можно вполне создать такие файлы. Только естественно не формата .txt, да и придумать защиту для информации в файле, не так уж то и трудно.
string[] lines = File.ReadAllLines(«Путь к файлу»);
Получим массив строк из файла.
Также путь к файлу не обязательно указывать полностью. Если указать просто имя файла то он его будет искать в той же папке где и находиться .exe