Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: brok en Febrero 01, 2018, 08:04:23 PM

Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 01, 2018, 08:04:23 PM
Hola buenas a todos, tengo un problema estoy haciendo el sistema de guardado y tengo este script y no se como cargar la escana guardada sin que me de error de que el index es -1 o violación de el archivo de datos esta en la función cargar¿que devo poner para que me carge la escena con este script.
 

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;
    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 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;
       
    }  
    void CargarComponentesVeiculos(Scene scena, LoadSceneMode scenaModo)
    {
        if (scena.name == "Menu")
        {
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            textoPuntos.text = "" + puntosSalt;
        }
 
        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 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);
        }
       
    }
    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.Cargando.SetActive(true);
        StartCoroutine(Loadlevelslider2());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosCoche1;
    }
    public void CargarMoto1Scena2()
    {
        MenuPausa.menuPausa.Cargando.SetActive(true);
        StartCoroutine(Loadlevelslider2());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosMoto1;
    }
    IEnumerator Loadlevelslider()
    {
        Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Scena01");
       
        while (!Asyn.isDone)
        {
            MenuSeleccion.menuSeleccion.slider.value = Asyn.progress;
            yield return null;
        }
    }
    IEnumerator Loadlevelslider2()
    {
        Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Scena02");
        while (!Asyn.isDone)
        {
            MenuSeleccion.menuSeleccion.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);
        scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
        datos.sceneName = scene.name;
        datos.puntosMax = puntosMax;
       
        bf.Serialize(archivo, datos);
        archivo.Close();
       
           
    }
    public void Cargar()
    {
        if (File.Exists(rutaArchivo))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream archivo = File.Open(rutaArchivo, FileMode.Open);
            DatosGuardar datos = (DatosGuardar)bf.Deserialize(archivo);
            puntosMax = datos.puntosMax;
            textoPuntos.text = "" + puntosMax;
            archivo.Close();
        }
        else
        {
            puntosMax = 0;
        }
    }
}
[Serializable]
class DatosGuardar
{
    public int puntosMax;
    public string sceneName;
   
    public DatosGuardar(int puntosMax, string sceneName)
    {
        this.puntosMax = puntosMax;
        this.sceneName = sceneName;
    }
}

 
 
 
guardar me guarda la escena
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 01, 2018, 09:49:57 PM
poniendo esto me sale el error.
 

public void Cargar()
    {
        if (File.Exists(rutaArchivo))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream archivo = File.Open(rutaArchivo, FileMode.Open);
            DatosGuardar datos = (DatosGuardar)bf.Deserialize(archivo);
            puntosMax = datos.puntosMax;
            textoPuntos.text = "" + puntosMax;
            datos.sceneName = scene.name;
           
            UnityEngine.SceneManagement.SceneManager.LoadScene(datos.sceneName);
            archivo.Close();
        }
        else
        {
            puntosMax = 0;
        }
    }

 
Cannot load scene: Invalid scene name (empty string) and invalid build index -1

UnityEngine.SceneManagement.SceneManager:LoadScene(String)

JuegoManager:Cargar() (at Assets/Alejandro Director/Scripts/JuegoManager.cs:233)

Car1Motor:Start() (at Assets/Alejandro Director/Scripts/Car1Motor.cs:47)
 
en car motor tengo puesto esto.
 

private void Start()
    {
        JuegoManager.juegoControlador.rutaArchivo = Application.persistentDataPath + "/data.dat";
        textoPuntos.text = "" + JuegoManager.juegoControlador.puntosSalt;
        JuegoManager.juegoControlador.Cargar();
    }

 
 
Título: Cargar escena guardada como binario
Publicado por: lightbug en Febrero 01, 2018, 10:32:32 PM
Hola , probaste solamente la instrucción de LoadScene sin todo eso encima, solo pasando el string correspondiente? osea, simulalo, inventá un string, ponele sceneName = "tuNivel" y fijate si carga
 

public string sceneName = "tuNivel"
...
UnityEngine.SceneManagement.SceneManager.LoadScene(sceneName);

 
Por supuesto supongo que incluiste la escena en el Build... aunque no se ya que te dice que el buildIndex es erroneo, chequealo.
 
Te comento, yo he tenido varios problemas manejando strings para cargar escenas, quizás sea un problema mio, pero siempre recurrí a los índices, nunca me fallaron.
 
 
 
Y otra cosa, siempre que termines de pasar los datos de carga cerrá el archivo, no despues de cargar, seguramente no cambie en nada ni tenga mucho que ver, pero es mucho queda un pelín más prolijo.
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 02, 2018, 07:32:31 AM

public void Cargar()
    {
        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;
            textoPuntos.text = "" + puntosMax;
            sceneName = datos.sceneName;
            UnityEngine.SceneManagement.SceneManager.LoadScene(datos.sceneName);
           
        }
        else
        {
            puntosMax = 0;
        }
       
    }

 
He probado a sin y me funciona pero me carga la escena01 y no me instancia el player
 
 
Título: Cargar escena guardada como binario
Publicado por: J_L en Febrero 02, 2018, 08:46:11 AM
No tengo ni idea del tema, pero una vez que te funciona cargar yo miraría lo que te está guardando en scene.name?
 
Si lo que guarda es escena01 y lo que carga es escena01 entonces esa parte funciona correctamente por lo tanto si no carga el player se puede deber a que el player lo creas en otra escena que no destruyes gracias al singleton y que no estás cargando, para que no se destruya en no destruir en carga, a través de las escenas.
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 02, 2018, 01:20:31 PM

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.Cargando.SetActive(true);
        StartCoroutine(Loadlevelslider2());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosCoche1;
    }
    public void CargarMoto1Scena2()
    {
        MenuPausa.menuPausa.Cargando.SetActive(true);
        StartCoroutine(Loadlevelslider2());
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += InstanciarVeiculosMoto1;
    }
    IEnumerator Loadlevelslider()
    {
        Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Scena01");
       
        while (!Asyn.isDone)
        {
            MenuSeleccion.menuSeleccion.slider.value = Asyn.progress;
            yield return null;
        }
    }
    IEnumerator Loadlevelslider2()
    {
        Asyn = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Scena02");
        while (!Asyn.isDone)
        {
            MenuSeleccion.menuSeleccion.slider.value = Asyn.progress;
            yield return null;
        }
    }

 
Todo este trozo de código se encarga de cargar las escenas y ese el problema que carga la escena 1 y intancia el player y luego se borra la escena  y  carga de nuevo pero no instancia el player de nuevo.
 
 
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 02, 2018, 09:16:34 PM
He renovado ya me carga la escena02 al dar a continuar pero me instancia 2 players.
 

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 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(delegate { StartCoroutine(Cargar()); });
            Continuar.onClick.AddListener(delegate { StartCoroutine(Cargar()); });
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            textoPuntos.text = "" + puntosSalt;
        }
 
        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);
        scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
        datos.sceneName = scene.name;
        datos.puntosMax = puntosMax;
        bf.Serialize(archivo, datos);
        archivo.Close();
       
           
    }
    IEnumerator Cargar()
    {
        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;
            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;
        }
       
    }
   
    void IntanciarCoche1Cargar(Scene scena, LoadSceneMode loadSceneMode)
    {
        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 destruirCocheCargar()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= IntanciarCoche1Cargar;
    }
}
[Serializable]
class DatosGuardar
{
    public int puntosMax;
    public string sceneName;
   
    public DatosGuardar(int puntosMax, string sceneName)
    {
        this.puntosMax = puntosMax;
        this.sceneName = sceneName;
       
       
    }
}

 
¿Donde puedo poner el método destruirCocheCargar() para que me funcione bien? creo que es eso.
 

Continuar.onClick.AddListener(delegate { StartCoroutine(Cargar()); });

 
tenia esta línea repetida
 
Ahora funciona pero al salir de la partida dándole a salir y se intancia el player otra vez al darle a continuar a si una y otra vez lo instancia, que si salgo 5 veces y le doy a continuar 5 veces me lo instancia 5 veces.
 
Y se salta el menú de selección pero carga y se pone de repente en la scena02. Que locura jajajaja. 
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 02, 2018, 09:50:45 PM
Ya no me instancia varios players encontré donde ponerel método.
 

 void IntanciarCoche1Cargar(Scene scena, LoadSceneMode loadSceneMode)
    {
       
        if (scena.name == "Scena02")
        {
            DestruirCocheCargar();
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena02);
            Instantiate(Coche1Inst);
        }
       
    }
    void DestruirCocheCargar()
    {
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= IntanciarCoche1Cargar;
    }

 
 
 
Ahora el problema es pararme en en meu de seleccion.
Ya lo he arreglado he clonado la ecena con MenuSeccionContinuar y he cambiado el script.
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 02, 2018, 10:38:04 PM
Lo consegui todo arreglado.

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 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 = "" + puntosSalt;
        }
       
        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);
        scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
        datos.sceneName = scene.name;
        datos.puntosMax = puntosMax;
        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();
            puntosMax = datos.puntosMax;
            sceneName = datos.sceneName;
           
            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;
        }
    }
    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;
            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 == "Scena02")
        {
            DestruirMoto1Cargar();
            textoPuntos = GameObject.Find("Puntos").GetComponent<Text>();
            AudioManager.audioManager.PlaySimple(audioClipMusicaScena02);
            Instantiate(Moto1Inst);
        }
    }
    void IntanciarCoche1Cargar(Scene scena, LoadSceneMode loadSceneMode)
    {
       
        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]
class DatosGuardar
{
    public int puntosMax;
    public string sceneName;
   
    public DatosGuardar(int puntosMax, string sceneName)
    {
        this.puntosMax = puntosMax;
        this.sceneName = sceneName;
       
       
    }
}

 
 
Título: Cargar escena guardada como binario
Publicado por: lightbug en Febrero 02, 2018, 11:23:52 PM
Fuera de tema, fijate que , por más que te ande,te estás haciendo tremendo lío en muchas cosas, y además que nadie te puede responder cosas puntuales porque leer el código es realmente penoso, tenés cosas como:
 
- "DestruirMoto1" que es igual en tu código a quitar tu "suscripción" al delegate (que se llama al cargar la escena), osea el nombre te enquilomba más, ni hablar, cuando en realidad "Destruir" da a entender otra cosa, usa un nombre acorde como... no se... IgnorarSceneLoaded()... EscucharSceneLoaded() y de argumento podés pasar el delegate, es decir pasas métodos!! aunque lo mejor no es crear un metodo para hacer esto, hacelo de una, no hay necesidad de tener un método encima por una sola línea de código, pero bueno, si te gusta así esta bien igual.
 
- "InstanciarCoche1Cargar" , que es un método, debería ser ajeno a coche1 o escena3, tratá de encontrar una foma de unificar la funcionalidad y separar el trabajo que debe hacer vs el objeto que va a utilizar, evita Cargarescena23() o InstanciarCoche2() ... siempre busca un "InstanciarObjeto(TipoDeObjeto type, int numerosdeObjeto, ....)" o si fuera el caso fijate el tema de los delegates del punto anterior, es algo engañoso a lo primero pero es extremadamente útil.
 
- ... if(scena.name == "Scene2"), si le cambias el nombre a la escena no te sirve más, por eso o tomá una referencia a cada escena (creo que con un Object podés hacerlo) o directamente usá index, aunque tenés el problema que si cambias de orden tenés el mismo problema.
 
- destruirCocheCargar lo destruye o lo carga? , tratá de siempre hacer código (seas artista, musico o coder) que todo el mundo entienda a la primera.
 
- en "textospuntos" tenés un FInd (si podés evitalos siempre, y si no usalos al start) que lo usas bien en awake, pero luego en cada llamada del sceneLoaded estás rebuscandolo casi siempre, o puede ser que tengas otros objetos iguales y vas reemplazando ese Text?
 
Se entiende? yo lo que veo es que hacés de a 4 o 5 posteos diciendo "esto no me anda y me estoy volviendo loco", y después lo arreglás vos mismo, pero inmediatamente algo se te vuelve a romper, y así ... no te digo que evites que las cosas te salgan mal (sería buenisimo poder hacerlo) pero no le eches leña al fuego tampoco . Por eso como mínimo consejo te diría que (antes se seguir metiendole) hagas un backup y trates de limpiar un poco el código, no se, cosas simples, llamar a las cosas por lo que realmente hacen, usá argumentos cuando puedas, tratá de quitar los "moto1" por ej, en los if's usa else siempre que puedas, si tenés muchas cosas usa switch (queda mucho mas prolijo), etc
 
Saludos
 
 
 
 
Título: Cargar escena guardada como binario
Publicado por: brok en Febrero 03, 2018, 09:20:21 AM
Cita de: lightbug date=1517610232Fuera de tema, fijate que , por más que te ande,te estás haciendo tremendo lío en muchas cosas, y además que nadie te puede responder cosas puntuales porque leer el código es realmente penoso, tenés cosas como:
   
   
      - "DestruirMoto1" que es igual en tu código a quitar tu "suscripción" al delegate (que se llama al cargar la escena), osea el nombre te enquilomba más, ni hablar, cuando en realidad "Destruir" da a entender otra cosa, usa un nombre acorde como... no se... IgnorarSceneLoaded()... EscucharSceneLoaded() y de argumento podés pasar el delegate, es decir pasas métodos!! aunque lo mejor no es crear un metodo para hacer esto, hacelo de una, no hay necesidad de tener un método encima por una sola línea de código, pero bueno, si te gusta así esta bien igual.
   
   
      - "InstanciarCoche1Cargar" , que es un método, debería ser ajeno a coche1 o escena3, tratá de encontrar una foma de unificar la funcionalidad y separar el trabajo que debe hacer vs el objeto que va a utilizar, evita Cargarescena23() o InstanciarCoche2() ... siempre busca un "InstanciarObjeto(TipoDeObjeto type, int numerosdeObjeto, ....)" o si fuera el caso fijate el tema de los delegates del punto anterior, es algo engañoso a lo primero pero es extremadamente útil.
   
   
      - ... if(scena.name == "Scene2"), si le cambias el nombre a la escena no te sirve más, por eso o tomá una referencia a cada escena (creo que con un Object podés hacerlo) o directamente usá index, aunque tenés el problema que si cambias de orden tenés el mismo problema.
   
   
      - destruirCocheCargar lo destruye o lo carga? , tratá de siempre hacer código (seas artista, musico o coder) que todo el mundo entienda a la primera.
   
   
      - en "textospuntos" tenés un FInd (si podés evitalos siempre, y si no usalos al start) que lo usas bien en awake, pero luego en cada llamada del sceneLoaded estás rebuscandolo casi siempre, o puede ser que tengas otros objetos iguales y vas reemplazando ese Text?
   
   
      Se entiende? yo lo que veo es que hacés de a 4 o 5 posteos diciendo "esto no me anda y me estoy volviendo loco", y después lo arreglás vos mismo, pero inmediatamente algo se te vuelve a romper, y así ... no te digo que evites que las cosas te salgan mal (sería buenisimo poder hacerlo) pero no le eches leña al fuego tampoco . Por eso como mínimo consejo te diría que (antes se seguir metiendole) hagas un backup y trates de limpiar un poco el código, no se, cosas simples, llamar a las cosas por lo que realmente hacen, usá argumentos cuando puedas, tratá de quitar los "moto1" por ej, en los if's usa else siempre que puedas, si tenés muchas cosas usa switch (queda mucho mas prolijo), etc
   
   
      Saludos
   
   
       
   
   
       
   


Mil gracias por los consejos lightbug los tendre encuenta.