Noticias

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

problemas con DontDestroyOnLoad

Iniciado por l0111, Noviembre 18, 2015, 08:49:32 PM

Tema anterior - Siguiente tema
Buenas! tengo problemas con DontDestroyOnLoad. Tengo mis GameObject para cada jugador, un script partida donde almaceno los Gameobjets en un array, y voy accediendo a ellos según el turno. Cuando cambio de turno, no puedo acceder al siguiente jugador puesto que ha sido destruido al cambiar de escena. Estoy probando varias cosas con DontDestroyOnLoad, como llamarla desde diferentes sitios o pasarle en vez de la llamada a la pos. del array (jugadores [ i ] ), pasarle directamente GameObject.Find("player"+i). Nada resulta, el jugador siempre es destruido. ¿Alguien puede echarme una mano? Muchas gracias de antemano. 

Tal vez puedas usar una lista en vez de un array, que es dinámica, puedes destruir elementos y te siguen quedando ordenados, luego al hacer un foreach te devolverá sólo los que falten. Prueba con eso para no cambiar mucho el código.

 void Awake() {
        DontDestroyOnLoad(transform.gameObject);
    }
tienes que utilizar dontdestroyonload en la funcion Awake de tus objetos, para al momento de instanciarse se anclee en la jerarquia, si se lo agregas despues no funcionara..


Gracias por contestar. No, cada turno llama a una escena donde se muestra una tarjeta aleatoria. Dentro de la escena del tablero, se va recogiendo la info de la otra escena y rellenando las puntuaciones. Mi problema es cuando quiero cambiar el turno del jugador. Tengo una variable j que va aumentando segun el jugador al que le toque, y el problema me viene cuando quiero acceder al siguiente jugador. Como declaro los jugadores en la escena del tablero, me dice que no existe el objeto al que estoy referenciando. Este es el código que tengo para la creación de los jugadores:  
//array de jugadores (dentro de la clase) 
    public static GameObject[] jugadores = new GameObject[5];
   
//inicializando
    void Awake(){
        Debug.Log("hago el awake");
        for (int i=1; i<=5; i++) {
            partida.jugadores [i-1] = GameObject.Find ("player" + i);
            Debug.Log(partida.jugadores[i-1].name);
            DontDestroyOnLoad(jugadores[i-1]);
        }//for
    }//awake
A continuación os muestro como hago el cambio de turnos: 

    public static void inicio(){
        Debug.Log("hago el Inicio");
        //turnos a false salvo el del player1
        turnos =  new bool[5]{true,false,false,false,false};
        //controlo al jugador
        //turno del primer jugador
        j = 0;

        GameObject.Find("player1").GetComponent<PlayerControl>().enabled = true;      
        GameObject.Find("player1").GetComponent<BoxCollider2D>().enabled = true;
       
        //desactivando el script de movimiento y el de collider para todos menos para el jugador1
        for(int i=2; i<6; i++){
            turnos[i-1]=false;
            GameObject.Find("player"+i).GetComponent<PlayerControl>().enabled = false;         
            GameObject.Find("player"+i).GetComponent<BoxCollider2D>().enabled = false;
        }
    }//inicio



    //acceso al personaje. control de puntuaciones.
    public static void acceso(){   
        Debug.Log("hago el acceso");
        Debug.Log ("variable j:" + partida.j);
        //si es el turno del ultimo jugador paso al jugador 1, si no, paso al siguiente
        if (partida.j.Equals (4)) {
            //inicio
            partida.inicio();
        }//if2
        else {
            //quito el turno, el movimiento y el collider con la pregunta
            partida.turnos [j] = false;
            partida.jugadores[j].GetComponent<PlayerControl>().enabled = false;
            partida.jugadores[j].GetComponent<BoxCollider2D>().enabled = false;
            partida.j += 1;
            //le doy el turno, el movimiento y el collider al siguiente jugador
            partida.turnos [j] = true;

            partida.jugadores[j].GetComponent<PlayerControl>().enabled = true;         
            partida.jugadores[j].GetComponent<BoxCollider2D>().enabled = true;
        }//else
    }//acceso
Muchas gracias por vuestra ayuda.   

for(int i=2; i<6; i++)
{
   turnos[i-1]=false;
   GameObject.Find("player"+i).GetComponent<PlayerControl>().enabled = false;         
   GameObject.Find("player"+i).GetComponent<BoxCollider2D>().enabled = false;
}
WOW!, Espera un segundo, GameObject.Find() <- Consume muchísimo, y ni hablar de GetComponent, y mucho menos los 2 Juntos!Yo Crearía un Componente llamado PlayerManager y dentro de tal agrego un Arreglo de Behaviour con todos los componentes que quieres que se desactiven, luego creo un metodo para recorrer ese array y desactivar tales, y posterior a esto en mi GameManager creo un arreglo de PlayerManager y recorro este llamando la función desactivar.  Si lo asignas desde el Inspector o desde el Start es lo mismo.Otro consejo, no uses GameObject, usa Transforms, lo recomienda Unity!   Suerte!

Noviembre 23, 2015, 07:39:38 PM #6 Ultima modificación: Noviembre 23, 2015, 07:39:55 PM por l0111
Muchas gracias http://unityspain.com/profile/18127-francoe1/?do=hovercard" data-mentionid="18127" href="<___base_url___>/profile/18127-francoe1/">@francoe1 , probaré las opciones que me cuentas  Igualmente gracias por contestar a todos. 

Etiquetas: