Noticias

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

Consulta sobre orden de creación de objetos en escena o pausa en el Start

Iniciado por Tizon, Enero 14, 2017, 06:47:33 PM

Tema anterior - Siguiente tema
Hola, seguro que muchos os habéis encontrado en un caso similar, y seguramente la solución es fácil, pero no consigo dar con ella.
 
Veréis, el caso es el siguiente, en un GameObject creo un diccionario, en otro cargo los datos y finalmente en un tercero los leo para su uso. El caso es que en todos uso el Start para cargar las referencias entre objetos y componentes. Lo hago en el Start para estar seguro de que todos existen (Se han generado) y no me va a fallar por ahí. Pero el caso es que en el momento de lanzar el juego, la función del tercer objeto me da error en el diccionario, casi seguro por qué el segundo elemento aún no ha cargado los datos en el diccionario (Aparte del error que me lanza, es que si aguardo que me salte el error y continúo todo me va perfecto) y mi pregunta es, hay algún modo de indicarle a Unity que ejecute el Start dejando algunos GameObject los últimos o por un orden(esto sería ideal) o de decirle dentro del Start que aguarde aunque sea un segundo? O alguna función que se ejecute una única vez tras el Start? No quiero meterlo en el Update por qué me forzaría un if, y tendré que recurrir a este método en muchos más GameObject y eso serían muchos if por frame para algo que seguro que existe un método mucho más elegante de resolver.
 
Cómo lo solucionarías vosotros?
 
Nuevamente muchas gracias a todos.

No sé si es lo que buscas sobre los segundos, pero puedes usar IENumerator.
 
 <
 
private void Start()

    {

        //Llamar al IEnumerator

        StartCoroutine(cot(4));

    }

    IEnumerator cot(int a)

    {

        yield return new WaitForSeconds(a);

        algunmetodo();

    }

    private void algunmetodo()

    {

        print("Hola");

    }
 
>

Cita de: ytinU date=1484418501No sé si es lo que buscas sobre los segundos, pero puedes usar IENumerator.
   
   
       <
   
   
      private void Start()

          {

              //Llamar al IEnumerator

              StartCoroutine(cot(4));

          }

          IEnumerator cot(int a)

          {

              yield return new WaitForSeconds(a);

              algunmetodo();

          }

          private void algunmetodo()

          {

              print("Hola");

          }
   
   
      >
   


Pues parece buena opción. Voy a informarme a ver si por ejemplo permite fracciones de segundo (Sólo necesito milisegundos para que cargue los datos) y si muchas de ellas cargan mucho el sistema, ya que lo voy a tener que implementar en muchos gameobjects. Gracias!!! 

Podrias poner los scirpts que no te dan el error en awake() y el que te da el error en start() (como ya lo tenes).
 
Podrias Usar co-rutinas haciendo yield entre corrutinas, basicamente una vez que termina una en un script (publica) empieza la otra, y asi te aseguras de mantener el orden, como dice Tizon.
 
La otra es la de tener acceso a una variable bool que se setee cuando cada script se inicialice correctamente. Basta con usar algo asi en cada script dependiente del manager general o script maestro (como quieras llamarlo).
 
Scriptmaestro:
 

private bool m_ready = false;
public bool isReady
{
get
{
   return m_ready;
}
}
 
void Awake()
{
//inicializacion del script maestro

//bla bla
m_ready = true;

}

 
 
 
Y en los scripts dependientes:
 

void Update()
{
if(!init){
      if(scriptMaestro.isReady)      
          Init();   //pone a init en true
      else
          return;
}
//una vez que esta listo sigue el curso normal
}

 
 
 
Las corrutinas son geniales, el lado negativo que le veo es que cuando estas demasiado acostumbrado a estas las pones en absolutamente todo, y cuando tenes 1000 scripts con corrutinas corriendo la performance se te viene abajo. La otra es que no se porque despues de un yield existe un pico de demanda de ciclos muy grande (x10 en comparacion al estado en idle). En el assetstore se vende una extension que elimina esto creando sus propio sistema de corrutinas, la verdad ni idea como lo hace. En fin, para este caso no hay diferencia alguna.
 
Saludos
 
 
 
 
 
 

Cita de: Tizon date=1484421977Pues parece buena opción. Voy a informarme a ver si por ejemplo permite fracciones de segundo (Sólo necesito milisegundos para que cargue los datos) y si muchas de ellas cargan mucho el sistema, ya que lo voy a tener que implementar en muchos gameobjects. Gracias!!! 
   


Si se puede usar con milisegundos, solo seria cuestión de pasarle por parametro (1/1000).

Etiquetas: