Buenas noches,
Tengo una duda y después de mucho buscar recurro a ustedes,
Explico:
Tengo una escena(la principal), con un menú de niveles, bien , selecciono nivel 1 y la desactivo al cargar la siguiente escena.
dicho GameObject lleva un script de DontDestroyOnLoad (this.gameObject); añadido a el para que lo cargue en cada escena y pueda encontrarlo en las posteriores.
la desactivo de esta manera:
void Update ()
{
if(nivel1)
{
Application.LoadLevel("leñador");
selectniveles.SetActive(false);
}
Hasta aquí de perlas, el juego empieza y bien.
El problema es cuando termino el nivel1 intento activar de nuevo el mencionado GameObject, pero no hay manera.
Tengo entendido que Unity no encuentra GO (GameObject) desactivados....
He probado:
GameObject.Find("selectniveles").SetActive(true);
[/quote]
y todas las maneras activables, pero nada.
No encuentra el GO.....
Alguna idea de como activarlo?
Gracias de antemano.
Esta pregunta ya ha salido varias veces en el foro.
Las funciones de la clase GameObject que realizan búsquedas, es decir: GameObject.Find, GameObject.FindWithTag, etc... no funcionan con GameObjects desactivados.
Soluciones:
1) La función de búsqueda del componente Transform, como
Transform.FindChild Transform.Find, sí que funcionan con GameObjects desactivados. Emparenta dentro de un GameObject vacío los GameObjects que necesites desactivar/activar durante el juego.
2) Crear un marcador al GameObject desactivado dentro del script tipo singleton/único con una variable estática:
using UnityEngine;
using System.Collections;
public class Menu : MonoBehaviour {
public static GameObject singleton;
void Awake () {
if (singleton) Destroy(this.gameObject);
else singleton = this.gameObject;
}
Entonces, podrás acceder en todo momento al menú mediante Menu.singleton, esté activado o desactivado.
Cita de: kaito date=1467962953Esta pregunta ya ha salido varias veces en el foro.
Las funciones de la clase GameObject que realizan búsquedas, es decir: GameObject.Find, GameObject.FindWithTag, etc... no funcionan con GameObjects desactivados.
Soluciones:
1) La función de búsqueda del componente Transform, como Transform.FindChild, sí que funcionan con GameObjects desactivados. Emparenta dentro de un GameObject vacío los GameObjects que necesites desactivar/activar durante el juego.
2) Crear un marcador al GameObject desactivado dentro del script tipo singleton/único con una variable estática:
using UnityEngine;
using System.Collections;
public class Menu : MonoBehaviour {
public static GameObject singleton;
void Awake () {
if (singleton) Destroy(this.gameObject);
else singleton = this.gameObject;
}
Entonces, podrás acceder en todo momento al menú mediante Menu.singleton, esté activado o desactivado.
Muchas gracias Kaito por la respuesta, tenía esta posibilidad en mente pero el GameObject es un UI, y si lo pongo dentro de otro Go no se carga en pantalla, bastaría con agregarle un script como he echo con Dontestroy on load?., deberia funcionar?
Gracias
Si el GameObject es un UI, entonces ya se encuentra emparentado como mínimo al GameObject del componente Canvas que siempre se encuentra activo, y no necesitas crear un GameObject vacío.
Entonces buscas el GameObject del Canvas y buscas el UI desde su componente Transform, sería: GameObject.Find("Canvas").transform.FindChild("UI").gameObject;
Cita de: kaito date=1467995772Si el GameObject es un UI, entonces ya se encuentra emparentado como mínimo al GameObject del componente Canvas que siempre se encuentra activo, y no necesitas crear un GameObject vacío.
Entonces buscas el GameObject del Canvas y buscas el UI desde su componente Transform, sería: GameObject.Find("Canvas").transform.FindChild("UI").gameObject;
Kaito, gracias, gracias por tu tiempo , pro me sigue sin funcionar, y es culpa mía , no me he expresado con claridad seguramente y por eso no me funciona.
Voy paso por paso con toda la info:
El objeto al que quiero acceder y a sus hijos es:
selectniveles, adjunto foto.
lleva dos scripts :
Dontdestoy on load :
using UnityEngine;
using System.Collections;
public class dontdestroy : MonoBehaviour {
// Use this for initialization
void Awake ()
{
DontDestroyOnLoad (this.gameObject);
}
}
y otro que lo serializa tal y como tu me has dicho;
using UnityEngine;
using System.Collections;
public class Intro : MonoBehaviour {
public static GameObject singleton;
void Awake () {
if (singleton) Destroy(this.gameObject);
else singleton = this.gameObject;
}
}
Bien , cuando carga esta escena, que lo que hace es darte a elegir un nivel, se va a la escena1 , pero se va desactivada:
public GameObject selectniveles;
void Update ()
{
if (nivel1) {
Application.LoadLevel ("leñador");
selectniveles.SetActive (false);
}
bien, hasta aquí, el level leñador empieza limpio y todo bien.
Lo que quiero es, desde la escena leñador , acceder a selectniveles y a sus hijos....pero no hay manera!!
he probado lo que me has dicho con el transform...pero nada me sigue diciendo que le objeto no se encuentra.
tambien he probado con Info.singleton.selectniveles.SetActive(true) y se activa si, pero desaparece a los 2 segundos.
y he probado:
Info.singleton.FindChild("nivel2").SetActive(true); y nada de nada.
Algo estoy haciendo mal.....:(
(//<fileStore.core_Attachment>/monthly_2016_07/objeto.png.fe5006e0c8250d5a261a61600847c9fa.png)
(//<fileStore.core_Attachment>/monthly_2016_07/inspector.png.596c11db8be47eb3fbd0ce41089d9c18.png)
(//<fileStore.core_Attachment>/monthly_2016_07/scripts.png.ae9c60ff6c62244bc75d26780f7d9189.png)
Info.singleton.FindChild("nivel2").SetActive(true); y nada de nada.
[/quote]
No funciona porque el GameObject padre está desactivado. Para buscar desde el componente Transform necesitas que el GameObject padre este siempre activo, si no es así necesitas crear un GameObject vacio.
Info.singleton.selectniveles.SetActive(true) y se activa si, pero desaparece a los 2 segundos
[/quote]
??? Eso en principio, debería ser Info.singleton.SetActive(true), ya que el script Intro debe ir en el GameObject 'selectniveles'. Yo lo he testeado en otro script y funciona la activación/desactivación desde otros GameObject.
El script donde se encuentra la variable GameObject selectniveles esta incompleto y posiblemente el fallo se encuentre en ese script.
Cita de: kaito date=1468015788No funciona porque el GameObject padre está desactivado. Para buscar desde el componente Transform necesitas que el GameObject padre este siempre activo, si no es así necesitas crear un GameObject vacio.
??? Eso en principio, debería ser Info.singleton.SetActive(true), ya que el script Intro debe ir en el GameObject 'selectniveles'. Yo lo he testeado en otro script y funciona la activación/desactivación desde otros GameObject.
El script donde se encuentra la variable GameObject selectniveles esta incompleto y posiblemente el fallo se encuentre en ese script.
Vale , ya voy entendiendo mas y mas.
Ademas se me fue la pinza....Donde llamamos a Info...es Intro...pero da igual no funciona igual.
El GameObject padre en este caso como bien ya sabes, es un Ui, si l metes en un GO vacio deja de aparecer en pantalla.....ya lo he probado.
Pero si bien dices que el Go padre tiene que estar activo....
Si lo activo;
Intro.singleton.SetActive(true);
y después llamo a los Child.....debería funcionar no?:
Intro.singleton.FindChild("nivel2").SetActive(true);
pues...no :(
Cita de: kaito date=1468015788El script donde se encuentra la variable GameObject selectniveles esta incompleto y posiblemente el fallo se encuentre en ese script.
Supongo que te refieres al update donde desactivo el selectniveles, eso es solo un fragmento para que vieras como lo declaraba.
el script completo es este:
using UnityEngine;
public class selectlevels : MonoBehaviour
{
private bool nivel1 = false;
private bool nivel2 = false;
private bool nivel3 = false;
private bool nivel4 = false;
private bool salir = false;
private bool menu = false;
public GameObject selectniveles;
void Update ()
{
if (nivel1) {
Application.LoadLevel ("leñador");
selectniveles.SetActive (false);
}
if (nivel2) {
Application.LoadLevel ("leñadornivel2");
}
if (nivel3) {
Application.LoadLevel ("leñadornivel3");
}
if (salir) {
Application.Quit ();
}
if (nivel4) {
Application.LoadLevel ("leñadornivel4");
}
if (menu) {
Application.LoadLevel ("menu");
}
}
public void Nivel1()
{
nivel1 = true;
}
public void Nivel2()
{
nivel2 = true;
}
public void Nivel3()
{
nivel3 = true;
}
public void Nivel4