avatar

Простейшая система сохранения/загрузки данных в Unity3D

опубликовал в Программирование / Unity3D
Привет всем! Сейчас мы создадим самую простую систему сохранения данных в файл на Unity3d (JavaScript).
Все данные будут сохраняться в 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 комментариев

avatar
Познавательно, конечно, но не понятно, зачем? PlayerPref гораздо проще и при этом использует шифрование.
avatar
Ну не знаю… Я думал, что будет интересно узнать, как сохранять данные в файл…
avatar
Статья полезна для тех разработчиков, что могут использовать свою фантазию и смекалку, чтобы придумать систему сохранения для своей игры. Однако для большей аудитории рунета (школьников) данная статья будет звучать как "бла-бла, вот мой аккаунт и адрес почты, а также ссылка на мой вконтактик чтобы я мог задать вопрос, как сохранить мои кубики в моем мега актуальном клоне майнкрафта?".

В общем, автор — молодец, но готовься к наплыву школое**в.
avatar
Отличная статья, но для сохранения как говорил WineManiac проще и лучше использовать PlayerPref, но как мне известно в PlayerPref лимит сохранения 1mb. Ещё отлично подойдёт например для мультиязычной игры, т.е. в файлах хранить весь текст игры.
avatar
PlayerPref сохраняет данные в реестре.
На мой взгляд сохранять временные данные об игре в реестр не правильно.
Для каждого сохранения можно вполне создать такие файлы. Только естественно не формата .txt, да и придумать защиту для информации в файле, не так уж то и трудно.
avatar
Можно и для ТХТ придумать защиту…
avatar
Я имел в виду, сменить формат чтобы он не определялся виндой автоматически как текстовый файл. Например .hz такой формат файла винда не знает, но файл по прежнему останется текстовым.
avatar
Значит, я неправильно понял :)
avatar
Прочитать весь файл можно проще.
string[] lines = File.ReadAllLines(«Путь к файлу»);
Получим массив строк из файла.

Также путь к файлу не обязательно указывать полностью. Если указать просто имя файла то он его будет искать в той же папке где и находиться .exe
avatar
Спасибо за советы и добрые слова :) Про чтение всех строк я ещё не думал, но спасибо.
avatar
Полезно, но PlayerPrefs все же лучше
avatar
Чем он лучше? Тем что забивает реестр? Тем что массивы не сохранишь? Этим?
avatar
Не ссорьтесь, и метод, описанный в статье, и PlayerPrefs — плохие методы :)
avatar
Вот не знаю за что меня заминусовали, но видимо кто-то не осилил BinaryWriter, который записывает данные в бинарном виде, а не в текстовик
Чтобы оставить комментарий необходимо .