[DB-AL] Une methode double clic ? RESOLU

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
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

[DB-AL] Une methode double clic ? RESOLU

Message par DJ-OMZ » 28 Juin 2017 12:09

Bonjour a tous,

Existe-t-il une méthode double clic déjà codée pour nous, pauvre mortels ? (Comparable au OnMouseUp qui fonctionne très bien).

En recherchant un peu sur Google, il semble que non, et j'ai testé des bouts de codes proposés sur des forums, mais ça ne fonctionnait pas nickel...

Je viens au news pour savoir... Au pire si quelqu'un en a codé une et veut bien la partager ? Sinon je vais essayer de mon coté et ça ne me dérange pas de partager ça pour d'autres qui en auraient besoin, si ça marche :hehe:
Dernière édition par DJ-OMZ le 28 Juin 2017 15:18, édité 2 fois.

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

Re: Une methode double clic ?

Message par boubouk50 » 28 Juin 2017 12:11

Un double-clic, c'est deux OnMouseDown () ou deux Input.GetMouseButtonDown(0) dans un intervalle court déterminé.
"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
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: Une methode double clic ?

Message par evereal » 28 Juin 2017 13:24

Code : Tout sélectionner

float delai = 0.5f;
float lastClick = -1f;

void Update() {
  if (Input.GetMouseButtonDown(0)) {
   if (Time.time - lastClick  < delai) {
     // do smthng
     lastClick =  -1f;
   } else {
    lastClick  = Time.time;
   }
  }  
}
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Une methode double clic ?

Message par DJ-OMZ » 28 Juin 2017 14:11

evereal a écrit :

Code : Tout sélectionner

float delai = 0.5f;
float lastClick = -1f;

void Update() {
  if (Input.GetMouseButtonDown(0)) {
   if (Time.time - lastClick  < delai) {
     // do smthng
     lastClick =  -1f;
   } else {
    lastClick  = Time.time;
   }
  }  
}
Merci pour ce code.
Il correspond bien a ce que j'avais, mais dans mon update, j'obtiens mon resultat 3 fois :

Code : Tout sélectionner

if (Input.GetMouseButtonDown(0))
        {
            if (Time.time - lastClick < delai)
            {
                Debug.Log("Double clic");
                lastClick = -1f;
            }
            else
            {
                Debug.Log("Simple clic");
                lastClick = Time.time;
            }
        }
Me donne soit :
Simple clic
Simple clic
Simple clic

Soit :
Double clic
Double clic
Double clic

Pourquoi ça le fait 3 fois ?




Edit :

Pour ceux qui seraient intéressés plus tard, voila une méthode qui a fonctionné pour moi :

Code : Tout sélectionner

     using System.Collections;
     using UnityEngine;
     
     public class Example : MonoBehaviour {
     
         public float clickDelta = 0.35f;  // Max between two click to be considered a double click
     
         private bool click = false;
         private float clickTime;
     
         void Update() {
             if (click && Time.time > (clickTime + clickDelta)) {
                 // Ici, mon action en cas de simpleclic
                 click = false;
             }
         }
     
         void OnMouseDown() {
             if (click && Time.time <= (clickTime + clickDelta)) {
                 // Ici, mon action en cas de double clic
                 click = false;
             }
             else {
                 click = true;
                 clickTime = Time.time;
             }
         }
     }

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

Re: Une methode double clic ?

Message par boubouk50 » 28 Juin 2017 15:27

DJ-OMZ a écrit :Pourquoi ça le fait 3fois ?
Combien de fois ce script est exécuté par clic? Je veux dire par là combien d’instances du script sont présentes?
"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
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Une methode double clic ?

Message par DJ-OMZ » 28 Juin 2017 15:44

boubouk50 a écrit :
DJ-OMZ a écrit :Pourquoi ça le fait 3fois ?
Combien de fois ce script est exécuté par clic? Je veux dire par là combien d’instances du script sont présentes?
Oh ! J'ai 3 objets qui ont ce script en component ! :shock: :shock: :shock:

C'est pour ça que j'ai 3 fois le texte du debug qui s'affiche ?

C'est bizarre parce que :

Code : Tout sélectionner

if (Input.GetMouseButtonDown(0))
        {
            if (Time.time - lastClick < delai)
            {
                Debug.Log("Double clic");
                lastClick = -1f;
            }
            else
            {
                Debug.Log("Simple clic");
                lastClick = Time.time;
            }
        }
Logiquement, ce bout de script va s’exécuter que pour l'objet sur lequel j'ai cliqué non ? :-/

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

Re: [DB-AL] Une methode double clic ? RESOLU

Message par boubouk50 » 28 Juin 2017 15:59

Non, celui-là est en fonction de l'Input. Donc il est exécuté à chaque clic de la souris.
Il faut passer par l’événement OnMouseDown () pour que ce soit 'localisé'.
T'avais une chance sur les 2 solutions proposées. Raté. :-D
Qui plus est, un événement est exécuté seulement lorsque l'interaction à lieu alors que l'Update () l'est à chaque frame. Donc il est moins gourmand. (Une condition par frame c'est pas la mort non plus)
Après c'est une question de nécessite. Est-ce plutôt le double-clic qui va chercher un objet via un Raycast ou bien est-ce l'objet lui-même qui doit savoir s'il est double-cliqué.
La première induit une instance unique, la seconde une instance par objet double-cliquable. Donc à toi de voir ce qui semble le plus juste ou logique en fonction de ton besoin.
"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
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: [DB-AL] Une methode double clic ? RESOLU

Message par DJ-OMZ » 29 Juin 2017 09:35

boubouk50 a écrit :Non, celui-là est en fonction de l'Input. Donc il est exécuté à chaque clic de la souris.
Il faut passer par l’événement OnMouseDown () pour que ce soit 'localisé'.
C'est ce que j'ai compris également, bon bah merci !
boubouk50 a écrit :T'avais une chance sur les 2 solutions proposées. Raté. :-D
Un grand classique chez moi...
boubouk50 a écrit :Est-ce plutôt le double-clic qui va chercher un objet via un Raycast ou bien est-ce l'objet lui-même qui doit savoir s'il est double-cliqué.
C'est l'objet qui doit savoir. J'effectue une action si je clique sur mon objet, une autre si je double clic, et c'est bien a lui de le savoir dans mon cas.

Bon bah ça m'aura fait comprendre une erreur a ne pas reproduire, bien vu :super:

Répondre

Revenir vers « (C#) CSharp »