Cambiar de escenas preservando GameObjects - xAlstrat/RPGForBlindness GitHub Wiki

Cambiar de escenas preservando el estado al volver a la escena

Para cambiar de escenas se utiliza la clase estática SceneLoader. Esta nos permite definir los GameObjects que deben ser preservados al volver a la escena de la cual de salió.

Procedimiento:

  1. En el Inspector añadir todos los gameobjects de la escena actual que queramos preservar en el campo Persistent Gameobjects.
  2. Agregar todas las escenas (nombre de estas) en las cuales queramos que nuestros objetos sean preservados en el campo Persistent Scenes. Si viajamos a otra escena que no sea una de las especificadas, entonces todos los objetos preservados serán eliminados (junto con el SceneLoader).
  3. Agregar a qué escenas pertenece cada GameObject persistente y por tanto en qué escenas estos deben mostrarse/ocultarse. Para eso hay que agregar en Show Object In Scene un par de indices (GameObject, Scene) que señalan que el GameObject de ese índice en Persistent Gameobjects debe ser mostrado en la escena de dicho índice en Persistent Scenes. Un GameObject puede estar apareado con múltiples escenas, lo que significa que será mostrado en todas ellas.
  4. Crear una escena adicional por cada escena que tenga objetos persistentes, pero sin los persistenes, y solo utilizar la original la primera vez que se usa dicha escena (para crear los objetos persistentes). Esto se hace debido a que si luego de crear objetos persistentes, cambiamos de escena y volvemos a la misma, estarán los persistentes duplicados. EJ: Usar HallScene que crea los persistentes (si la usamos dos veces volverá a crearlos y serán duplicados), y las veces posteriores usar HallSceneIncomplete, que no crea los persistentes y ya no serán duplicados.

Modo de uso:

SceneLoader.GetInstance().load("Nombre_Escena");

Notar que la función load recibe un string, y por tanto puede viajar a cualquier escena que se le especifique, incluso si no está en la lista Persistent Scenes.

Adicionalmente, si se quiere cargar una escena forzando que se destruyan todos los gameObjects, incluso los persistentes, debe utilizarse la función cleanLoad.

SceneLoader.GetInstance().cleanLoad("Nombre_Escena");