Este artículo será útil para desarrolladores de juegos para principiantes. En él, hablaré sobre mi propia experiencia en la implementación de la interacción en varias etapas y los problemas que encontré.
Hablemos de clases estáticas para almacenar datos, varias formas de cargar escenas con el motor de Unity, y también tocaremos el caso de conectar Admob al proyecto. Información proporcionada por documentación oficial y una comunidad amigable de desarrolladores.
La situacion
Mi juego consta de dos escenas: el menú principal, que es visible inmediatamente después de la carga y, directamente, una escena del juego con mecánica, en la que, según la opción seleccionada, se carga la prefabricación del objeto. No me fue posible combinarlos en una escena, ya que varios objetos bastante complejos están vinculados al menú, y es más conveniente separar las entidades.
Anteriormente, solo usaría un cierto objeto controlador para almacenar los datos, pero con la descarga de la escena deja de existir.
Transferencia de datos (clase estática)
Resultó que Unity es excelente para trabajar con código, incluso si se encuentra pacíficamente en un archivo en la carpeta de scripts y no está unido por un componente a un objeto en el escenario (esto no era obvio para un principiante). Por ejemplo, dicho archivo podría ser una clase estática de este tipo:
using UnityEngine; public static class DataHolder { private static GameObject prefabName; public static GameObject Prefab { get { return prefabName; } set { prefabName = value; } } }
Por lo tanto, logré guardar la elección del usuario incluso después de descargar la escena y cargar una nueva. Inicialmente, todo funcionó exactamente con escenas de cambio difíciles.
Con este mecanismo, también puede transferir configuraciones a otras escenas desde el menú, por ejemplo, el idioma de localización, configuraciones para sonidos y música, y mucho más.
Multi-valor (SceneManagement)
Todo me convenía y así, hasta que recibí la tarea de conectarme al proyecto Admob (publicidad), para que el video se mostrara justo al comienzo de la escena del juego. Al final resultó que, hay sutilezas: solicitar un video lleva una cantidad de tiempo significativa, y simplemente no tiene tiempo de llegar al cambiar de escena. No quería retrasar retrasos adicionales en el proyecto, especialmente porque tenemos mucho tiempo hasta que el jugador se "pega" al menú. Luego descubrí que no hay necesidad de cambiar las escenas "duro", porque hay una opción maravillosa para la carga aditiva (sin descargar la escena anterior).
Cargo la escena del juego con el controlador de menú (la escena con el menú y el objeto publicitario también se carga):
SceneManager.LoadScene(1,LoadSceneMode.Additive);
Al finalizar el nivel, descargo la escena del juego con el controlador del juego (para que no quede en mi memoria):
SceneManager.LoadScene(0,LoadSceneMode.Single);
Usando tal esquema, la publicidad se carga inmediatamente al inicio de la aplicación, y puede invocar la visualización del comercial en cualquier momento deseado. Puede hacer lo mismo con cualquier objeto que necesite.
Los problemas
Desafortunadamente, incluso con la carga aditiva de escenas, no podrá profundizar en los objetos de una escena de otra. Los enlaces a los objetos deberán transmitirse a través de un cierto "mediador" (en mi caso, se utilizó la misma clase estática).
Tenga cuidado al crear instancias de prefabricados, si hay varias escenas activas; para mí, todas decidieron toparse con la escena incorrecta (más sobre eso en otra ocasión).