unity3d - pasar - obtener la posicion de un objeto unity
Comprender las escenas en Unity3d (2)
Tengo cierta confusión con las escenas en Unity3d y no pude encontrar ningún recurso sobre ellas.
- ¿Cuándo se deben usar las escenas? Por ejemplo, en un juego de plataformas, ¿todos los niveles tendrán que ser una escena diferente? ¿El menú principal sería una escena?
- ¿Puede uno superponer escenas?
- ¿Cómo funcionan los activos entre escenas? ¿Están unidos a cada escena individual y tienen que volver a cargarse cada vez? ¿Se puede especificar cuándo un activo ya no es necesario?
- ¿Cómo se envían datos entre escenas / interfaz entre escenas? Entiendo que este es un tema amplio, pero no quería enviar spam con varias preguntas.
¿Cuándo se deben usar las escenas? Por ejemplo, en un juego de plataformas, ¿todos los niveles tendrán que ser una escena diferente? ¿El menú principal sería una escena?
No hay ninguna regla sobre cuántas escenas necesitas tener en tu juego. Sin embargo, las escenas te permiten separar lógicamente partes de tu juego del resto. Tienes que tener un mínimo de una escena.
En el menú principal, si se refiere a un lienzo con los elementos de la interfaz de usuario, estará EN una escena y no en una escena en sí. Canvas es solo otro GameObject, que la mayoría de las veces usamos para mostrar menús de juegos. Principalmente creo un Canvas GameObject, pongo un guión con el nombre de "UIManager" y pongo DontDestroyOnLoad en él, así que tengo acceso a él en todas las escenas. Hazlo Singleton y me aseguro de que no esté duplicado.
¿Puede uno superponer escenas?
Sí, no hay restricciones en cuanto a la cantidad de escenas que puede cargar a la vez. ¿Para qué planeas superponer escenas? Tal vez hay una mejor manera de cargar aditivamente.
¿Cómo funcionan los activos entre escenas? ¿Están unidos a cada escena individual y tienen que volver a cargarse cada vez? ¿Se puede especificar cuándo un activo ya no es necesario?
Los activos son lo que ves en tu jerarquía ''proyecto''. Creo que quisiste decir "GameObject" en la escena, y si es así, piensa en tus objetos de juego como entidades con componentes ( Entity-Component System ). Todas las entidades en una escena se destruyen cuando se destruye su escena principal hasta que se indique explícitamente que no, usando DontDestroyOnLoad en algún componente (un comportamiento mono en caso de unidad). A los destruidos se les recogerá la basura.
Entonces, cómo se cargan (o vuelven a cargar) depende de su implementación, de si está instanciando / destruyéndolas una vez más o si coloca sus prefabricados instanciados en un objeto almacenado en caché y lo recupera más tarde.
¿Cómo se envían datos entre escenas / interfaz entre escenas?
Heisen cubrió los que pude pensar. Solo para agregarle un poco, también depende de cómo quiera que el arquitecto diseñe su proyecto. Entonces, si tiene una estructura de datos subyacente para, por ejemplo, mantener Commands , puede usarla en cualquier parte de su proyecto
¿Cuándo se deben usar las escenas? Por ejemplo, en un juego de plataformas, ¿todos los niveles tendrán que ser una escena diferente? ¿El menú principal sería una escena?
No hay reglas generales sobre eso. En teoría, puede tener solo una escena para todo el juego. Cómo organizas tus escenas depende totalmente de ti y, a menudo, depende del tipo de juego que estás creando.
Creo que hay al menos 3 características para considerar al usar escenas:
- son un contenedor lógico para todos los objetos preinstantados que pueden ser útiles para dividir el juego en múltiples niveles / secciones.
- Puede serializar referencias cruzadas entre
GameObjects
yComponents
dentro de una escena (si GO A necesita un ref para GO B, y pertenecen a la misma escena, la referencia puede ser serializada y ya no necesita encontrar el objeto referenciado en tiempo de ejecución) - Cuando carga (no de forma aditiva) otra escena, los recursos ya cargados en la memoria se liberan automáticamente
¿Puede uno superponer escenas?
Sí, puedes usar LoadAdditive . Desafortunadamente, una vez que dos escenas se cargan en la memoria, no hay forma automática de distinguir los objetos que pertenecen a uno u otro. Por lo tanto, si carga aditivo en un entorno de segundo nivel, le corresponde a usted realizar un seguimiento del entorno anterior y destruirlo explícitamente si es necesario.
¿Cómo funcionan los activos entre escenas? ¿Están unidos a cada escena individual y tienen que volver a cargarse cada vez? ¿Se puede especificar cuándo un activo ya no es necesario?
Por defecto, cada GameObject
de una escena se destruirá una vez que se cargue la nueva escena (a menos que uses una carga de escena aditiva). Una forma de hacer que un GameObject
sobreviva en todas las escenas es marcarlo usando DontDestroyOnLoad .
Si necesita compartir una "configuración" particular de un GameObject, puede almacenarla como un prefabricado y hacer referencia entre escenas (pero recuerde que una vez en una escena es una instancia prefabricada, por lo que el GO comparte con el prefab la serialización inicial) y no propiedades anuladas, pero 2 instancias del mismo prefabricado son objetos diferentes).
¿Cómo se envían datos entre escenas / interfaz entre escenas?
Varias maneras, dependiendo del tipo de datos persistentes que desea compartir.
- Para una instancia de
GameObject
particular,GameObject
que el objeto sobreviva utilizandoDontDestroyOnLoad
. - Si tiene algunos datos de configuración que no necesitan adjuntarse a un
GameObject
específico, puede considerar almacenar un ScriptableObject dentro de AssetDatabase y hacer referencia a él. - Si tiene datos que deben persistir en diferentes sesiones de juego, puede considerar almacenarlos en PlayerPrefs .
Hay otras 2 maneras que no me gustan, pero solo para citarlas:
- Usar un campo estático a veces puede ayudarte a hacerlo, pero tiene varios problemas desde mi punto de vista
- Guarde y cargue desde el disco (podría ser útil en varias situaciones, pero a menudo depende de la plataforma y puede tener algunos problemas especialmente en diferentes plataformas móviles)
Este es un tema amplio por cierto, espero que esta respuesta pueda ser una visión bastante decente.