Demande de conseil : asynchrone ou non ?

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Cryborg
Messages : 11
Inscription : 22 Jan 2019 15:47

Demande de conseil : asynchrone ou non ?

Message par Cryborg » 22 Jan 2019 18:13

Salut les gens,

J'aimerais savoir comment vous feriez pour coder le cas suivant :

J'ai un nombre de joueurs à faire apparaître sur la scène. Je fais un foreach contenant une Coroutine qui va chercher en base les infos de chaque joueur, et instancier les objects qui vont bien.

Une fois sorti de la boucle foreach, je me rends compte que mon compte de joueurs est toujours à 0. Normal me direz-vous, vu que les coroutines sont asynchrones et que lorsque j'affiche le nombre de joueurs instanciés la première n'a toujours pas terminé.

Du coup je me pose la question : suis-je obligé d'utiliser une coroutine pour lancer mes requêtes via UnityWebRequest sur ma base MySQL étant donné que je n'ai aucun besoin que ce soit asynchrone (du moins pour ce cas-là) ?

Merci !

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: Demande de conseil : asynchrone ou non ?

Message par Sebela » 22 Jan 2019 18:50

Hello !
Tout dépend de ce que tu veux faire. Est-ce que c'est des grosses données ? Est-ce que tu veux afficher au fur et à mesure ou tout d'un coup ?
Tu peux aussi bien incrémenter ton compteur de joueurs à la fin de ta coroutine. Si tu as besoin d'attendre que la coroutine soit finie, tu peux utiliser un booléen qui est à true au début puis setté à false en fin de coroutine. Et tu te bases sur la valeur de ce booléen.

Cryborg
Messages : 11
Inscription : 22 Jan 2019 15:47

Re: Demande de conseil : asynchrone ou non ?

Message par Cryborg » 22 Jan 2019 19:48

Merci pour ta réponse !

Pour ce cas-là je n'ai pas besoin d'un gros volume de données, ce sont tout au plus 5ko qui seront chargés. C'est pour ça que je me demandais si vraiment j'avais besoin d'utiliser une coroutine, car attendre que le booléen passe à true supprime tout l'intérêt de cette fonctionnalité :)

Ce que je veux faire : aller chercher des données dans ma base MySQL, le PHP me retourne un JSON que je transforme en objet. Ces objets sont des entités qui, une fois remplies, vont permettre d'instancier le GameObject avec les infos qui vont bien. Tout ça fonctionne très bien si l'on excepte ce fameux décalage du à l'asynchronicité des coroutines lancées.

Une fois que tous ces objets sont créés, je peux donner le top départ au jeu. Mais visiblement il est difficile de lancer une requête UnityWebRequest en synchrone. Je vais tenter la méthode donnée dans ce blog : http://blog.cyberiansoftware.com.ar/pos ... nity3d-api.

Je voulais surtout savoir si ma manière de faire était la bonne, ou s'il n'existait pas une autre méthode moins... hasardeuse et expérimentale :D

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Demande de conseil : asynchrone ou non ?

Message par Alesk » 23 Jan 2019 10:46

Salut,

Pour tout ce qui concerne les requêtes web, tu DOIS faire ça en asynchrone... car tu ne sais jamais à l'avance combien de temps ça va durer, et donc si c'est fait en synchrone, ça va bloquer toute l'exécution de ton programme tant que la réponse ne seras pas arrivée.

Dans l'idéal il faut faire comme ceci :

- lancement de la requête vers le serveur
- affichage d'un message d'attente pour informer l'utilisateur que le programme est en train de réceptionner des données
- afficher un indicateur de status et de progression de la requête et de la réponse en cours de transit
- à la réception de la réponse, lancer la suite de l'exécution normale du programme
- en cas d'erreur en réponse, traiter cette erreur

Bien entendu, si la réponse est censée arriver très rapidement (moins d'une seconde), on peut retarder l'affichage du message d'attente, pour ne l'avoir que lorsque la réponse met vraiment longtemps à arriver.

Cryborg
Messages : 11
Inscription : 22 Jan 2019 15:47

Re: Demande de conseil : asynchrone ou non ?

Message par Cryborg » 24 Jan 2019 11:58

Je suis donc parti sur l'idée d'attendre l'exécution de mes requêtes, car c'est grâce à leurs données que je construis les GameObjects qui sont ensuite instanciés dans la scène.

Merci pour vos retours ! :)

Verrouillé

Revenir vers « Scripting »