Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Activar/Desactivar un Gameobject

Iniciado por ramunda, Julio 08, 2016, 01:21:23 AM

Tema anterior - Siguiente tema
seria ponerla en un manager al q le haces dontdestroyonload, asi lo tienes en cada escena

Julio 09, 2016, 07:20:28 PM #16 Ultima modificación: Julio 09, 2016, 07:22:46 PM por ramunda
Cita de: Braltor date=1468083993seria ponerla en un manager al q le haces dontdestroyonload, asi lo tienes en cada escena
   


Vale....voy a probar , un manager supongo que te refieres a un GameObject vacío por ejemplo , allí meter el public y un dont destroy?, voy bien?
 
O te refieres a la escena?, o dios me estoy volviendo loco :(
 
 
 
 

Julio 09, 2016, 07:40:48 PM #17 Ultima modificación: Julio 09, 2016, 07:52:03 PM por kaito
Bueno, te he creado un ejemplo con el tipo de UI que intentas hacer.
 
Por lo que he visto quieres crear un único Canvas para todo el juego: Menu Inicial, interfaz para nivel1, nivel2, y otras ventanas como inventario o mensajes.
 
Entonces, has hecho al Canvas un GameObject indestructible(DontDestroyOnLoad) al cambiar de escena.
 
Precaución al hacer esto: Emparenta el GameObject EventSystem dentro del Canvas que es indestructible o hazlo también indestructible durante la carga de escena. Si no, se destruirá al cambiar de escena y los eventos de UI no funcionaran.
 
El Canvas permanecerá siempre activo. No es necesario desactivarlo.
 
1) Para hacer funcionar este tipo de UI, solo es necesario activar/desactivar los menús hijo/child del canvas, mediante la función Find del Transform del Canvas.
 
2) Es necesario crear una escena independiente al resto del juego. La he llamado EscenaDeCarga. Aquí solo he creado el Canvas y los diferente menus/ventanas del juego que se encuentran desactivados. A continuación, cargamos la siguiente escena donde se encuentra el menú principal del juego.
 
Solo he necesitado un script para los eventos de la UI. Tampoco he necesitado variables tipo bool:
 

using UnityEngine;
using UnityEngine.SceneManagement;
public class selectlevels : MonoBehaviour
{
   
    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        this.Menu();
        Debug.Log("Start");
    }
    //Ir a escena Nivel1
    public void Nivel1()
    {
        SceneManager.LoadScene("leñador");        
        this.transform.Find("Nivel1").gameObject.SetActive(true);
        this.transform.Find("Menu").gameObject.SetActive(false);
        Debug.Log("nivel1");
    }
 
    //Salir del juego
    public void salida()
    {
        Debug.Log("Quit");
        Application.Quit();      
    }
    //Ir a escena Menu
    public void Menu()
    {
        SceneManager.LoadScene("Menu");
        this.transform.Find("Nivel1").gameObject.SetActive(false);
        this.transform.Find("Menu").gameObject.SetActive(true);
        Debug.Log("menu");
    }
}

 
Enlace de descarga: http://www.speedyshare.com/TbqXb/guiNiveles.unitypackage
 
Como he dicho el GameObject Canvas permanece siempre activo, y los menús hijos del Canvas los voy activando/desactivando mediante búsquedas desde el componente Transform que detecta GameObject desactivados.

Julio 09, 2016, 07:58:46 PM #18 Ultima modificación: Julio 10, 2016, 08:55:37 AM por pioj
Cita de: kaito date=1468086048Bueno, te he creado un ejemplo con el tipo de UI que intentas hacer.
   
   
      Por lo que he visto quieres crear un único Canvas para todo el juego: Menu Inicial, interfaz para nivel1, nivel2, y otros ventanas como inventario o mensajes.
   
   
      Entonces, has hecho al Canvas un GameObject indestructible(DontDestroyOnLoad) al cambiar de escena.
   
   
      Precaución al hacer esto: Emparenta el GameObject EventSystem dentro del Canvas que es indestructible o hazlo también indestructible durante la carga de escena. Si no, se destruirá al cambiar de escena y los eventos de UI no funcionaran.
   
   
      El Canvas permanecerá siempre activo. No es necesario desactivarlos.
   
   
      1) Para hacer funcionar este tipo de UI, solo es necesario activar/desactivar los menús hijo/child del canvas, mediante la función Find del Transform del Canvas.
   
   
      2) Es necesario crear una escena independiente al resto del juego. La he llamado EscenaDeCarga. Aquí solo he creado el Canvas y los diferente menus/ventanas del juego que se encuentran desactivados. A continuación, cargamos la siguiente escena donde se encuentra el menú principal del juego.
   
   
      Solo he necesitado un script para los eventos de la UI. Tampoco he necesitado variables tipo bool:
   
   

using UnityEngine;
using UnityEngine.SceneManagement;
public class selectlevels : MonoBehaviour
{
   
    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        this.Menu();
        Debug.Log("Start");
    }
    //Ir a escena Nivel1
    public void Nivel1()
    {
        SceneManager.LoadScene("leñador");        
        this.transform.Find("Nivel1").gameObject.SetActive(true);
        this.transform.Find("Menu").gameObject.SetActive(false);
        Debug.Log("nivel1");
    }
 
    //Salir del juego
    public void salida()
    {
        Debug.Log("Quit");
        Application.Quit();      
    }
    //Ir a escena Menu
    public void Menu()
    {
        SceneManager.LoadScene("Menu");
        this.transform.Find("Nivel1").gameObject.SetActive(false);
        this.transform.Find("Menu").gameObject.SetActive(true);
        Debug.Log("menu");
    }
}

   
      Enlace de descarga: http://www.speedyshare.com/TbqXb/guiNiveles.unitypackage
   
   
      Como he dicho el GameObject Canvas permanece siempre activo, y los menús hijos del Canvas los voy activando/desactivando mediante búsquedas desde el componente Transform que detecta GameObject desactivados.
   


Juer....no se que decir Kaito, te has tomado muchas molestias y es muy de apreciar.
 
Pero voy a ser aguafiestas de nuevo.
 
He bajado el pack y he cargado la escena para emocionado para ver la luz que me has proporcionado.
 
pero al cargarla me tira dos errores:
 



   
       
   
   
      Assets/selectlevels.cs(17,22): error CS0117: `SceneManager' does not contain a definition for `LoadScene'
   
   
      Assets/selectlevels.cs(34,22): error CS0117: `SceneManager' does not contain a definition for `LoadScene'
   
   
      :(
   
   
       
   

[/quote]
 
Ya veo lo que ha pasado.....se ha cargado la escena leñador.....osea la escena principal.
 
Ahora esta vacía....
 
leñador es ahora una empty scene..
 
y el script que tenia de selectlevels...ha sido reemplazado por el tuyo..
 
eso no me preocupa...demasiado lo volveré a crear, he arrancado la escena "escena de carga", deberia parecer algo?, menus algo?
 
Esta vacia....
 
Tiene un Main camera
 
un Directional light
 
y un canvas el cual tiene un script Selecniveles que pide un Go....
 
deduzco que tengo que meter mi select niveles el que quiero que no se destruia.

Esta vez no ha sido un error entre GetChild y Find. SceneManager.LoadScene existe y es correcto: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html
 
 
 
Y las escenas, las tienes que sustituir por las tuyas.
 
 
 
En resumen, era para mostrarte que no es necesario activar/desactivar el Canvas. El Canvas debe estar siempre activo. Y las ventanas UI deben ser GameObject hijos del Canvas.
 
Y ya sabes que GameObject.Find no localiza GameObjects desactivados. Es necesario utilizar la función Find del Transform de un GameObject padre, en este caso el Canvas.
 
Un saludo, y suerte.

Julio 09, 2016, 09:11:16 PM #20 Ultima modificación: Julio 10, 2016, 08:56:33 AM por pioj
Cita de: kaito date=1468090862Esta vez no ha sido un error entre GetChild y Find. SceneManager.LoadScene existe y es correcto: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html
   
   
       
   
   
      Y las escenas, las tienes que sustituir por las tuyas.
   
   
       
   
   
      En resumen, era para mostrarte que no es necesario activar/desactivar el Canvas. El Canvas debe estar siempre activo. Y las ventanas UI deben ser GameObject hijos del Canvas.
   
   
      Y ya sabes que GameObject.Find no localiza GameObjects desactivados. Es necesario utilizar la función Find del Transform de un GameObject padre, en este caso el Canvas.
   
   
      Un saludo, y suerte.
   


Eres GRANDEEEE,  a partir de esto ya puedo montar el menú a mi gusto o intentarlo jajajjaja, pero si , de esta manera se podra acceder de cualquier parte porque le has puesto el dont destroy.
 
i para llamar a los Go desactivados que tenga el canvas de hijos, solo deberia bastar esto:
 



   
       
   
   
      canvas.transform.Find("nivel2").gameObject.SetActive(true);
   
   
       
   

[/quote]
 
o me quivoco?
 
y por ultimo antes de darte un abrazo virtual enorme!!!
 
en el canvas en el script Selecniveles pide un GameObject"selecniveles" eso se queda vacio? o hay que meter algo hay?
 
De momento ese enorme abrazo virtual y un millon de gracias. A ti y todos los que han participado en este hilo!!!
 
 
 
GRACIAS!!
 
P.D los menús no aparecian porque estaban desactivados...pero como soy lerdo del todo no lo había visto :), ya se ven y perfectos.
 
SOY UN LERDO GAFEEEE
 
He echo exactamente lo que me has explicado:
 
He probado desactivando el GO Menu y llamándolo de otra pantalla:
 

Canvas.transform.Find ("Menu").gameObject.SetActive (true);

 
con el find de el transform tal y como tu me has explicado.
 
y me tira este error!! no lo entiendo!!!
 



   
      error CS0120: An object reference is required to access non-static member `UnityEngine.Component.transform'
   

[/quote]
 
Dios santo ya lo estaba celebrando!
 
Y porque cada vez que toco algo de un script el que sea petan los LoadScene?
 



   
       
   
   
      Assets/selectlevels.cs(17,22): error CS0117: `SceneManager' does not contain a definition for `LoadScene'
   
   
      Assets/selectlevels.cs(34,22): error CS0117: `SceneManager' does not contain a definition for `LoadScene'
   
   
       
   

[/quote]
 
tengo que cerrar unity y abrirlo de nuevo para que se quede bien.

Lo único que se me ocurre sobre SceneManager, es que te falta especificar el espacio de nombre UnityEngine.SceneManagement.
 

using UnityEngine.SceneManagement;

 
Ya solo queda subir el proyecto al foro. Desde aquí creo que ya no se puede hacer mucho más.

Julio 09, 2016, 11:28:39 PM #22 Ultima modificación: Julio 09, 2016, 11:29:49 PM por ramunda
Cita de: kaito date=1468098368Lo único que se me ocurre sobre SceneManager, es que te falta especificar el espacio de nombre UnityEngine.SceneManagement.
   
   

using UnityEngine.SceneManagement;

   
      Ya solo queda subir el proyecto al foro. Desde aquí creo que ya no se puede hacer mucho más.
   


Eso esta puesto en el Script que me pasastes esta en la parte de arriba:
 
 
 

using UnityEngine;
using UnityEngine.SceneManagement;
public class selectlevels : MonoBehaviour
{
   
    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        this.Menu();
        Debug.Log("Start");
    }
    //Ir a escena Nivel1
    public void Nivel1()
    {
        SceneManager.LoadScene("leñador");        
        //this.transform.Find("Nivel1").gameObject.SetActive(true);
        //this.transform.Find("Menu").gameObject.SetActive(false);
        Debug.Log("nivel1");

 
no sera eso que te dije que dentro de el canvas donde esta el script Seleclevels esta vacio?
 
 
 

 
Cita de: ramunda date=1468099719Eso esta puesto en el Script que me pasastes esta en la parte de arriba:
   
   
       
   
   

using UnityEngine;
using UnityEngine.SceneManagement;
public class selectlevels : MonoBehaviour
{
   
    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        this.Menu();
        Debug.Log("Start");
    }
    //Ir a escena Nivel1
    public void Nivel1()
    {
        SceneManager.LoadScene("leñador");        
        //this.transform.Find("Nivel1").gameObject.SetActive(true);
        //this.transform.Find("Menu").gameObject.SetActive(false);
        Debug.Log("nivel1");

   
      no sera eso que te dije que dentro de el canvas donde esta el script Seleclevels esta vacio?
   
   
       
   
   
      
   


Y veo que tambien dentro de EventSystem hay un apartado vacio:
 
 
 

Julio 10, 2016, 12:09:54 AM #23 Ultima modificación: Julio 10, 2016, 12:37:51 AM por ramunda
Kaito, ya tengo el problema de los errores.
 

using UnityEngine;
using UnityEngine.SceneManagement;
public class selectlevels : MonoBehaviour
{
   
    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        this.Menu();
        Debug.Log("Start");
    }
    //Ir a escena Nivel1
    public void Nivel1()
    {
        Application.LoadLevel("leñador");        
        this.transform.Find("Nivel1").gameObject.SetActive(true);
        this.transform.Find("Menu").gameObject.SetActive(false);
        Debug.Log("nivel1");
    }

 
Sustituido :
 

SceneManager.LoadScene("leñador");

 
por Application.LoadLevel...de momento no falla , ahora me queda arreglar el canvas que los menus ahora van locos.
 
Pero algo tenemos :)
 
Gracias.
 
Definitivamente ya no falla era eso no mas.
 
Y solo Falta una cosaaaaaaaaaaa y cerramos el post!!!
 

Canvas.transform.Find("Menu").gameObject.SetActive(false);

 
Ya tenemos el GameObject padre = Canvas.
 
Tenemos los hijos= Nivel1 y Menu
 
entonces dime por favor como los desactivooo o activo porque con lo que te he puesto arriba no funciona...
 
Y ahora que lo tenemos al huevo...
 
:)
 
 
 
 
 
 

