C#
Сохранение объектов сцены в Unity
У меня есть сцена, на которой есть объекты. При выходе надо их сохранить, а при заходе - загрузить. Как это можно сделать? Как можно сохранить GameObject используя PlayerPrefs или что - то простое, без использования сереализации
на объекте множество компонентов, для начала определись с нужными для твоей задачи полями в этих компонентах, которые ты хочешь сохранить.
скорее всего я предположу что в твоём случае будет достаточно сохранять все поля компонента Transform и Velocity у Rigidbody.
https://pastebin.com/UVW83LfK < код
на настукивания этой горы текста у меня ушло 15 минут.
Это время можно было сократить в 3 раза, если бы я создал метод SaveVector3/LoadVector3
но это уже путь в сторону "усложнения", избежать которое ты хочешь.
А так же, если ты делаешь игру для PC, тогда лучше не использовать PlayerPrefs для этих целей, так как он сохраняет эту огромную кучу полей в риестр, сохранение сцены из 100 таких объектов, очень сильно будет нагружать систему.
По этому лучше потрать пару часов на изучения сериализации / библиотеки System.IO
и напиши свою системы сохранения.
Ну или используй один из огромного числа ассетов в ассетсторе
скорее всего я предположу что в твоём случае будет достаточно сохранять все поля компонента Transform и Velocity у Rigidbody.
https://pastebin.com/UVW83LfK < код
на настукивания этой горы текста у меня ушло 15 минут.
Это время можно было сократить в 3 раза, если бы я создал метод SaveVector3/LoadVector3
но это уже путь в сторону "усложнения", избежать которое ты хочешь.
А так же, если ты делаешь игру для PC, тогда лучше не использовать PlayerPrefs для этих целей, так как он сохраняет эту огромную кучу полей в риестр, сохранение сцены из 100 таких объектов, очень сильно будет нагружать систему.
По этому лучше потрать пару часов на изучения сериализации / библиотеки System.IO
и напиши свою системы сохранения.
Ну или используй один из огромного числа ассетов в ассетсторе
Если простое, то через библиотеку System.IO .
Значения их компонентов записывать в файл построчно и так же считывать. В отличие от PlayerPrefs можно будет создать систему сохранений, в которой иметь много сохранений.
Значения их компонентов записывать в файл построчно и так же считывать. В отличие от PlayerPrefs можно будет создать систему сохранений, в которой иметь много сохранений.
какое совпадение), я только что это сделал, так что возможно помогу. 1. Для начала надо создать скрипт, в котором мы будем проводить операции с сохранением, будем использоавть PlayerPrefs.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class NextLevel : MonoBehaviour
{
private bool DeleteInfo;
public int LevelNum;
public void Update()
{
// Здесь удаляем всё, если нажмём на клавишу D
if (Input.GetKey(KeyCode.D))
{
DeleteInfo = true;
PlayerPrefs.DeleteAll();
PlayerPrefs.Save ();
}
}
public void Start()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
LevelNum = SceneManager.GetActiveScene().buildIndex + 1;
PlayerPrefs.SetInt("Level", LevelNum);
PlayerPrefs.Save ();
}
2. Создаём второй скрипт в котором будет сама так сказать инициализация.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelThis : MonoBehaviour
{
void Start()
{
if (SceneManager.GetActiveScene().buildIndex != PlayerPrefs.GetInt("Level"))
{
SceneManager.LoadScene(PlayerPrefs.GetInt("Level"));
}
}
}
3. Заходим в Unity и кидаем эти оба скрипта на камеру, готово! Надеюсь это тебе поможет, я сам еле-еле написал это в свою игру т.к. нихера не понятно объясняют на ютубе и т.п.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class NextLevel : MonoBehaviour
{
private bool DeleteInfo;
public int LevelNum;
public void Update()
{
// Здесь удаляем всё, если нажмём на клавишу D
if (Input.GetKey(KeyCode.D))
{
DeleteInfo = true;
PlayerPrefs.DeleteAll();
PlayerPrefs.Save ();
}
}
public void Start()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
LevelNum = SceneManager.GetActiveScene().buildIndex + 1;
PlayerPrefs.SetInt("Level", LevelNum);
PlayerPrefs.Save ();
}
2. Создаём второй скрипт в котором будет сама так сказать инициализация.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelThis : MonoBehaviour
{
void Start()
{
if (SceneManager.GetActiveScene().buildIndex != PlayerPrefs.GetInt("Level"))
{
SceneManager.LoadScene(PlayerPrefs.GetInt("Level"));
}
}
}
3. Заходим в Unity и кидаем эти оба скрипта на камеру, готово! Надеюсь это тебе поможет, я сам еле-еле написал это в свою игру т.к. нихера не понятно объясняют на ютубе и т.п.
Похожие вопросы
- Unity. Как отключить видимость объекта в камере
- Я изучал программирование на протяжении 4 лет и ничего не умею, как это возможно и что со мной не так? Учил С# и Unity
- Буровая установка в unity как в satisfactory
- Дрифт в Unity 3D с использованием WheelColider.
- как сделать такую же систему управления молотом как в getting over it, в unity 2d.
- Почему когда я доделал игру то камера смотрела ровно на игру а когда компилировал она приблизилась хотя в Unity на месте
- Как можно остановить все звуки в игре? Unity
- Как сделать пол в 2d игре на unity?
- Нужна помощь с созданием первой игры на Unity
- Кто разрабатывал игры с Unity?