Salvar dados
3 participantes
Página 1 de 1
Salvar dados
Olá estou tentando criar um sistema para salvar os dados da cena, vi alguns tutoriais sobre salvar em binário e que para tanto não posso referenciar nada do meu arquivo de gerenciamento como publico. mas encontrei problemas logo de cara para salvar as barras de estamina e vida.
Ambas usam slider para definir seu valor.
Como podem ver só implementei a estamina por enquanto.
Mas ai vem o problema, não sei como pegar esse dado da barra estamina e envia-lo ao script de game manager e depois busca-lo novamente quando o save for recarregado.
Ainda não implementei nada neste script, mas só para terem uma ideia do que se trata. Pensei em criar uma void no UImanager que enviasse o valor para o Game manager, mas como defino o valor do slider barrastamina?
Agradeço se puderem me ajudar neste problema.
Ambas usam slider para definir seu valor.
- Código:
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;
using System;
public class UIManager : MonoBehaviour {
public static UIManager instance;
public Slider barrastamina, BarraDeVida;
public float perda, ganho;
public int QuantSede=0;
private bool Sede=false;
// Use this for initialization
void Awake ()
{
}
// Update is called once per frame
void Update ()
{
//===========================================Controle da Stamina===========================================//
if (Time.timeScale > 0)
{
if (Input.GetKey(KeyCode.LeftShift))
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value -= perda;
QuantSede++;
}
}
if (Input.GetKey(KeyCode.Space))
{
barrastamina.value -= perda / 2;
QuantSede++;
}
if (Input.GetKey(KeyCode.Mouse0))
{
barrastamina.value -= perda / 2;
QuantSede++;
}
if (Sede == false)
{
if (barrastamina.value > 2)
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value += ganho / 3;
}
else
{
barrastamina.value += ganho;
}
}
else
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value += ganho / 20;
}
else
{
barrastamina.value += ganho;
}
}
}
if (QuantSede >= 15000)
{
Sede = true;
}
else
{
Sede = false;
}
}
}
}
Como podem ver só implementei a estamina por enquanto.
Mas ai vem o problema, não sei como pegar esse dado da barra estamina e envia-lo ao script de game manager e depois busca-lo novamente quando o save for recarregado.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour {
public static GameManager instance;
// Use this for initialization
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != null)
{
Destroy(gameObject);
}
}
// Update is called once per frame
void Update ()
{
}
}
Ainda não implementei nada neste script, mas só para terem uma ideia do que se trata. Pensei em criar uma void no UImanager que enviasse o valor para o Game manager, mas como defino o valor do slider barrastamina?
Agradeço se puderem me ajudar neste problema.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Salvar dados
Voce vai ter que fazer no script as variaveis int ou float
E salvalas no outro script.
EX:
E salvalas no outro script.
EX:
- Código:
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;
using System;
public class UIManager : MonoBehaviour {
public static UIManager instance;
public float stamina = 100;
public float Vida = 100;
public Slider barrastamina, BarraDeVida;
public float perda, ganho;
public int QuantSede=0;
private bool Sede=false;
// Use this for initialization
void Awake ()
{
}
// Update is called once per frame
void Update ()
{
barrastamina.value = stamina;
BarraDeVida.value = Vida;
//===========================================Controle da Stamina===========================================//
if (Time.timeScale > 0)
{
if (Input.GetKey(KeyCode.LeftShift))
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value -= perda;
QuantSede++;
}
}
if (Input.GetKey(KeyCode.Space))
{
barrastamina.value -= perda / 2;
QuantSede++;
}
if (Input.GetKey(KeyCode.Mouse0))
{
barrastamina.value -= perda / 2;
QuantSede++;
}
if (Sede == false)
{
if (barrastamina.value > 2)
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value += ganho / 3;
}
else
{
barrastamina.value += ganho;
}
}
else
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value += ganho / 20;
}
else
{
barrastamina.value += ganho;
}
}
}
if (QuantSede >= 15000)
{
Sede = true;
}
else
{
Sede = false;
}
}
}
}
Re: Salvar dados
Não sei o que fiz mas minha resposta não apareceu, se aparecer para vocês desculpem a duplicidade.
Consegui salvar os dados, tive problemas pelo teste da "cena", mas criei uma outra variável e armazenei os dados quando estava pausado, então só tive de fazer um teste para me certificar que não estava salvando o main menu. Pensando agora acho que vou testar a cena pelo nome dela, se for "main menu" salvo a anterior.
Agora estou com uma duvida. Carreguei o jogo e tudo funcionou, mas se volto ao menu principal e tento carregar o jogo novamente, não consigo. Também percebi que quando entro no jogo pela primeira vez e clico em new game ele carrega o save, sendo necessário voltar ao "main menu" e clicar novamente em new game.
Consegui salvar os dados, tive problemas pelo teste da "cena", mas criei uma outra variável e armazenei os dados quando estava pausado, então só tive de fazer um teste para me certificar que não estava salvando o main menu. Pensando agora acho que vou testar a cena pelo nome dela, se for "main menu" salvo a anterior.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour {
public static GameManager instance;
private SaveGameData savedGame;
private float barraStaminaDados;
private const string File_Path = "saveGameData.dat";
private bool isNewGame=false;
private Vector3 positionPlayerDados;
private int stageAnte,stageAtual;
// Use this for initialization
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != null)
{
Destroy(gameObject);
}
}
private void Start()
{
Load();
}
private void Update()
{
if(Time.timeScale==0)
{
stageAnte = SceneManager.GetActiveScene().buildIndex;
}
}
void OnEnable()
{
PLAYER.PlayerPosicao += OnPlayerPosicao;
UIManager.StaminaControl += OnStaminaControl;
SceneManager.sceneLoaded += OnStageLoad;
}
private void OnDisable()
{
PLAYER.PlayerPosicao -= OnPlayerPosicao;
UIManager.StaminaControl -= OnStaminaControl;
SceneManager.sceneLoaded -= OnStageLoad;
}
void OnPlayerPosicao()
{
positionPlayerDados = PLAYER.positionPlayer;
}
void OnStaminaControl()
{
barraStaminaDados = UIManager.valBarraStamina;
}
void OnStageLoad(Scene scene, LoadSceneMode mode)
{
if (!isNewGame && savedGame!=null)
{
barraStaminaDados = savedGame.barraStaminaSave;
UIManager.valBarraStamina = barraStaminaDados;
PLAYER.instance.transform.position = new Vector3(savedGame.spositionX, savedGame.spositionY, savedGame.spositionZ);
isNewGame = true;
UIManager.instance.UpdateUI();
}
}
void SceneControl()
{
stageAtual= SceneManager.GetActiveScene().buildIndex;
if (stageAtual != stageAnte)
{
stageAtual = stageAnte;
}
}
public void SaveGame()
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(Path.Combine(Application.streamingAssetsPath, File_Path));
SaveGameData save = new SaveGameData();
save.barraStaminaSave = barraStaminaDados;
save.spositionX = positionPlayerDados.x;
save.spositionY = positionPlayerDados.y;
save.spositionZ = positionPlayerDados.z;
save.stage = stageAtual;
bf.Serialize(file, save);
file.Close();
}
public void Load()
{
if (File.Exists(Path.Combine(Application.streamingAssetsPath, File_Path)))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Path.Combine(Application.streamingAssetsPath, File_Path), FileMode.Open);
SaveGameData save = (SaveGameData) bf.Deserialize(file);
savedGame = save;
file.Close();
}
}
private void OnApplicationQuit()
{
SceneControl();
SaveGame();
}
public void NewGame()
{
isNewGame = true;
LoadStage(1);
}
public void LoadGame()
{
isNewGame = false;
Load();
LoadStage(savedGame.stage);
}
public void LoadStage(int stage)
{
SceneManager.LoadScene(stage);
}
}
[Serializable]
class SaveGameData
{
public float barraStaminaSave;
public float spositionX;
public float spositionY;
public float spositionZ;
public int stage;
}
Agora estou com uma duvida. Carreguei o jogo e tudo funcionou, mas se volto ao menu principal e tento carregar o jogo novamente, não consigo. Também percebi que quando entro no jogo pela primeira vez e clico em new game ele carrega o save, sendo necessário voltar ao "main menu" e clicar novamente em new game.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Salvar dados
Você diz acrescentar um evento para carregar o jogo no menu de pausa, além do menu principal?
Posso até tentar, mas acho que meu problema é que ele só salva quando fecho e como o arquivo deserealiza quando carrego ele não aceita carregar novamente.
eu poderia fazer como você diz, mas serializar o save na transição e cena. Isso não daria problemas se a cena alterasse mais de uma vez?
Posso até tentar, mas acho que meu problema é que ele só salva quando fecho e como o arquivo deserealiza quando carrego ele não aceita carregar novamente.
eu poderia fazer como você diz, mas serializar o save na transição e cena. Isso não daria problemas se a cena alterasse mais de uma vez?
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Salvar dados
vc poderia fazer isso por PlayerPrefab, salvar em binario ou salvar em um banco de dados como o do firebase.
pensando em colocar o jogo no mercado acho que vc poderia pensar em usar o firebase por que ele já tem exemplos para vc fazer um esquema de login, importa e exporta dados,salvar pontuação e depois puxar do banco de dados entre outra coisas como analytics
pensando em colocar o jogo no mercado acho que vc poderia pensar em usar o firebase por que ele já tem exemplos para vc fazer um esquema de login, importa e exporta dados,salvar pontuação e depois puxar do banco de dados entre outra coisas como analytics
brunocvz- Iniciante
- PONTOS : 3014
REPUTAÇÃO : 7
Respeito as regras :
Re: Salvar dados
Eu consigo salvar, e percebi que o meu problema era na booleana de novo jogo, mas estou tendo um novo problema. o script base para salvar em binário vi em tutorial, mas acrescentei algumas funções a mais para testar cenas e guardar variáveis temporárias. Agora quando quero iniciar um novo jogo ele carrega todos os dados do save.
Por ultimo meu script de controle de UI... também mantem os dados salvos, não começa um jogo com novos dados.
Agradeço se alguém puder me ajudar.
Na minha cena "Main Menu" eu "setei" a função New Game e Load em seus respectivos botões.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PLAYER : MonoBehaviour {
public static PLAYER instance;
public delegate void PlayerDados();
public static event PlayerDados PlayerPosicao;
public static event PlayerDados PlayerLevel;
public static event PlayerDados PlayerXP;
public static float vidaPlayer = 100;
public static int playerLVLDados =1, xpPlayerDados=0;
public static Vector3 positionPlayer;
private int playerLVL =1, xpPlayer = 0;
private int xpDoInimigo;
public int Teste_xp_que_vira_do_inimigo;
//--------------------------Use this Before Inicialization-----------------------------------//
private void Awake()
{
if (instance == null)
{
instance = this;
}
else if (instance != null)
{
Destroy(gameObject);
}
PlayerLevel();
PlayerXP();
}
public void PosicaoInicial()
{
Debug.Log("Posição Inicial " + this.transform.position);
}
public void DadosAtual()
{
playerLVL = playerLVLDados;
xpPlayer = xpPlayerDados;
}
void Experience()
{
xpDoInimigo = Teste_xp_que_vira_do_inimigo;
xpPlayer = xpPlayer + xpDoInimigo;
xpPlayerDados = xpPlayer;
xpDoInimigo = 0;
PlayerXP();
if (xpPlayer >= (100f * playerLVL*(playerLVL+(playerLVL-1))))
{
playerLVL++;
playerLVLDados = playerLVL;
PlayerLevel();
Debug.Log("LVL " + playerLVL);
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.L))
{
Experience();
}
positionPlayer = transform.position;
if (Time.timeScale == 0)
{
PlayerPosicao();
}
}
}
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour {
public static GameManager instance;
private SaveGameData savedGame;
private float barraStaminaDados;
private const string File_Path = "saveGameData.dat";
private bool isNewGame = false;
private Vector3 positionPlayerDados;
private int stageAnte,stageAtual, playerLVLdadosGM, playerXPdadosGM;
private string stageAtualName;
public static float valBarraStaminaInicial;
// Use this for initialization
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != null)
{
Destroy(gameObject);
}
}
private void Start()
{
Load();
}
private void Update()
{
if(Time.timeScale==0)
{
stageAnte = SceneManager.GetActiveScene().buildIndex;
}
}
void OnEnable()
{
PLAYER.PlayerPosicao += OnPlayerPosicao;
PLAYER.PlayerLevel += OnPlayerLevelGM;
PLAYER.PlayerXP += OnPlayerXPGM;
UIManager.StaminaControl += OnStaminaControl;
SceneManager.sceneLoaded += OnStageLoad;
}
private void OnDisable()
{
PLAYER.PlayerPosicao -= OnPlayerPosicao;
PLAYER.PlayerLevel -= OnPlayerLevelGM;
PLAYER.PlayerXP -= OnPlayerXPGM;
UIManager.StaminaControl -= OnStaminaControl;
SceneManager.sceneLoaded -= OnStageLoad;
}
void OnPlayerXPGM()
{
playerXPdadosGM = PLAYER.xpPlayerDados;
}
void OnPlayerLevelGM()
{
playerLVLdadosGM = PLAYER.playerLVLDados;
}
void OnPlayerPosicao()
{
positionPlayerDados = PLAYER.positionPlayer;
}
void OnStaminaControl()
{
barraStaminaDados = UIManager.valBarraStamina;
}
void OnStageLoad(Scene scene, LoadSceneMode mode)
{
if (isNewGame==false && savedGame!=null)
{
UIManager.valBarraStamina = savedGame.barraStaminaSave;
PLAYER.playerLVLDados = savedGame.splayerLVL;
PLAYER.xpPlayerDados = savedGame.splayerXP;
PLAYER.instance.transform.position = new Vector3(savedGame.spositionX, savedGame.spositionY, savedGame.spositionZ);
//===================================Atualiza os Dados nos Respectivos Scripts=======================================================//
PLAYER.instance.DadosAtual();
UIManager.instance.UpdateUI();
isNewGame = true;
}
else
{
}
}
void SceneControl()
{
stageAtualName = SceneManager.GetActiveScene().name;
stageAtual= SceneManager.GetActiveScene().buildIndex;
if (stageAtualName=="Main Menu")
{
stageAtual = stageAnte;
}
}
public void SaveGame()
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(Path.Combine(Application.streamingAssetsPath, File_Path));
SaveGameData save = new SaveGameData();
save.barraStaminaSave = barraStaminaDados;
save.spositionX = positionPlayerDados.x;
save.spositionY = positionPlayerDados.y;
save.spositionZ = positionPlayerDados.z;
save.stage = stageAtual;
save.splayerLVL = playerLVLdadosGM;
save.splayerXP = playerXPdadosGM;
bf.Serialize(file, save);
file.Close();
}
public void Load()
{
if (File.Exists(Path.Combine(Application.streamingAssetsPath, File_Path)))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Path.Combine(Application.streamingAssetsPath, File_Path), FileMode.Open);
SaveGameData save = (SaveGameData) bf.Deserialize(file);
savedGame = save;
file.Close();
}
}
private void OnApplicationQuit()
{
SceneControl();
SaveGame();
positionPlayerDados = new Vector3(-781.5f, 1.2f, 110f);
Debug.Log("OnApplicationQuit "+ positionPlayerDados);
}
public void NewGame()
{
PLAYER.positionPlayer = new Vector3(-780.5f, 1.2f, 110f);
PLAYER.playerLVLDados = 1;
PLAYER.xpPlayerDados = 0;
valBarraStaminaInicial = 100;
UIManager.valBarraStamina = valBarraStaminaInicial;
PLAYER.instance.DadosAtual();
PLAYER.instance.PosicaoInicial();
UIManager.instance.UpdateUI();
Debug.Log("teste");
isNewGame = true;
LoadStage(1);
}
public void LoadGame()
{
isNewGame = false;
Load();
LoadStage(savedGame.stage);
}
public void LoadStage(int stage)
{
SceneManager.LoadScene(stage);
}
}
[Serializable]
class SaveGameData
{
public float barraStaminaSave;
public float spositionX;
public float spositionY;
public float spositionZ;
public int stage;
public int splayerLVL;
public int splayerXP;
}
- Código:
isNewGame = true;
LoadStage(1);
Por ultimo meu script de controle de UI... também mantem os dados salvos, não começa um jogo com novos dados.
- Código:
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;
using System;
public class UIManager : MonoBehaviour {
public static UIManager instance;
public delegate void UICondicao();
public static event UICondicao StaminaControl;
public Slider barrastamina, barraDeVida;
public float perda, ganho, gastStamina, ganhoStamina;
public int QuantSede=0 , playerLVLDadosUI;
private bool Sede=false;
public static float valBarraStamina;
// Use this for initialization
void Awake()
{
if (instance == null)
{
instance = this;
}
else if (instance != null)
{
Destroy(gameObject);
}
}
private void OnEnable()
{
PLAYER.PlayerLevel += OnUIPlayerLevel;
}
private void OnDisable()
{
PLAYER.PlayerLevel -= OnUIPlayerLevel;
}
void OnUIPlayerLevel()
{
playerLVLDadosUI = PLAYER.playerLVLDados;
gastStamina = perda - playerLVLDadosUI / 200f;
ganhoStamina = ganho + playerLVLDadosUI / 200f;
}
// Update is called once per frame
void Update ()
{
if (Time.timeScale == 0 && valBarraStamina!=barrastamina.value)
{
valBarraStamina = (float)barrastamina.value;
StaminaControl();
}
//===========================================Controle da Stamina===========================================//
if (Time.timeScale > 0)
{
if (Input.GetKey(KeyCode.LeftShift))
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value -= gastStamina;
QuantSede++;
}
}
if (Input.GetKey(KeyCode.Space))
{
barrastamina.value -= gastStamina / 2;
QuantSede++;
}
if (Input.GetKey(KeyCode.Mouse0))
{
barrastamina.value -= gastStamina / 2;
QuantSede++;
}
if (Sede == false)
{
if (barrastamina.value > 2)
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value += ganhoStamina / 3;
}
else
{
barrastamina.value += ganhoStamina;
}
}
else
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
barrastamina.value += ganhoStamina / 20;
}
else
{
barrastamina.value += ganhoStamina;
}
}
}
if (QuantSede >= 15000)
{
Sede = true;
}
else
{
Sede = false;
}
}
}
public void UpdateUI()
{
barrastamina.value = valBarraStamina;
Debug.Log("Update UI" + GameManager.valBarraStaminaInicial);
}
}
Agradeço se alguém puder me ajudar.
Na minha cena "Main Menu" eu "setei" a função New Game e Load em seus respectivos botões.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Salvar dados
Olá a todos, ainda continuo com esse problema em começar um novo jogo, mas fiz dezenas de testes (acho que centenas) e descobri que meu problema é no acionamento do button New Game.
como podem ver, a função new game tem várias definições, mas nenhuma é acionada.
Somente a void LoadStage é ativada. Alguém sabe me dizer o motivo?
O interessante que o button Carregar, que possui o script:
Agradeço se alguém puder me explicar esse Bug.
como podem ver, a função new game tem várias definições, mas nenhuma é acionada.
- Código:
public void NewGame()[size=14][/size] {[size=14][/size] PLAYER.positionPlayer = new Vector3(-780.5f, 1.2f, 110f);[size=14][/size] PLAYER.playerLVLDados = 1;[size=14][/size] PLAYER.xpPlayerDados = 0;[size=14][/size] valBarraStaminaInicial = 100;[size=14][/size] UIManager.valBarraStamina = valBarraStaminaInicial;[size=14][/size] PLAYER.instance.DadosAtual();[size=14][/size] PLAYER.instance.PosicaoInicial();[size=14][/size] UIManager.instance.UpdateUI();[size=14][/size] Debug.Log("teste");[size=14][/size] isNewGame = true;[size=14][/size] LoadStage(1);
}[size=14][/size][b][/b][i][/i][u][/u][sub][/sub][sup][/sup][strike][/strike]
Somente a void LoadStage é ativada. Alguém sabe me dizer o motivo?
O interessante que o button Carregar, que possui o script:
- Código:
public void LoadGame()[size=14][/size] {[size=14][/size] isNewGame = false;[size=14][/size] Load();[size=14][/size] LoadStage(savedGame.stage);[size=14][/size] }[b][/b][i][/i][u][/u][sub][/sub][sup][/sup][strike][/strike]
Agradeço se alguém puder me explicar esse Bug.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Tópicos semelhantes
» Unity - Salvar os Dados do Jogador Online
» Salvar dados unity
» Tem como eu Salvar os Dados de Um Terreno?
» unity - erro ao salvar dados
» Salvar dados do player ao trocar de cenas
» Salvar dados unity
» Tem como eu Salvar os Dados de Um Terreno?
» unity - erro ao salvar dados
» Salvar dados do player ao trocar de cenas
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos