Hola buenas a todos, tengo un problema y no se como solucionarlo, quiero que el boton continuar se desactive cuando inicia el juego y cuando carge el juego aparezca, cuando se haya
guardado dandole a nuevo juego y cargando la escena primera, funciona pero a medias, cuando estoy en el juego y le doy al boton salir vuelvo al menu aparece hasta hay todo bien, pero
cuando salgo del juego se vuelve a ocultar, tengo una variable del tipo entero que es la que desactiva y activa el boton, ¿porque se funciona en el juego y cuando lo quito se vuelve
a ocultar?, pongo los script.
Script GameManager:
public class JuegoManager : MonoBehaviour {
public int continuar;
public void Guardar()
{
BinaryFormatter bf = new BinaryFormatter();
FileStream archivo = File.Create(rutaArchivo);
DatosGuardar datos = new DatosGuardar(continuar);
datos.continuar = continuar;
bf.Serialize(archivo, datos);
archivo.Close();
}
IEnumerator CargarCoche1()
{
if (File.Exists(rutaArchivo))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream archivo = File.Open(rutaArchivo, FileMode.Open);
DatosGuardar datos = (DatosGuardar)bf.Deserialize(archivo);
archivo.Close();
continuar = datos.continuar;
}
}
[Serializable]
class DatosGuardar
{
public int continuar;
public DatosGuardar(int continuar)
{
this.continuar = continuar;
}
}
Script Player:
public class Car1Motor : MonoBehaviour {
void Start()
{
JuegoManager.juegoControlador.continuar = 1;
}
void Update()
{
JuegoManager.juegoControlador.Guardar();
}
}
Script ocultar botones;
public class MenuOcultar : MonoBehaviour {
public GameObject continuar;
void Start () {
if(JuegoManager.juegoControlador.continuar == 0)
{
continuar.SetActive(false);
}
if (JuegoManager.juegoControlador.continuar == 1)
{
continuar.SetActive(true);
}
}
}
Menu principal:
public class CargandoScena : MonoBehaviour
{
public void Salir()
{
JuegoManager.juegoControlador.continuar = 1;
JuegoManager.juegoControlador.Guardar();
Application.Quit();
}
}
Espero haberme explicado bien y toda ayuda es buena, garacias.
hola
asi a simple vista no se muy bien donde cargas los datos... es en iEnumerator cargarCoche1?
bueno... los scripts "player", "ocultarBotones" y "menu principal" parecen estar bien...
al crearse un "player" se cambia el valor de continuar a 1....
en la "void salir" tambien cambias a 1...
y en ocultarBotones compruebas a ver que valor tiene... y ocultas o muetras....
eso parece estar bien...
...yo creo que en el script "gameManager" deverias poner la variable "DatosGuardar datos" fuera de la "void guardar"... directamente en la public class "juegoManager".... porque al estar dentro del "void guardar" cada vez que llames a esa funcion se creara un "DatosGuardar datos" y al acabar de ejecutar esa funcion(void Guardar) se destruira... ...y creo que habria que ponerlo "fuera"... y ponerlo como "public"...
public class juegoManager : MonoBehaviour {
public int continuar = 0;
public DatosGuardar datos = new DatosGuardar(continuar);
...
aunque no se si sera eso.... no tengo muy claro lo que falla....
Cita de: Igor date=1517665643hola
asi a simple vista no se muy bien donde cargas los datos... es en iEnumerator cargarCoche1?
bueno... los scripts "player", "ocultarBotones" y "menu principal" parecen estar bien...
al crearse un "player" se cambia el valor de continuar a 1....
en la "void salir" tambien cambias a 1...
y en ocultarBotones compruebas a ver que valor tiene... y ocultas o muetras....
eso parece estar bien...
...yo creo que en el script "gameManager" deverias poner la variable "DatosGuardar datos" fuera de la "void guardar"... directamente en la public class "juegoManager".... porque al estar dentro del "void guardar" cada vez que llames a esa funcion se creara un "DatosGuardar datos" y al acabar de ejecutar esa funcion(void Guardar) se destruira... ...y creo que habria que ponerlo "fuera"... y ponerlo como "public"...
public class juegoManager : MonoBehaviour {
public int continuar = 0;
public DatosGuardar datos = new DatosGuardar(continuar);
...
aunque no se si sera eso.... no tengo muy claro lo que falla....
(//<fileStore.core_Attachment>/monthly_2018_02/incoerencia.jpg.ba7ecf0fa02520d460ddf0d93d719545.jpg)
Me sale esto
lo pongo como publico y me da error en las variables
la clase DatosGuerdar
LO que ocurre es que funciona cuando el juego esta activo pero cuando lo apago no funciona vulve la variable continuar a 0
Lo del enumerator lo cargo con un botón.
Coche1Boton.onClick.AddListener(delegate { StartCoroutine(CargarCoche1()); });
El código no lo je puesto entero porque es muy largo. Esta resumido.
Es como si solo se guardara en memoria del sistema, me pasa lo algo parecido con los puntos cuando le doy a salir del nivel 1 y le doy a nuevo juego que elimina el los datos de guardado me muestra los puntos que tenia como si le diese a continuar es como si no guardara nada en el archivo después de salir de la aplicación.
Me he saso cuenta que es que no me carga el archivo de la partida aunque le ponga CargarCoche1(); CargarMoto1(); en el Awake en el JuegoManager.
Cita de: brok date=1517670581Me sale esto
lo pongo como publico y me da error en las variables
la clase DatosGuerdar
Supongo que será porque la clase DatosGuardar no es publica y estás creando una instancia publica de un objeto de ella? pasa lo mismo cuando creas un private enum Tipos{...} y despues hacés public enum Tipos tipos, este ultimo es publico pero el enum es privado, la accesibilidad es incoherente como te dice el mensaje. Y supongo que tenés un constructor acorde para poner "puntosmax, scenename, continuar".
Cita de: lightbug date=1517682188Supongo que será porque la clase DatosGuardar no es publica y estás creando una instancia publica de un objeto de ella? pasa lo mismo cuando creas un private enum Tipos{...} y despues hacés public enum Tipos tipos, este ultimo es publico pero el enum es privado, la accesibilidad es incoherente como te dice el mensaje. Y supongo que tenés un constructor acorde para poner "puntosmax, scenename, continuar".
Todabia soy muy nuevo en esto no se que es un contructor.
Cita de: brok date=1517682354Todabia soy muy nuevo en esto no se que es un contructor.
si tenés tu clase:
class MiClase{
int var1;
int var2;
public MiClase(int valor1;, int valor2)
{
var1 = valor1;
var2 = valor2;
}
}
el método raro ese (fijate que raro porque tiene solo un public MiClase) es el constructor, podés tener los que quieras (EJ: podés hacer new GameObject() o new GameObject("objeto")), es más vos tenés uno hecho, en Datosguardar. Lo que te decía es que como estás pasando varios argumentos cuando hacés el "new Datosguardar (...)", si no tenés un constructor acorde te va a tirar error.
La verdad es que te entiendo a medias ¿Cómo hago el constructor acorde? poniendo esto
.
[Serializable]
Public class DatosGuardar
{
public int continuar;
public DatosGuardar(int continuar)
{
this.continuar = continuar;
}
}
me da error en las variables con esto.
DatosGuardar datos = new DatosGuardar(puntosMax, sceneName, continuar);
Fuera de la funcion guardar.
Al principio
Este es el contructor que tengo.
[Serializable]
public class DatosGuardar
{
public int puntosMax;
public string sceneName;
public int continuar;
public DatosGuardar(int puntosMax, string sceneName, int continuar)
{
this.puntosMax = puntosMax;
this.sceneName = sceneName;
this.continuar = continuar;
}
}
Hombre, fijate tu constructor:
public DatosGuardar(int continuar)
{
this.continuar = continuar;
}
y fiajte cuando querés usarlo:
...new DatosGuardar(puntosMax, sceneName, continuar);
tenés 1 argumento vs 3 argumentos
Que los script que puse estan resumidos para no poner todo. Para que se entendiera mejor.
Este es el script entero.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class JuegoManager : MonoBehaviour {
public static JuegoManager juegoControlador;
public GameObject Coche1Inst;
public GameObject Moto1Inst;
private AsyncOperation Asyn;
private Button Coche1Boton;
private Button Moto1Boton;
private Button Continuar;
public AudioClip audioClipMusicaScena01;
public AudioClip audioClipMusicaScena02;
public int puntosSalt;
private Text textoPuntos;
public int puntosMax;
public string rutaArchivo;
public string sceneName;
public Scene scene;
public int continuar;
public static JuegoManager Juego
{
get; set;
}
private void Awake ()
{
textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
rutaArchivo = Application.persistentDataPath + "/data.dat";
if (juegoControlador == null)
{
juegoControlador = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject