Как сохранить сцену в UNITY?
Необходимо сохранить сцену(уровень) при выходе из игры/переходе на главное меню(т.е. при переходе на другую сцену).
Искал информацию об этом в интернете, нашёл сохранение через PlayerPrefs или JSON, но насколько я понимаю, там сохранять можно только отдельные переменные (например, количество здоровья, громкость фонового звука). А у меня на сцене в игре большое количество объектов и не хочется для каждого из них писать своё сохранение.
Как можно сохранить сцену целиком, чтобы при возврате на данный уровень (сцену) все было таким же, как при выходе (сохранялись жизни, запас патронов, расстановка объектов (префабов) по сцене)???
Буду очень благодарен, так как необходимо реализовать сохранение, а идей нет(
Ответы (1 шт):
Решения "по щелчку пальца" - нет.
Если вы хотите сохранить состояние сцены во время игры (без выхода из игры), например при выходе в меню, то меню можно показать с помощью LoadSceneMode.Additive или SetActiveScene. При выходе из игры это конечно же не сработает.
В любом случае самым лучшим способом является построение сцены из JSON, не надо писать своё сохранение для каждого элемента, просто пишите всё состояние сцены в один JSON, добавляя объекты и значения по мере их появления или изменения. Ну и при загрузке сцены просто подгружать JSON файл, более удобного варианта пока не придумали, либо я о нем не знаю.
Дополню ответ более подробно в ответ на комментарий:
Я не знаю какая у Вас сцена, поэтому покажу на простейшем примере.
1.) На сцене есть 2 объекта. Куб и Сфера, их позиции динамично меняются.
2.) Есть какие-либо абстрактные полоски здоровья и брони, у них меняются значения.
Внесем данные о них в JSON, примерно так:
{
"saveData":[
{
"prefObj":{
"id":1,
"name":"Sphere",
"positionX":"12;11;22",
"positionY":"0;0;0",
"positionZ":"20;20;20",
"color":"#FFF"
},
"prefObj":{
"id":2,
"name":"Cube",
"positionX":"0;0;0",
"positionY":"0;0;0",
"positionZ":"0;0;0",
"color":"#000"
},
"Health":80,
"Armor":10
}
]
}
Ну и в C# уже сделать объект для удобной работы с этим JSON:
[Serializable]
public class Rootobject
{
public Savedata[] saveData { get; set; }
}
[Serializable]
public class Savedata
{
public Prefobj prefObj { get; set; }
public int Health { get; set; }
public int Armor { get; set; }
}
[Serializable]
public class Prefobj
{
public int id { get; set; }
public string name { get; set; }
public string positionX { get; set; }
public string positionY { get; set; }
public string positionZ { get; set; }
public string color { get; set; }
}
Потом там, где это нужно инициализируете этот объект и заполняете/читаете его:
Rootobject rootBox = JsonUtility.FromJson<Rootobject>(JSONdata);