Page 1 sur 1

TimeScript C#

Publié : 09 Sep 2015 22:12
par brunom99
Bonjour à tous

Je vous fait profiter d'un petit script que j'ai fait et que j'utilise, une sorte de gestion de timer pour par exemple faire des choses toutes les x secondes...

Exemple d'utilisation de mon script :

Code : Tout sélectionner


void Awake () {
	// Initialisation du timer
	TimeScript.addTimer ("IdentifiantTimer", 4);
}

void Update () {
	if (TimeScript.isTimerReady ("IdentifiantTimer")) {
		// Ici le code est execute toutes les 4 secondes :)
	}
}

On peut biensur reinitialiser un timer et changer sa duree.

Code du fichier TimeScript :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TimeScript : MonoBehaviour {

	private class InfoTimer {
		public int nbSecondes;
		public float saveLastTime = 0f;
	}

	private static Dictionary<string, InfoTimer> dicTimer = new Dictionary<string, InfoTimer>();

	public static void addTimer(string name, int nbSecondes) {
		InfoTimer infoTimer = new InfoTimer ();
		infoTimer.nbSecondes = nbSecondes;
		infoTimer.saveLastTime = Time.time + infoTimer.nbSecondes;
		dicTimer.Add (name, infoTimer);
	}

	public static void resetTimer(string name) {
		InfoTimer infoTimer;
		if (dicTimer.TryGetValue (name, out infoTimer)) {
			infoTimer.saveLastTime = Time.time + infoTimer.nbSecondes;
		}
	}

	public static void changeTimer(string name, int nbSecondes) {
		InfoTimer infoTimer;
		if (dicTimer.TryGetValue (name, out infoTimer)) {
			infoTimer.nbSecondes = nbSecondes;
			infoTimer.saveLastTime = Time.time + infoTimer.nbSecondes;
		}
	}

	public static bool isTimerReady(string name) {
		return isTimerReady(name, true);
	}

	public static bool isTimerReady(string name, bool resetTimer) {
		InfoTimer infoTimer;
		if (dicTimer.TryGetValue (name, out infoTimer)) {
			if (Time.time > infoTimer.saveLastTime) {
				if(resetTimer) {
					infoTimer.saveLastTime = Time.time + infoTimer.nbSecondes;
				}
				return true;
			}
		}
		return false;
	}

}

Have Fun :)

Re: TimeScript C#

Publié : 09 Sep 2015 22:34
par E3DStef
Merci de ce partage...

Re: TimeScript C#

Publié : 10 Sep 2015 09:14
par boubouk50
Et c'est quoi la différence avec InvokeRepeating()?

Re: TimeScript C#

Publié : 10 Sep 2015 11:33
par brunom99
Et bienn

Moi je transmet un identifiant de timer et non le nom d'une methode..

Je peux donc demander dans n'importe quelle methode (de n'importe quelle classe) si mon timer est ready ou pas...
Je peux reset le timer quand je veux..
et Je ne choisis pas un nombre de repetition...

Re: TimeScript C#

Publié : 10 Sep 2015 11:44
par Iwa
brunom99 a écrit :et Je ne choisis pas un nombre de repetition...

Code : Tout sélectionner

InvokeRepeating(string methodName, float time, float repeatRate);
Le principe du InvokeRepeating te permet de repeat un appel de méthode toutes les repeatRate à partir d'un moment donné time. Et il ne s'arrête pas tant que tu ne fais pas un CancelInvoke().

Et au même titre que InvokeRepeating, il existe un Timer c#, les deux sont valables suivant ce que tu choisis de faire :). Après effectivement il faut trifouiller un peu pour y accéder de l'extérieur ^^.

En tout cas merci quand même de partager ton code :).

Re: TimeScript C#

Publié : 10 Sep 2015 11:56
par brunom99
Perso moi ce qui m'embete le plus dans InvokeRepeating c'est d'indiquer le nom d'une methode...

Mon timer est accessible par toutes les classes, et l'identifiant etant une simple clé, je trouve ca plus pratique :)

Apres perso, je touche pas de royalties si quelqu'un l'utilise pas hein :)

Re: TimeScript C#

Publié : 10 Sep 2015 12:53
par Max
Intéressant comme script. ;)
Juste une question en passant. Pour quoi ta classe TimeScript est elle dérivée de MonoBehaviour ? par simple réflexe ou pour raison précise (et qui m'a échappée) ?

Re: TimeScript C#

Publié : 10 Sep 2015 13:27
par brunom99
Tres bonne remarque, je pense qu'on peut tout a fait le retirer car je n'utilise pas de methode qui en ont besoin...

Re: TimeScript C#

Publié : 18 Sep 2015 22:50
par Titan
Pour ceux qui aiment pas galérer à réinventer la roue, en dehors des classes du namespace UnityEngine, je vous rappelle que vous avez accès à l'ensemble du framework .net (façon de parler).

Utilisez donc l'une des deux classes de Timer:
System.Timers.Timer
System.Threading.Timer

Re: TimeScript C#

Publié : 04 Fév 2016 18:46
par Selsynn
Le problème de la classe Timer (de la classe system.Timers), c'est qu'elle est threadé, ce qui n'est pas compatible avec le web (il faudrait faire un switch suivant la plateforme pour appeler du windows.forms.timer (de mémoire, je suis pas sure, j'ai pas encore fait cette motif dans mon code)

Comment réagit ton timer maison si on change de scène puis qu'on essaye d'y revenir ?

Edit : désolé de déterrer des assez vieux sujets