TimeScript C#

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
Répondre
brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

TimeScript C#

Message par brunom99 » 09 Sep 2015 22:12

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 :)

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: TimeScript C#

Message par E3DStef » 09 Sep 2015 22:34

Merci de ce partage...
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

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

Re: TimeScript C#

Message par boubouk50 » 10 Sep 2015 09:14

Et c'est quoi la différence avec InvokeRepeating()?
"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

brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

Re: TimeScript C#

Message par brunom99 » 10 Sep 2015 11:33

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...

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: TimeScript C#

Message par Iwa » 10 Sep 2015 11:44

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 :).
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

Re: TimeScript C#

Message par brunom99 » 10 Sep 2015 11:56

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 :)

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: TimeScript C#

Message par Max » 10 Sep 2015 12:53

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) ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

Re: TimeScript C#

Message par brunom99 » 10 Sep 2015 13:27

Tres bonne remarque, je pense qu'on peut tout a fait le retirer car je n'utilise pas de methode qui en ont besoin...

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: TimeScript C#

Message par Titan » 18 Sep 2015 22:50

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
____________________________________________
Hop Boy

Selsynn
Messages : 8
Inscription : 04 Fév 2016 10:04

Re: TimeScript C#

Message par Selsynn » 04 Fév 2016 18:46

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

Répondre

Revenir vers « Scripts »