Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ocultar boton al principio del juego

Iniciado por brok, Febrero 03, 2018, 01:01:26 PM

Tema anterior - Siguiente tema
Febrero 03, 2018, 01:01:26 PM Ultima modificación: Febrero 03, 2018, 01:04:53 PM por brok
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....
   


 
 

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.

Febrero 03, 2018, 07:37:21 PM #7 Ultima modificación: Febrero 03, 2018, 07:40:24 PM por lightbug
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);
        }
 
       
    }
    private void OnEnable()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += CargarComponentesVeiculos;
       
    }
    public void OnDisable()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= CargarComponentesVeiculos;
       
    }  
    public void CargarComponentesVeiculos(Scene scena, LoadSceneMode scenaModo)
    {
        if (scena.name == "Menu")
        {
           
            Continuar = GameObject.Find("Continuar").GetComponent<Button>();
            Continuar.onClick.AddListener(MenuSeleccionContinuar);
           
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            textoPuntos.text = "" + puntosMax;
        }
       
        if (scena.name == "MenuSeleccionContinuar")
        {
            int click = 0;
            Coche1Boton = GameObject.Find("Coche1").GetComponent<Button>();
            Moto1Boton = GameObject.Find("Moto1").GetComponent<Button>();
            if (click == 0)
            {
                Moto1Boton.onClick.AddListener(delegate { StartCoroutine(CargarMoto1()); });
               
                Coche1Boton.onClick.AddListener(delegate { StartCoroutine(CargarCoche1()); });
            }
        }
        if (scena.name == "MenuSeleccion")
        {
            int click = 0;
            Coche1Boton = GameObject.Find("Coche1").GetComponent<Button>();
            Moto1Boton = GameObject.Find("Moto1").GetComponent<Button>();
            if(click == 0)
            {
                Moto1Boton.onClick.AddListener(CargarMoto1Scena1);
                Coche1Boton.onClick.AddListener(CargarCoche1Scena1);
            }
        }
        DetruirCoche1();
        DestruirMoto1();
    }
    void DestruirMoto1()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= InstanciarVeiculosMoto1;
    }
    void DetruirCoche1()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= InstanciarVeiculosCoche1;
    }
    void CargarCoche1Scena1()
    {
        MenuSeleccion.menuSeleccion.ImagenCarga.SetActive(true);
        StartCoroutine(Loadlevelslider());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosCoche1;
    }
    void CargarMoto1Scena1()
    {
        MenuSeleccion.menuSeleccion.ImagenCarga.SetActive(true);
        StartCoroutine(Loadlevelslider());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosMoto1;
    }
    public void CargarCoche1Scena2()
    {
        MenuPausa.menuPausa.slider.enabled = true;
        StartCoroutine(Loadlevelslider2());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosCoche1;
    }
    public void CargarMoto1Scena2()
    {
        MenuPausa.menuPausa.slider.enabled = true;
        StartCoroutine(Loadlevelslider2());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosMoto1;
    }
    void InstanciarVeiculosCoche1(Scene scena, LoadSceneMode loadScene)
    {
 
       
        if (scena.name == "Scena01")
        {
           
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena01);
            Instantiate(Coche1Inst);
        }
        if (scena.name == "Scena02")
        {
           
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena02);
            Instantiate(Coche1Inst);
        }
       
    }
    void InstanciarVeiculosMoto1(Scene scena, LoadSceneMode loadScene)
    {
        if (scena.name == "Scena01")
        {
           
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena01);
            Instantiate(Moto1Inst);
        }
        if (scena.name == "Scena02")
        {
           
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena02);
            Instantiate(Moto1Inst);
        }
       
    }
 
    IEnumerator Loadlevelslider()
    {
        Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Scena01", LoadSceneMode.Single);
        while (!Asyn.isDone)
        {
            MenuSeleccion.menuSeleccion.slider.value = Asyn.progress;
            yield return null;
        }
    }
    IEnumerator Loadlevelslider2()
    {
        Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Scena02", LoadSceneMode.Single);
        while (!Asyn.isDone)
        {
            MenuPausa.menuPausa.slider.value = Asyn.progress;
            yield return null;
        }
    }
    public void Guardar()
    {
       
            BinaryFormatter bf = new BinaryFormatter();
            FileStream archivo = File.Create(rutaArchivo);
            DatosGuardar datos = new DatosGuardar(puntosMax, sceneName, continuar);
            scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
            datos.sceneName = scene.name;
            datos.puntosMax = puntosMax;
            datos.continuar = continuar;
            bf.Serialize(archivo, datos);
            archivo.Close();
       
       
           
    }
    public 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();
            puntosMax = datos.puntosMax;
            sceneName = datos.sceneName;
            continuar = datos.continuar;
           
            UnityEngine.SceneManagement.SceneManager.sceneLoaded += IntanciarCoche1Cargar;
            Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(datos.sceneName, LoadSceneMode.Single);
            while (!Asyn.isDone)
            {
                MenuSeleccion.menuSeleccion.slider.value = Asyn.progress;
                yield return null;
            }
        }
        else
        {
           
            puntosMax = 0;
        }
    }
    public IEnumerator CargarMoto1()
    {
        if (File.Exists(rutaArchivo))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream archivo = File.Open(rutaArchivo, FileMode.Open);
            DatosGuardar datos = (DatosGuardar)bf.Deserialize(archivo);
            archivo.Close();
           
            puntosMax = datos.puntosMax;
            sceneName = datos.sceneName;
            continuar = datos.continuar;
           
            UnityEngine.SceneManagement.SceneManager.sceneLoaded += IntanciarMoto1Cargar;
           
            Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(datos.sceneName, LoadSceneMode.Single);
            while (!Asyn.isDone)
            {
                MenuSeleccion.menuSeleccion.slider.value = Asyn.progress;
                yield return null;
            }
           
        }
        else
        {
           
            puntosMax = 0;
        }
    }
    void IntanciarMoto1Cargar(Scene scena, LoadSceneMode loadSceneMode)
    {
        if (scena.name == "Scena01")
        {
            DestruirMoto1Cargar();
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena02);
            Instantiate(Moto1Inst);
        }
        if (scena.name == "Scena02")
        {
            DestruirMoto1Cargar();
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena01);
            Instantiate(Moto1Inst);
        }
    }
    void IntanciarCoche1Cargar(Scene scena, LoadSceneMode loadSceneMode)
    {
        if (scena.name == "Scena01")
        {
            DestruirCoche1Cargar();
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena01);
            Instantiate(Coche1Inst);
        }
        if (scena.name == "Scena02")
        {
            DestruirCoche1Cargar();
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena02);
            Instantiate(Coche1Inst);
        }
       
    }
    void DestruirMoto1Cargar()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= IntanciarMoto1Cargar;
    }
    void DestruirCoche1Cargar()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= IntanciarCoche1Cargar;
    }
    void MenuSeleccionContinuar()
    {
        UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("MenuSeleccionContinuar");
    }
}
[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;
       
    }
}

 
 
 
Pero hay que modificar cosas porque esta mal.
 
 

aaaahh bueno ahora si, pero no tiene sentido que subas un código "reducido" y preguntes porque te da error, justo en la linea esa, porque cualquier cristiano te va a decir que el constructor ese o la manera de instanciar que estás usando esta mal.

Ya jajaja pero es como puedo explicarme mejor solo intento que me entiendan jajaja.

Consejo: Si vais a mostrar código completo, no lo peguéis aquí directamente. Usad algún servicio online como Pastebin o Hastebin.com, y pegad el enlace generado.
 
De otra forma, estáis dificultando la lectura de todo el hilo a los demás usuarios del foro.
 
 
 
Gracias.


Etiquetas: