Salvar objetos que foram destruidos entre cenas na unity
2 participantes
Página 1 de 1
Salvar objetos que foram destruidos entre cenas na unity
Estou desenvolvento um jogo em que preciso salvar uma lista muito grande de objetos copiados, preciso salvar se foram destruidos ou nao, ja tentei usar json mas so consegui salvar 1 ID pois usei o mesmo script em todos os objetos, entao quando o primeiro id é criado só salva ele na lista, nao consigo adicionar os outros, preciso salvar tambem se o objeto foi destruido ou nao entre uma cena ou outra e quando o jogador fecha o jogo e abre novamente, preciso que aqueles objetos contiuem destruidos mas nao estou sabendo como fazer, estou começando agora na programação unity entao acredito que nao sei nem 40% do que precisaria saber para fazer um jogo, se alguem puder me dar uma ajuda por favor, ja pensei em usar objetos scripitaveis tambem, porem nao consigo pensar em uma maneira em como poderia salvar se o objeto foi destruido ou nao quando o jogo é fechado
PedroC137- Iniciante
- PONTOS : 425
REPUTAÇÃO : 1
Idade : 23
Áreas de atuação : Estudante de desenvolvimento de jogos com Unity
Respeito as regras :
Re: Salvar objetos que foram destruidos entre cenas na unity
Existem muitas abordagens para lidar com isso, mas é difícil fugir da serialização. Tente isso: https://learn.unity.com/tutorial/persistence-saving-and-loading-data#
Re: Salvar objetos que foram destruidos entre cenas na unity
A parte da serialização não esta sendo um problema, o que não estou conseguindo é pensar em uma maneira de como salvar se o objeto foi destruido ou nao, pensei em fazer IDs para cada objeto mas esta salvando somente 1 ID por se tratar de objetos prefabs, salva somente o ID do primeiro objeto, ainda preciso pensar em uma maneira de com a lista funcionando como farei para que o objeto que foi destruido continue destruido quando carregar a cena de novo
PedroC137- Iniciante
- PONTOS : 425
REPUTAÇÃO : 1
Idade : 23
Áreas de atuação : Estudante de desenvolvimento de jogos com Unity
Respeito as regras :
Re: Salvar objetos que foram destruidos entre cenas na unity
Consegui fazer um save para meu jogo, estou conseguindo salvar a posição do personagem e a cena em que ele está quando o jogo foi salvo, o que nao estou conseguindo agora é uma maneira de salvar os blocos, quais foram destruidos e quais naoPedroC137 escreveu:A parte da serialização não esta sendo um problema, o que não estou conseguindo é pensar em uma maneira de como salvar se o objeto foi destruido ou nao, pensei em fazer IDs para cada objeto mas esta salvando somente 1 ID por se tratar de objetos prefabs, salva somente o ID do primeiro objeto, ainda preciso pensar em uma maneira de com a lista funcionando como farei para que o objeto que foi destruido continue destruido quando carregar a cena de novo
using System;
using System.Collections;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using Unity.VisualScripting;
public class Data : MonoBehaviour
{
public float playerPositionx, playerPositiony, playerPositionz; //posição do player que vai ser salva
private GameObject _player;
private GameObject[] Datas;
public List<GameObject> blocosList = new List<GameObject>();
LisBlocos blocos;
ControllerScene scene;
public string cena;
[Header("Configuração do arquivo")]
public string DiretorioDoArquivo;
public string FormatoDoArquivo;
public string NomeDoArquivo;
[Serializable]
class DadosDoJogo
{
public float _playerPositionx, _playerPositiony, _playerPositionz;
public string _valorCena;
}
private void Start()
{
scene = FindObjectOfType(typeof(ControllerScene)) as ControllerScene;
blocos = FindObjectOfType(typeof(LisBlocos)) as LisBlocos;
_player = GameObject.FindGameObjectWithTag("Player");
playerPositionx = _player.transform.position.x;
playerPositiony = _player.transform.position.y;
playerPositionz = _player.transform.position.z;
cena = scene.valor;
}
private void Awake()
{
Datas = GameObject.FindGameObjectsWithTag("Data");
if(Datas.Length >= 2)
{
Destroy(Datas[0]);
}
DontDestroyOnLoad(transform.gameObject);
blocosList.AddRange(GameObject.FindGameObjectsWithTag("Mineraveis"));
}
private void Update()
{
_player = GameObject.FindGameObjectWithTag("Player");
if (Input.GetKeyDown(KeyCode.S))
{
playerPositionx = _player.transform.position.x;
playerPositiony = _player.transform.position.y;
playerPositionz = _player.transform.position.z;
Save();
Debug.Log("Salvo");
}
DiretorioDoArquivo = Application.persistentDataPath + "/" + NomeDoArquivo + "." + FormatoDoArquivo;
if(Input.GetKeyDown(KeyCode.L))
{
Load();
_player.transform.position = new Vector2(playerPositionx, playerPositiony);
Debug.Log("Carregou");
}
}
public void Save()
{
BinaryFormatter binario = new BinaryFormatter();
FileStream arquivo = File.Create(DiretorioDoArquivo); //Aqui, criamos o arquivo
DadosDoJogo dados = new DadosDoJogo(); //"DadosDoJogo" é o nome da classe que iremos acessar, ao qual criamos anteriormente
dados._playerPositionz = playerPositionz;
dados._playerPositionx = playerPositionx;
dados._playerPositiony = playerPositiony;
dados._valorCena = SceneManager.GetActiveScene().name;
binario.Serialize(arquivo, dados);
arquivo.Close();
}
public void Load() // Void que carrega
{
if (File.Exists(DiretorioDoArquivo) == true) //Aqui verificamos se existe um arquivo para ser carregado. se existir, prosseguimos
{
BinaryFormatter binario = new BinaryFormatter();
FileStream arquivo = File.Open(DiretorioDoArquivo, FileMode.Open); //Aqui abrimos o arquivo
DadosDoJogo dados = (DadosDoJogo)binario.Deserialize(arquivo); //Aqui meio que descriptografamos o arquivo
playerPositionx = dados._playerPositionx;
playerPositiony = dados._playerPositiony;
playerPositionz = dados._playerPositionz;
cena = dados._valorCena;
SceneManager.LoadScene(cena);
arquivo.Close(); //Aqui fechamos a leitura
}
else
{
Debug.Log("Não existe jogo salvo");
}
}
public void NovoJogo()
{
if(File.Exists(DiretorioDoArquivo) == true)
{
Debug.Log("Ja existe um jogo salvo");
} else
{
SceneManager.LoadScene("Nivel1");
Save();
}
}
public void DeletarSave()
{
File.Delete(DiretorioDoArquivo);
Debug.Log("Save Deletado");
}
}
estou tentando usar uma lista para adicionar os gameobjects nela para pensar em uma maneira de salvar quando eles forem destruidos mas nem isso to conseguindo...
PedroC137- Iniciante
- PONTOS : 425
REPUTAÇÃO : 1
Idade : 23
Áreas de atuação : Estudante de desenvolvimento de jogos com Unity
Respeito as regras :
Re: Salvar objetos que foram destruidos entre cenas na unity
- Código:
using System;
using System.Collections;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using Unity.VisualScripting;
public class Data : MonoBehaviour
{
public float playerPositionx, playerPositiony, playerPositionz; //posição do player que vai ser salva
private GameObject _player;
private GameObject[] Datas;
public List<GameObject> blocosList = new List<GameObject>();
LisBlocos blocos;
ControllerScene scene;
public string cena;
[Header("Configuração do arquivo")]
public string DiretorioDoArquivo;
public string FormatoDoArquivo;
public string NomeDoArquivo;
[Serializable]
class DadosDoJogo
{
public float _playerPositionx, _playerPositiony, _playerPositionz;
public string _valorCena;
}
private void Start()
{
scene = FindObjectOfType(typeof(ControllerScene)) as ControllerScene;
blocos = FindObjectOfType(typeof(LisBlocos)) as LisBlocos;
_player = GameObject.FindGameObjectWithTag("Player");
playerPositionx = _player.transform.position.x;
playerPositiony = _player.transform.position.y;
playerPositionz = _player.transform.position.z;
cena = scene.valor;
}
private void Awake()
{
Datas = GameObject.FindGameObjectsWithTag("Data");
if(Datas.Length >= 2)
{
Destroy(Datas[0]);
}
DontDestroyOnLoad(transform.gameObject);
blocosList.AddRange(GameObject.FindGameObjectsWithTag("Mineraveis"));
}
private void Update()
{
_player = GameObject.FindGameObjectWithTag("Player");
if (Input.GetKeyDown(KeyCode.S))
{
playerPositionx = _player.transform.position.x;
playerPositiony = _player.transform.position.y;
playerPositionz = _player.transform.position.z;
Save();
Debug.Log("Salvo");
}
DiretorioDoArquivo = Application.persistentDataPath + "/" + NomeDoArquivo + "." + FormatoDoArquivo;
if(Input.GetKeyDown(KeyCode.L))
{
Load();
_player.transform.position = new Vector2(playerPositionx, playerPositiony);
Debug.Log("Carregou");
}
}
public void Save()
{
BinaryFormatter binario = new BinaryFormatter();
FileStream arquivo = File.Create(DiretorioDoArquivo); //Aqui, criamos o arquivo
DadosDoJogo dados = new DadosDoJogo(); //"DadosDoJogo" é o nome da classe que iremos acessar, ao qual criamos anteriormente
dados._playerPositionz = playerPositionz;
dados._playerPositionx = playerPositionx;
dados._playerPositiony = playerPositiony;
dados._valorCena = SceneManager.GetActiveScene().name;
binario.Serialize(arquivo, dados);
arquivo.Close();
}
public void Load() // Void que carrega
{
if (File.Exists(DiretorioDoArquivo) == true) //Aqui verificamos se existe um arquivo para ser carregado. se existir, prosseguimos
{
BinaryFormatter binario = new BinaryFormatter();
FileStream arquivo = File.Open(DiretorioDoArquivo, FileMode.Open); //Aqui abrimos o arquivo
DadosDoJogo dados = (DadosDoJogo)binario.Deserialize(arquivo); //Aqui meio que descriptografamos o arquivo
playerPositionx = dados._playerPositionx;
playerPositiony = dados._playerPositiony;
playerPositionz = dados._playerPositionz;
cena = dados._valorCena;
SceneManager.LoadScene(cena);
arquivo.Close(); //Aqui fechamos a leitura
}
else
{
Debug.Log("Não existe jogo salvo");
}
}
public void NovoJogo()
{
if(File.Exists(DiretorioDoArquivo) == true)
{
Debug.Log("Ja existe um jogo salvo");
} else
{
SceneManager.LoadScene("Nivel1");
Save();
}
}
public void DeletarSave()
{
File.Delete(DiretorioDoArquivo);
Debug.Log("Save Deletado");
}
}
PedroC137 escreveu:Consegui fazer um save para meu jogo, estou conseguindo salvar a posição do personagem e a cena em que ele está quando o jogo foi salvo, o que nao estou conseguindo agora é uma maneira de salvar os blocos, quais foram destruidos e quais naoPedroC137 escreveu:A parte da serialização não esta sendo um problema, o que não estou conseguindo é pensar em uma maneira de como salvar se o objeto foi destruido ou nao, pensei em fazer IDs para cada objeto mas esta salvando somente 1 ID por se tratar de objetos prefabs, salva somente o ID do primeiro objeto, ainda preciso pensar em uma maneira de com a lista funcionando como farei para que o objeto que foi destruido continue destruido quando carregar a cena de novo
using System;
using System.Collections;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using Unity.VisualScripting;
public class Data : MonoBehaviour
{
public float playerPositionx, playerPositiony, playerPositionz; //posição do player que vai ser salva
private GameObject _player;
private GameObject[] Datas;
public List<GameObject> blocosList = new List<GameObject>();
LisBlocos blocos;
ControllerScene scene;
public string cena;
[Header("Configuração do arquivo")]
public string DiretorioDoArquivo;
public string FormatoDoArquivo;
public string NomeDoArquivo;
[Serializable]
class DadosDoJogo
{
public float _playerPositionx, _playerPositiony, _playerPositionz;
public string _valorCena;
}
private void Start()
{
scene = FindObjectOfType(typeof(ControllerScene)) as ControllerScene;
blocos = FindObjectOfType(typeof(LisBlocos)) as LisBlocos;
_player = GameObject.FindGameObjectWithTag("Player");
playerPositionx = _player.transform.position.x;
playerPositiony = _player.transform.position.y;
playerPositionz = _player.transform.position.z;
cena = scene.valor;
}
private void Awake()
{
Datas = GameObject.FindGameObjectsWithTag("Data");
if(Datas.Length >= 2)
{
Destroy(Datas[0]);
}
DontDestroyOnLoad(transform.gameObject);
blocosList.AddRange(GameObject.FindGameObjectsWithTag("Mineraveis"));
}
private void Update()
{
_player = GameObject.FindGameObjectWithTag("Player");
if (Input.GetKeyDown(KeyCode.S))
{
playerPositionx = _player.transform.position.x;
playerPositiony = _player.transform.position.y;
playerPositionz = _player.transform.position.z;
Save();
Debug.Log("Salvo");
}
DiretorioDoArquivo = Application.persistentDataPath + "/" + NomeDoArquivo + "." + FormatoDoArquivo;
if(Input.GetKeyDown(KeyCode.L))
{
Load();
_player.transform.position = new Vector2(playerPositionx, playerPositiony);
Debug.Log("Carregou");
}
}
public void Save()
{
BinaryFormatter binario = new BinaryFormatter();
FileStream arquivo = File.Create(DiretorioDoArquivo); //Aqui, criamos o arquivo
DadosDoJogo dados = new DadosDoJogo(); //"DadosDoJogo" é o nome da classe que iremos acessar, ao qual criamos anteriormente
dados._playerPositionz = playerPositionz;
dados._playerPositionx = playerPositionx;
dados._playerPositiony = playerPositiony;
dados._valorCena = SceneManager.GetActiveScene().name;
binario.Serialize(arquivo, dados);
arquivo.Close();
}
public void Load() // Void que carrega
{
if (File.Exists(DiretorioDoArquivo) == true) //Aqui verificamos se existe um arquivo para ser carregado. se existir, prosseguimos
{
BinaryFormatter binario = new BinaryFormatter();
FileStream arquivo = File.Open(DiretorioDoArquivo, FileMode.Open); //Aqui abrimos o arquivo
DadosDoJogo dados = (DadosDoJogo)binario.Deserialize(arquivo); //Aqui meio que descriptografamos o arquivo
playerPositionx = dados._playerPositionx;
playerPositiony = dados._playerPositiony;
playerPositionz = dados._playerPositionz;
cena = dados._valorCena;
SceneManager.LoadScene(cena);
arquivo.Close(); //Aqui fechamos a leitura
}
else
{
Debug.Log("Não existe jogo salvo");
}
}
public void NovoJogo()
{
if(File.Exists(DiretorioDoArquivo) == true)
{
Debug.Log("Ja existe um jogo salvo");
} else
{
SceneManager.LoadScene("Nivel1");
Save();
}
}
public void DeletarSave()
{
File.Delete(DiretorioDoArquivo);
Debug.Log("Save Deletado");
}
}
estou tentando usar uma lista para adicionar os gameobjects nela para pensar em uma maneira de salvar quando eles forem destruidos mas nem isso to conseguindo...
PedroC137- Iniciante
- PONTOS : 425
REPUTAÇÃO : 1
Idade : 23
Áreas de atuação : Estudante de desenvolvimento de jogos com Unity
Respeito as regras :
Tópicos semelhantes
» Salvar e carregar dados na Unity de objetos prefabs sem sobrescrever os dad
» Objetos (itens) pegos na cena anterior não são destruídos quando volta para ela
» Delay entre CENAS
» Transição de Cores Entre Cenas!
» SAVE E LOAD ENTRE CENAS
» Objetos (itens) pegos na cena anterior não são destruídos quando volta para ela
» Delay entre CENAS
» Transição de Cores Entre Cenas!
» SAVE E LOAD ENTRE CENAS
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos