Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 20:10
sobolev.i
Привет всем. Есть много объектов на сцене, и нужно по нажатию на кнопку, сохранить положение всех этих моделей, чтобы потом, при загрузке их создать в нужных местах.
Прошу помощи, перерыл много гугла, и научился только для одной модели...
А мне бы в строчку три координаты, и так каждая строчка на один объект.
Re: Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 20:15
1max1
Массивы можно сериализовать.
Используется csharp
[System.Serializable]
class Save
{
Vector3[] positions;
// или так
List<Vector3> _positions;
}
После сериализации юньковским джесоном можно запихнуть эту строку либо в файлик либо в playerprefs
Вот тут про джсон
https://docs.unity3d.com/Manual/JSONSerialization.html
Re: Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 20:17
sobolev.i
1max1 писал(а):Массивы можно сериализовать.
Используется csharp
[System.Serializable]
class Save
{
Vector3[] positions;
// или так
List<Vector3> _positions;
}
После сериализации юньковским джесоном можно запихнуть эту строку либо в файлик либо в playerprefs
Вот тут про джсон
https://docs.unity3d.com/Manual/JSONSerialization.html
Спасибо большое. А не подкинешь примерчик таких скриптов, самых примитивных, чтобы лучше разобраться
Re: Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 20:27
1max1
Так в мануале ж всё есть, почитай.
Тебе нужно создать класс с массивом, где ты будешь хранить координаты.
Потом этот класс можно сериализовать и сохранить.
Используется csharp
[Serializable]
public class SaveData
{
public Vector3[] positions;
}
void Start()
{
var save = new SaveData();
save.positions = new Vector3[3];
save.positions[0] = new Vector3(1,0,0);
save.positions[1] = new Vector3(0,1,0);
save.positions[2] = new Vector3(0,0,1);
string json = JsonUtility.ToJson(save);
PlayerPrefs.SetString("SavePositions", json); // Сохраняем
var load = JsonUtility.FromJson<SaveData>(PlayerPrefs.GetString("SavePositions")); // Загружаем
go1.transform.position = load.positions[0]; // К примеру
}
Re: Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 20:37
sobolev.i
1max1 писал(а):Так в мануале ж всё есть, почитай.
Тебе нужно создать класс с массивом, где ты будешь хранить координаты.
Потом этот класс можно сериализовать и сохранить.
Используется csharp
[Serializable]
public class SaveData
{
public Vector3[] positions;
}
void Start()
{
var save = new SaveData();
save.positions = new Vector3[3];
save.positions[0] = new Vector3(1,0,0);
save.positions[1] = new Vector3(0,1,0);
save.positions[2] = new Vector3(0,0,1);
string json = JsonUtility.ToJson(save);
PlayerPrefs.SetString("SavePositions", json); // Сохраняем
var load = JsonUtility.FromJson<SaveData>(PlayerPrefs.GetString("SavePositions")); // Загружаем
go1.transform.position = load.positions[0]; // К примеру
}
Извини, что задаю много вопросов, но, как я понимаю, это же не сохранение в файл? Просто не понял, куда файл сохраняется, и как это изменить.
Re: Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 22:47
sobolev.i
Используется csharp
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class SaveLoad : MonoBehaviour {
public static GameObject choosedPart;
[Serializable]
public class SaveData
{
public string positions;
}
private void Start()
{
Save();
}
public void Save ()
{
GameObject game = GameObject.Find("Detail2");
var save = new SaveData();
string posX = game.transform.GetComponent<Parts>().x.ToString();
string posY = game.transform.GetComponent<Parts>().y.ToString();
string posZ = game.transform.GetComponent<Parts>().z.ToString();
string number = game.transform.GetComponent<Parts>().number.ToString();
string rot = game.transform.GetComponent<Parts>().rotation.ToString();
save.positions = posX + " " + posY + " " + posZ + " " + number + " " + rot;
string path = "Save/Save.txt";
if (!File.Exists(path))
{
string createText ="";
File.WriteAllText(path, createText);
}
string appendText = save.positions + Environment.NewLine;
File.AppendAllText(path, appendText);
// Read
string readText = File.ReadAllText(path);
}
}
Вот я сделал так. Несколько проблем... Когда запускаешь, и этот файл уже есть, то он в него записывает новые строчки, а не с нуля.
И объект только 1. Ну и чтение пока не отработал. Честно говоря, немного не понял твою мысль с массивом, можешь поподробнее объяснить, или пример в мой код добавить....
Прости за тупение моё. В c# и Unity я только пятый день...
Re: Сохранение многих данных в файл.
Добавлено:
12 июл 2018, 23:31
1max1
Щас бы в 2к18 координаты в строку пихать, это даже не костыли, это инвалидная коляска, я дал тебе вполне понятный кусок кода, если ты не можешь разобраться что к чему, думаю тебе стоит начать с чего попроще, либо посмотри видео на ютубе про сохранения и как его делать, уверен их там дофигище.
Re: Сохранение многих данных в файл.
Добавлено:
13 июл 2018, 11:33
Cr0c
sobolev.i писал(а):Когда запускаешь, и этот файл уже есть, то он в него записывает новые строчки, а не с нуля.
Ты же сам этот код пишешь. Каким методом записываешь? Что этот метод делает? Ты же из доков его взял.
Re: Сохранение многих данных в файл.
Добавлено:
13 июл 2018, 21:38
Fox_game
Используется csharp
string appendText = save.positions + Environment.NewLine;
File.AppendAllText(path, appendText);
Эти строчки тебя не смущают??
Re: Сохранение многих данных в файл.
Добавлено:
14 июл 2018, 06:48
Nubila
sobolev.i писал(а):
Используется csharp
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class SaveLoad : MonoBehaviour {
public static GameObject choosedPart;
[Serializable]
public class SaveData
{
public string positions;
}
private void Start()
{
Save();
}
public void Save ()
{
GameObject game = GameObject.Find("Detail2");
var save = new SaveData();
string posX = game.transform.GetComponent<Parts>().x.ToString();
string posY = game.transform.GetComponent<Parts>().y.ToString();
string posZ = game.transform.GetComponent<Parts>().z.ToString();
string number = game.transform.GetComponent<Parts>().number.ToString();
string rot = game.transform.GetComponent<Parts>().rotation.ToString();
save.positions = posX + " " + posY + " " + posZ + " " + number + " " + rot;
string path = "Save/Save.txt";
if (!File.Exists(path))
{
string createText ="";
File.WriteAllText(path, createText);
}
string appendText = save.positions + Environment.NewLine;
File.AppendAllText(path, appendText);
// Read
string readText = File.ReadAllText(path);
}
}
Вот я сделал так. Несколько проблем... Когда запускаешь, и этот файл уже есть, то он в него записывает новые строчки, а не с нуля.
И объект только 1. Ну и чтение пока не отработал. Честно говоря, немного не понял твою мысль с массивом, можешь поподробнее объяснить, или пример в мой код добавить....
Прости за тупение моё. В c# и Unity я только пятый день...
Прежде чем садится за создание игр, советую выучить базу хоть на каком нить ООП языке. Твой вопрос из разряда "не сложных", и ты спрашиваешь ещё больше вопросов, ответы на которые "нужно знать". Представь что будет, если ты столкнёшься с задачей из разряда "етить как сложно это что ВЕКТОРНАЯ АЛГЕБРА??!?!? А ЭТО ЧТО!?!? ГРАФЫ??? ДРАКУЛЫ ИЛИ КАВО???"