¿Qué está ocurriendo aquí? ¿Se  ha resuelto el problema sí o no?
 
Marcad la mejor respuesta y resumid un poco todo si creéis que puede resultar interesante para otros usuarios, por favor, porque el seguimiento de este Topic es un desastre...

Cita de: pioj date=1468134240¿Qué está ocurriendo aquí? ¿Se  ha resuelto el problema sí o no?
   
   
      Marcad la mejor respuesta y resumid un poco todo si creéis que puede resultar interesante para otros usuarios, por favor, porque el seguimiento de este Topic es un desastre...
   


El resumen esta echo, Kaito, es el que lo ha resuelto lo marcare como mejor respuesta, solo faltaba lo mas importante pero si queréis cerradlo lo cerramos,solo me faltaba saber lo que pregunte al principio se fue arreglando todo hasta llegar aquí. 

Julio 10, 2016, 12:21:49 PM #26 Ultima modificación: Julio 10, 2016, 02:55:55 PM por pioj
Cuando algun usuario abre un hilo para preguntar una cosa en concreto, alguien se la responde y el afectado añade un post diciendo algo parecido a "muchas gracias, era eso ... ahora solo me falta esto que no me funciona", vuelven a responderle acerca de su nuevo problema y el afectado nuevamente añade "muchas gracias, ahora lo que no me funciona es este otro aspecto" ... y asi hasta el infinito (o hasta que el usuario que le ha resuelto 4 o 5 problemas en cadena se cansa).
 
Esa situacion hace que el hilo sea un caos a la hora de seguirlo, imposible marcar "mejor respuesta" debido a que hay varias dudas distintas dentro del mismo hilo (encadenadas una detras de otra que van surgiendo con cada respuesta) y que no facilita en absoluto la busqueda de temas en el foro.
 
En mi opinion, cuando alguien tiene un problema esta muy bien preguntar en el foro con intencion de que alguien le ayude porque para eso esta ... pero cuando recibe una respuesta resolviendole el problema, tendria que tener un minimo de voluntad por resolver o modificar el proyecto propio para que sea compatible con la respuesta recibida; Cuando se hacen 4 o 5 consultas en un mismo dia que son fruto de implementar la solucion recibida respecto a la duda anterior, puede que este muy equivocado, pero a simple vista da la sensacion de que esa voluntad por esforzarse un poquito brilla por su ausencia.
 
Ademas, el administrador deberia añadir un punto en las normas del foro que resumiendo dijese "Un tema, una duda" ... facilitaria mucho a la hora de seguir los temas, marcar mejor respuesta y realizar busquedas dentro del foro. Pero esto solo es un consejo

Arthure, entiendo lo que dices y lo respeto, pero en algo discrepo ya que el tema empezó si, pero las siguientes respuestas fueron sobre el mismo tema . mismo hilo y simpre sobre lo expuesto por un experto, y lo que comentas de falta de esfuerzo....no lo discutiré pero si lees todos los posts de este hilo veras que muchos son por intentar solucinarlo por mi cuenta y solo, si según la respuesta expuesta por el experto no funciona sobre la solución presentada.
 
Pido disculpas si he ocasionado molestias o discordias.
 
Si vees uno de mis últimos replies solo pedía la ultima instruccion para cerrar el tema , y lo expuse tal cual.
 
Ya que estaba todo entendido y solucionado.
 
Que no se contesto, pues ya me buscare la vida. 
 
 
 
Se agradece infinitamente.
 
Saludos
 
 
 
 
 
 
 
 

Etiquetas: