[Unity] Problema con Loader

Eslas

Me estoy rayando yo solo a ver si alguno me puede ayudar tengo 2 escenas, en la primera un login y en la segunda informacion sin mas, el boton de login llama a este metodo, como hay 1 segundo y algo entre que le das al boton y hace la peticion comprueba etc etc etc pues quiero poner un mensajito de loading para eso esta el Loader el problema que tengo es que no consigo que se muestre el GameObject Loader, me como el segundo y algo de espera y me cambia de escena, sin nada en medio :(

spoiler
Hukha

#1 Te lo llega a activar?
Es decir Loader.SetActive(true); llega a llamarse?

1 respuesta
Eslas

#2 sí, se activa pero no llega a verse

1 respuesta
Hukha

#3 Y si lo activas tu manualmente en el Game se ve?

1 respuesta
Jastro

Entiendo que es problema de asincronia.

Solucion que se me ocurre:

  • Dejas el codigo casi igual:
public void CheckCredentials() {
  Loader.SetActive(true);
  if (API.DoLogin(userText.text, passwordText.text)) {
   GeneralController.setScene(2);
  } else {
    Loader.SetActive(false);
    errorMessage.SetActive(true);
  }
}

Y en la escena (2) cuando este cargada (https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager-sceneLoaded.html)

Le pones loader a false y listo.

1 respuesta
Eslas

#4 sí, perfectamente
#5 si el problema no es desactivarlo el problema esque teoricamente la ejecución es asi
0) Pulsacion en el boton login
1) Activo el Loader (deberia empezar a verse)
2)Llamo al Api.DOLogin ( que hace todo lo que deba hacer)
3) acaba el Api.DoLogin se oculta el loader y a la escena 2

y lo que sucede es
0) pulsacion boton login
1) hace todo lo del API.Dologin()
2) va a la escena 2
y en ningun momento se ha visto el loader

3 respuestas
Jastro

#6 Yep, tendrias que debuggear para ver que falla exactamente, pero creo que lo que pasa es:

0) Pulsas login
1) Se activa el loader
2) Se hace el dologin
3) Se oculta el loader
4) Se queda frezeado 1 segundo por la carga de la nueva escena
5) termina de cargar se muestra.

Los pasos 1, 2 y 3 los hace tan rapido que no se ve. Por eso te digo que pruebes lo que puse, si aun asi, no te sale el loader, entonces es que algo va mal con el, ya sea porque no lo estas usando correctamente o a saber.

totespare

#6 hazlo en una corrutina y carga la escena cuando el login esté hecho. Supongo que ese login devolverá un callback, compruébalo en un while y cuando te devuelva un OK, haces la carga de la escena.

2 respuestas
Jastro

#8 Si, es que pinta a fallo de async a kms xD

#6 de donde sale lo de Dologin? que api estas usando?

1 respuesta
Eslas

#9 casera tengo una Clase API (creada por mi) para gestionar todas las conexiones con el servidor
#8 He probado esto y he conseguido que funcione decentemente de esta manera

spoiler

Tengo que quitar el tiempo ese y controlar cuando haga el login

1 respuesta
totespare

#10 eso no te logea fijo, me juego la cabeza de Jastro. Suponiendo que no hagas un callback, lo que tienes que hacer es un while con condicion de API.DoLogin blablabla == false, y dentro del while hacer un yield retun new waitforseconds de.. 0.1 por ejemplo (ve probando valores que se acerquen a lo que tarda en logear), fuera del while, a continuación, la carga de la escena.

Esto tiene un problema, y es que si no te logea nunca, pos lo tendrás en bucle infinito, asi que puedes hacer un contador de tiempo y que el while, aparte de comprobar el login, compruebe si se ha excedido el timeout que consideres apropiado (por ejemplo 5 segundos). El timeout hazlo sumando el mismo tiempo que hagas en el waitforseconds, y cuando supere 5 por ejemplo, que el while salga de ahí. Luego ya tú sabrás qué lógica meter si sale del while por timeout o porque ha logeado, o si vas a cambiar de escena directamente.

1 respuesta
Eslas

#11 el lunes probare ya actualizare a ver como lo soluciono jjajaj

Eslas

Bueno al final lo he conseguido apañar de la siguiente manera

spoiler
2 respuestas
Jastro

#13 genial, al final por lo que veo has optado por una solucion async mola, te en cuenta que se te ha colado una errata -->scena2

1 respuesta
Eslas

#14 ostras no me había dado cuenta jaja Gracias!

1 respuesta
B

A no ser que la escena esté guardada como scena2

EDIT: veo que no xD

1 respuesta
Eslas

#16 sisi esta guardada como "scena2" pero deberia llamarse o "Scene2" o "Escena2" pero no un mix jaja

Jastro

#15 el estar todo el dia haciendo reviews de pull requests tiene sus frutos, de nada :D

totespare

#13 el yield return null del principio te sobra, y como consejo, te digo lo que te comenté de hacer un timer para que el while no se quede ahí hasta el infinito comprobando.

spoiler

Con esto lo comprobarías una vez por segundo, y si a los 10 segundos no logea, pues ya metes lógica en el else if de abajo

1 respuesta
Eslas

#19 estoy modo vegetal pero bueno le dare un try luego a ver, Gracias!

1

Usuarios habituales