[RESOLU][DB-AL] implémenter un KeyTimer à sa façon

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Kaloverian
Messages : 343
Inscription : 10 Août 2016 03:03

[RESOLU][DB-AL] implémenter un KeyTimer à sa façon

Message par Kaloverian » 31 Mars 2020 02:46

bonjour,

J'ai trouvé ce tuto:
https://answers.unity.com/questions/815 ... -down.html
qui ne m'a pas fourni satisfaction !
Ce que je souhaite:
1)tant que j'appuie sur une touche I,

Code : Tout sélectionner

if(Input.GetKeyDown(KeyCode.I))
une variable initialisée à 0(notons V) continue à s'incrémenter à la même vitesse
si je relâche I:

Code : Tout sélectionner

if(Input.GetKeyUp(KeyCode.I))
cette variable reste à sa dernière valeur fixe.
je rappui sur I, la variable V repart de cette dernière valeur pour s'incrémenter à vitesse constante
Ensuite pas sûr en dehors des if mais dans void Update()

Code : Tout sélectionner

transform.Rotate(0,0,angle*V,Space.Self);

2)tant que j'appuie sur une touche U,une variable W s'incrémente à vitesse croissante(notons acc son accélration)
si je relâche U, cette variable reste à sa dernière valeur
e rappui sur U, la variable W repart de cette dernière valeur pour s'incrémenter à vitesse croissante
Ensuite pas sûr en dehors des if mais dans void Update():

Code : Tout sélectionner

transform.Rotate((0,0,angle*W,Space.Self);

J'ai besoin de 2 petits codes réalisant 1) et 2)
1)tant que j'appuie,la rotation à vitesse constante s'effectue
je relâche,la rotation stoppe
et ainsi de suite...
2)tant que j'appuie,la rotation à vitesse croissante s'effectue.
je relâche,la rotation continue à vitesse constante sans s'accélérer
et ainsi de suite...

merci de votre aide

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: implémenter un KeyTimer à sa façon

Message par djulio74 » 31 Mars 2020 08:08

Au lieu de getkeydown et up, utilise juste getkey, qui est tant que la touche est appuyée.
Pour une augmentation constante, donc linéaire, juste ajouter une valeur fixe en utilisant bien un Time. Delta time. : V += Time. DeltaTime * vitesse voulue

Pour une augmentation croissante, donc exponentiel, il faut multiplier la valeur de base par une constante. : w *= Time. DeltaTime. * vitesse exponentielle voulue.
Attention à ce que W de base soit différent de 0 et que ( time. DeltaTime * valeur expo voulu) soit supérieur à 1, sinon tu aura l'effet inverse, de plus en plus lent.

Par contre je t'ai volontairement pas mis de code tout fait, c'est pas la vocation ici de tout faire pour les autres, mais plutôt de corriger ce que le demandeur a déjà fait, ou aider dans ce sens là.

Dans la règle générale, si tu demande toujours des codes tout fait, tu ne progressera pas. La je t'ai donné la méthode, le chemin de réflexion, essaye ( vraiment) d'appliquer la piste que je t'ai donné, et poste nous le code qui en résulte. Et je ( nous) continuerai de t'aider avec plaisir en tentant d'expliquer où et pourquoi certaine chose ne vont pas.
Aller au boulot !! :-D :-D

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Kaloverian
Messages : 343
Inscription : 10 Août 2016 03:03

Re: implémenter un KeyTimer à sa façon

Message par Kaloverian » 31 Mars 2020 14:40

j'ai réglé le problème sauf un:
Je n'arrive pas à coder ceci:
quand je relâche la touche,U ne continue pas à décroître même s'il s'est décrémenté qu'une seule fois.
Ce qui fait que si j'écris:

Code : Tout sélectionner

 if ((Input.GetKeyUp(KeyCode.P)))  //ça décroit qu'une seule fois donc la durée du relâchement de la touche n'est pas prise //en compte
        {
            U = 2;
            U -= accéleration;
            print("relachement touche :" + U);
Commet puis-je remédier à ceci?

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

Re: implémenter un KeyTimer à sa façon

Message par boubouk50 » 31 Mars 2020 15:01

Kaloverian a écrit :
31 Mars 2020 14:40

Code : Tout sélectionner

//ça décroit qu'une seule fois donc la durée du relâchement de la touche n'est pas prise en compte
Il n'y a pas de durée de relâchement. Tu relâches la touche, c'est une seule frame.
Il te faut lancer une coroutine ou un timer pour pouvoir donner un temps de relâchement en dehors de cette condition.
"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

Avatar de l’utilisateur
Kaloverian
Messages : 343
Inscription : 10 Août 2016 03:03

Re: implémenter un KeyTimer à sa façon

Message par Kaloverian » 31 Mars 2020 22:20

Voici mon code résolu:

Code : Tout sélectionner

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

public class KeyTimer : MonoBehaviour
{

	public float vitesse, accéleration, a, b, c;
	float W;

	// Use this for initialization
	void Start()
	{

	}

	// Update is called once per frame
	void Update()
	{

		if (Input.GetKey(KeyCode.P))
		{

			W += accéleration;

			print("appui continu touche P :" + W);
			//transform.Rotate(W * a, W * b, W * c, Space.Self);

		}

		if (Input.GetKey(KeyCode.D))
		{

			W -= accéleration;

			print("appui continu touche D :" + W);
			//transform.Rotate(W * a, W * b, W * c, Space.Self);

		}


		if (Input.GetKey(KeyCode.I))
		{

			W = vitesse;

			print("appui continu touche I :" + W);
			//transform.Rotate(W * a, W * b, W * c, Space.Self);

		}

		transform.Rotate(W * a, W * b, W * c, Space.Self);
	}
}




Répondre

Revenir vers « (C#) CSharp »