Timer et/ou coroutine

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Timer et/ou coroutine

Message par Jayme65 » 10 Mai 2017 21:29

Venant d'une application 'traditionnelle' (non Unity), je voudrais avoir des éclaircissement sur l'utilisation des coroutines.

Dans cette application, l'utilisateur défile dans une liste. Des information basiques sont affichées en temps réels lors du défilement.
Il y a par contre une temporisation de 250ms avant de lancer l'affichage d'une image correspondante (de façon à éviter que la procédure de chargement de l'image soit lancée pendant le défilement)
Après que l'image soit affichée il y a encore une temporisation de 5sec avant de lancer cette fois une video.

Code : Tout sélectionner

private Timer LoadBitmapTimer = new Timer();
private Timer LoadVideoTimer = new Timer();

LoadBitmapTimer.Elapsed += new ElapsedEventHandler(BitmapLoadStart);
LoadBitmapTimer.Interval = 250;
LoadVideoTimer.Elapsed += new ElapsedEventHandler(VideoLoadStart);
LoadVideoTimer.Interval = 5000;

// La procédure qui est appellée à chaque défilement dans la liste
void UpdateBasicData()
{
    // Affichage d'éléments texte
    
    // A chaque nouvel arret dans la liste, reset de la source du bitmap et de la video à NULL
    // ...et reset des timers
    LoadBitmapTimer.Stop();
    LoadVideoTimer.Stop();

    // Départ pour le différé de l'affichage de l'image
    LoadBitmapTimer.Start();
}

void BitmapLoadStart(object source, ElapsedEventArgs e)
{
    // Arret du timer pour ne pas qu'il se relance sans cesse
    LoadBitmapTimer.Stop();

    // Affichage de l'image

    // Départ pour le différé de l'affichage de la video
    LoadVideoTimer.Start();
}
void VideoLoadStart(object source, ElapsedEventArgs e)
{
    // Arret du timer
    LoadVideoTimer.Stop();

    // Affichage de la video    
}
Je découvre les coroutines et je voudrais savoir comment adapter ce schéma à la sauce Unity/Coroutine?
Est-ce possible,et si oui qu'est ce que ca donnerait comme code?
Est-ce souhaitable ou vaut-il mieux continuer à utiliser des timers?

Merci de m'aider à y voir plus clair et à choisir ce qui est le plus efficace dans ce cas de figure!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Timer et/ou coroutine

Message par boubouk50 » 11 Mai 2017 09:36

Pour créer des attentes dans une coroutine, il te faudra utiliser WaitForSeconds () (ou les autres existantes, tu les as dans la documentation aussi -> WaitUntil (), WaitForEndOfFrame (), etc). C'est très simple à mettre en place, il y a beaucoup d'exemples partout sur le net et aussi sur le Learn d'Unity
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Timer et/ou coroutine

Message par Jayme65 » 11 Mai 2017 11:34

Merci pour ta réponse!
Oui, je me suis un peu renseigné avant de demander de l'aide ;)...mais il me semblait - et c'est pour cela que j'ai donné du code en exemple - que le comportement était ici différent!?

Car quand tu me parles d'un WaitForSeconds (0.25), cela implique que l'on est déjà dans la coroutine et qu'après 250ms le reste du code va s'exécuter OR avant ce laps de temps l'utilisateur est peut-être déjà passé à un autre élément! Et du coup cet appel à la coroutine devrait être 'annulé' et un nouvel appel lancé (de manière à pouvoir relancer une nouvelle 'attente' avant l'exécution du code)!

Alors qu'avec l'utilisation de Timer il n'y a pas d'appel effectif à une fonction avant que les 250ms soient écoulées!

Est-ce que tu vois ce que je veux dire? (suis je clair) ;)

Quand on stoppe une coroutine et la relance, on en relance chaque fois une nouvelle instance, non? Est-ce une bonne chose, avec mon exemple de liste qui possède 30000 éléments, de chaque fois stopper une coroutine et en relancer une nouvelle instance? (là aussi j'espère que je suis clair;))

Merci pour ton aide!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Timer et/ou coroutine

Message par boubouk50 » 11 Mai 2017 12:01

Yep, j'ai pigé maintenant.
Je n'avais pas fait attention que tu utilisais la classe Timer, j'étais sur l'idée du timer dans un Update () ou une coroutine.
Je ne connais pas cette classe, elle est intéressante du coup, merci pour l'info, mais je ne saurais t'orienter. Il va falloir attendre un vrai développeur pour te répondre.

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Timer et/ou coroutine

Message par Greg » 18 Mai 2017 20:11

Bonjour,
si je comprend bien, l'équivalent Unity des Timers sont les fonctions Time.

Peut-être que cet exemple d'implémentation d'un délai pourra t'éclairer.
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Timer et/ou coroutine

Message par ZJP » 19 Mai 2017 14:41

Greg a écrit :...
si je comprend bien, l'équivalent Unity des Timers sont les fonctions Time.
...
Pas vraiment.... ;-)

C'est davantage un mélange de Coroutine/Invoke/InvokeRepeating.

Ce script fonctionne. (Je l'ai essayé :mrgreen: )

Code : Tout sélectionner

// Origine du source : https://forum.unity3d.com/threads/system-timer-help.115132/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using System.Timers;

public class CTimer : MonoBehaviour {

	private static System.Timers.Timer aTimer;

	void Start () {
		aTimer = new System.Timers.Timer(2000);
		aTimer.Elapsed += new ElapsedEventHandler(OnTick);
		aTimer.Start();
	}

	private static void OnTick(object source, ElapsedEventArgs e) {
		print(e.SignalTime);
	}

	void OnDisable () {
		aTimer.Dispose();
		print(aTimer == null);
	}
}

PS :

Je ne comprend pas pourquoi la discussion sur le forum officiel c'est orientée vers un autre choix (et pourquoi le débat autour du GC : il y en a aucun) car cette solution fonctionne sans souci. Cela dit, en 2011 il en était sans doute autrement. ;-)

Personnellement, je préfère utiliser les solutions proposés en natif par le compilateur (Mono) plutôt que les "équivalents" de l'API d'Unity.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Timer et/ou coroutine

Message par ZJP » 22 Juin 2017 22:10

ZJP a écrit : Personnellement, je préfère utiliser les solutions proposés en natif par le compilateur (Mono) plutôt que les "équivalents" de l'API d'Unity.
En effet ...... :?

Répondre

Revenir vers « Scripting »