Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: brok en Febrero 03, 2018, 01:01:26 PM

Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 01:01:26 PM
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.
Título: Ocultar boton al principio del juego
Publicado por: Igor en Febrero 03, 2018, 02:47:23 PM
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....
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 04:09:41 PM
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.
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 05:19:19 PM
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.
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 05:50:41 PM
Título: Ocultar boton al principio del juego
Publicado por: lightbug en Febrero 03, 2018, 07:23:08 PM
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".
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 07:25:54 PM
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.
Título: Ocultar boton al principio del juego
Publicado por: lightbug en Febrero 03, 2018, 07:37:21 PM
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.
 
 
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 07:47:14 PM
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;
       
    }
}

 
 
Título: Ocultar boton al principio del juego
Publicado por: lightbug en Febrero 03, 2018, 07:50:48 PM
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
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 07:53:07 PM
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.
 
 
Título: Ocultar boton al principio del juego
Publicado por: lightbug en Febrero 03, 2018, 07:58:37 PM
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.
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 08:01:11 PM
Ya jajaja pero es como puedo explicarme mejor solo intento que me entiendan jajaja.
Título: Ocultar boton al principio del juego
Publicado por: pioj en Febrero 03, 2018, 09:11:09 PM
Consejo: Si vais a mostrar código completo, no lo peguéis aquí directamente. Usad algún servicio online como Pastebin (http://www.pastebin.com) o Hastebin.com (http://www.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.
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 09:15:06 PM
Gracias lo tendre en cuenta
Título: Ocultar boton al principio del juego
Publicado por: lightbug en Febrero 03, 2018, 10:59:21 PM
Cita de: brok date=1517684471Ya jajaja pero es como puedo explicarme mejor solo intento que me entiendan jajaja.
   


Jajaj cuando posteaste el código completo pensaba entre mi "acá viene Pioj en cualquier momento a recomendar pastebin"... dicho y hecho .
 
Yo uso este (https://ghostbin.com/), es taaan lindo.
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 03, 2018, 11:50:41 PM
Cita de: lightbug date=1517695161Jajaj cuando posteaste el código completo pensaba entre mi "acá viene Pioj en cualquier momento a recomendar pastebin"... dicho y hecho .
   
   
      Yo uso este (https://ghostbin.com/), es taaan lindo.
   


Gracias.
 
Bueno pongo lo que modificado del script y si alguien me puede ayudar porque no me carga los datos al cerrar la aplicación.
 
GameManager (https://pastebin.com/f8R50JQs)
 
es como si solo cargara los datos en la memoria del sistema cuando le doy a nuevo juego y borro los archivos siguen suigue cargagdo los puntos y todo.
Título: Ocultar boton al principio del juego
Publicado por: brok en Febrero 04, 2018, 03:18:51 PM
Solucionado jajjajaja, dejo a qui el código para quien le sirva.GameManager (https://pastebin.com/f8R50JQs)