2016-08-02 11 views
0

Momentan kämpfe ich darum herauszufinden, wie man ein einfaches Bit Code erstellt, der mir sagen kann, ob ein Tippen stattgefunden hat und mir die Position von Taps anzeigt. Nachdem ich viele verschiedene Artikel angeschaut habe, bin ich ziemlich ratlos, da Touch.tapCount oft vorgeschlagen wird, funktioniert nur für iOS. Außerdem habe ich versucht, Touch.deltaTime und/oder Touch.deltaPosition zu verwenden, um eine Berührung zu entdecken, aber ist gescheitert.Unity3d Wie erkennen Sie Taps auf Android?

definiere ich eine Anzapfung haben

  • einen sehr kurzen Zeitraum zwischen dem Finger zunächst berühren und schließlich das Telefon verlass

  • Wenig oder keine Bewegung

Dank für das Lesen Ich hoffe, es ist klar und präzise, ​​und wenn in meinem Namen irgendwelche Details oder Unterstützung erforderlich sind, um Ihre Fragen zu beantworten, zögern Sie nicht. Jede Hilfe wird dankbar angenommen. Vielen Dank.

Hinweis - ich arbeite in C#

+0

nur verwenden UI.Button – Fattie

+0

@JoeBlow Wie ist ein UI.Button selektiv zu ‚einem sehr kurzen Zeitraum zwischen dem Finger zunächst berühren und schließlich das Telefon verlassen '? –

+0

UI.Button gibt an, ob zwischen dem ersten und dem letzten Berühren des Telefons ein sehr kurzer Zeitraum war. – Fattie

Antwort

0

Vielen Dank für jede Antwort und ich bin dankbar, und ich bin sicher, es gibt mehrere verschiedene Möglichkeiten, ein Tippen zu erkennen. Unten ist mein Code, der nach Phasen gefragt wurde, verwendet Phasen, um zu erkennen, ob eine Berührung eine Bewegungsphase hat oder nicht, ob eine Berührung sich bewegt hat, und erfüllt die Abgriffskennlinie von:

Wenig oder nein

Bewegung

auch von zu der Zeit zwischen dem Berührungs verstrichene Suche begann und endete Phase i die zweite Eigenschaft für einen Stufe erkennen kann, das ist:

eine sehr kurze Zeit zwischen dem Finger zunächst berühren und schließlich das Telefon Verlassen

Hier ist mein Code unten -

using UnityEngine; 
using System.Collections; 

public class TouchManager : MonoBehaviour 
{ 
    public Vector2 touchPos; 
    int SCount; // Count of started touches 
    int MCount; // Count of ended touches 
    int ECount; // Count of moved touches 
    int LastPhaseHappend; // 1 = S, 2 = M, 3 = E 
    float TouchTime; // Time elapsed between touch beginning and ending 
    float StartTouchTime; // Time.realtimeSinceStartup at start of touch 
    float EndTouchTime; // Time.realtimeSinceStartup at end of touch 

    void Start() 
    { 
     SCount = 0; 
     MCount = 0; 
     ECount = 0; 
     StartTouchTime = 0; 
     EndTouchTime = 0; 
     TouchTime = 0; 
     // All variables are intialized at zero, likely uneccessary as i believe they're 'zeroed' by default 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     touchPos = Vector3.zero; 
     if (Input.touchCount != 0) 
     { 
      Touch currentTouch = Input.GetTouch(0); 
      switch (currentTouch.phase) 
      { 
       case TouchPhase.Began: 
        if (LastPhaseHappend != 1) 
        { 
         SCount++; 
         StartTouchTime = Time.realtimeSinceStartup; 
        } 
        LastPhaseHappend = 1; 
        break; 

       case TouchPhase.Moved: 
        if (LastPhaseHappend != 2) 
        { 
         MCount++; 
        } 
        LastPhaseHappend = 2; 
        break; 

       case TouchPhase.Ended: 
        if (LastPhaseHappend != 3) 
        { 
         ECount++; 
         EndTouchTime = Time.realtimeSinceStartup; 
         TouchTime = EndTouchTime - StartTouchTime; 
        } 
        LastPhaseHappend = 3; 
        break; 
      } 
      if (SCount == ECount && ECount != MCount && TouchTime < 1) 
       // TouchTime for a tap can be further defined 
      { 
       //Tap has happened; 
       touchPos = currentTouch.position; 
       MCount++; 
      } 
     } 
    } 
} 
0

ich ziemlich sicher bin, dass tapCount auf Android funktionieren. In meinem Szenario stammt die Eingabe nicht von einem MonoBehaviour. Stattdessen ist es nur ein Objekt, das ich herumgereicht habe. Ich werde nicht die volle Klasse liefern, sondern nur das, was mit den Berührungen/Berührungen des Telefons geschieht.

if (Input.touchCount > i) 
       { 
        if (Input.GetTouch(i).phase == TouchPhase.Began) 
        { 
        } 
        if (Input.GetTouch(i).phase == TouchPhase.Canceled) 
        { 
        } 
        if (Input.GetTouch(i).phase == TouchPhase.Ended) 
        { 
        } 
        if (Input.GetTouch(i).phase == TouchPhase.Moved) 
        { 
        } 
        if (Input.GetTouch(i).phase == TouchPhase.Stationary) 
        { 
        } 
       } 

Das i ist, weil ich, wie viele berührt der Benutzer wissen wollen, aber dies sollte man zumindest bekommen würde.

Edit: Ich habe vergessen zu erwähnen, möchten Sie dies wenn Anweisung Chunk innerhalb einer Coroutine.

https://docs.unity3d.com/Manual/Coroutines.html

Hoffnung, das hilft.

+0

Um ehrlich zu sein, verstehe ich nicht wirklich, was Ihr Code ist, aber ich habe dachte, dass durch die Verwendung von Phasen helfen könnte, wie ich prüfen konnte, ob eine Berührung sowohl die Anfangs- als auch die Endphase durchlaufen hat, ohne die Phase zu verschieben, daher ein Antippen. Ich werde das testen. Jede weitere Erläuterung Ihres Codes wäre zu begrüßen. @MrKeeame –

+0

Auch wird es auf Android nicht funktionieren, daher "Android-Geräte zählen Anzahl der Taps nicht, dieses Feld ist immer 1." direkt aus der Einheit Handbuch http://docs.unity3d.com/Manual/MobileInput.html –

+0

Nun, könnte Einheit Version Unterschied, aber ich habe diesen Code in mehreren Spielen auf iOS und Android. Aber, das gesagt zu haben, sobald ich zuhause krank bin, aktualisiere meine Antwort, um dir hoffentlich mehr zu helfen. @g_l – TheNoob

2

Zuerst müssen Sie herausfinden, ob Ihr Android-Gerät in der Tat mehrere Berührungen registrieren kann. Wenn Sie ein neueres Gerät haben, sollte dies kein Problem sein. Ich gehe davon aus, dass Ihr Gerät kann, und wenn es nicht möglich ist - Sie werden es bald genug herausfinden.

Beginnen wir mit der Update-Methode.

void Update() { 
// Nothing at the moment 
} 

Was möchten wir zuerst tun Berührungen registrieren. Wir können dies tun, indem wir eine foreach nach innen setzen und nach Berührungen in Input.touches suchen. Wie folgt:

void Update() { 
    foreach (Touch touch in Input.touches) { 

    } 
} 

Dadurch überprüfen wir immer, wie viele Berührungen sich derzeit auf dem Bildschirm befinden. Was wir jetzt tun können, ist mit fingerId zu überprüfen, und wenn fingerId == 0, 1, 2 ... Code ausführen. Hier ist, was wir jetzt haben:

void Update() { 
     foreach (Touch touch in Input.touches) { 

     if (touch.fingerId == 0) { 
      // Finger 1 is touching! (remember, we count from 0) 
     } 

     if (touch.fingerId == 1) { 
      // finger 2 is touching! Huzzah! 
     } 
    } 
} 

Wir sind so weit! Was wir jetzt tun wollen, ist die Bewegung, die wir wollen. In unserem Fall wollten wir Wasserhähne, oder? Das sollte perfekt mit TouchPhase Begann und Ended funktionieren. Es gibt auch TouchPhase.Moved, aber das brauchen wir jetzt nicht.

if (touch.fingerId == 0) { 

    if (Input.GetTouch(0).phase == TouchPhase.Began) { 
     Debug.Log("First finger entered!"); 
    } 

    if (Input.GetTouch(0).phase == TouchPhase.Ended) { 
     Debug.Log("First finger left."); 
    } 
} 

Hier überprüfen wir die Phase des entsprechenden Fingers.Wenn Sie das jetzt ausführen, sollten Sie in der Lage sein, die Nachrichten in der Konsole zu sehen, wann immer Ihre erste Berührung eintritt, sowie den Bildschirm zu verlassen. Dies kann mit mehreren Berührungen getan werden, also hier ist das "ganze" Skript:

void Update() { 
    foreach (Touch touch in Input.touches) { 

     if (touch.fingerId == 0) { 
      if (Input.GetTouch(0).phase == TouchPhase.Began) { 
       Debug.Log("First finger entered!"); 
      } 
      if (Input.GetTouch(0).phase == TouchPhase.Ended) { 
       Debug.Log("First finger left."); 
      } 
     } 

     if (touch.fingerId == 1) { 
      if (Input.GetTouch(1).phase == TouchPhase.Began) { 
       Debug.Log("Second finger entered!"); 
      } 
      if (Input.GetTouch(1).phase == TouchPhase.Ended) { 
       Debug.Log("Second finger left."); 
      } 
     } 
    } 
} 

Ich hoffe, dass dies Ihnen helfen wird. Ich bin selbst ziemlich neu in diesem Bereich, wenn wir also Glück haben, kann jemand mit mehr Erfahrung kommen und helfen. Ich bin zuversichtlich, dass dies viel sauberer geschrieben werden könnte. Denken Sie daran, dass Sie die Konsolenmeldungen nicht sehen können, wenn Sie sie erstellen. Schauen Sie sich Unity Remote an, wenn Sie es noch nicht getan haben. Viel Glück! :)

Verwandte Themen