2016-08-02 96 views
0

目前我正在努力研究如何創建一個簡單的代碼來告訴我是否發生了一次攻擊,從而讓我獲得點擊的位置。瀏覽過很多不同的文章後,我很難被推薦爲Touch.tapCount,這通常只適用於ios。另外,我試圖使用Touch.deltaTime和/或Touch.deltaPosition來檢測一個抽頭但失敗。Unity3d如何檢測android上的水龍頭?

我定義了一個抽頭作爲具有手指之間

  • 一個非常短的時間最初接觸並最終離開電話

  • 很少或沒有運動

感謝閱讀這個,我希望它的清晰和精確,如果有任何細節或協助需要我的代表,以便您的回答隨意問。任何援助感激地收到。謝謝。

注意 - 我在C#中工作

+0

只使用一個UI.Button – Fattie

+0

@JoeBlow如何是UI.Button選擇性的「手指之間很短的時間初步接觸,最終退出電話'? –

+0

UI.Button的存在是爲了確定手指最初觸摸和最後退出手機之間是否存在非常短的時間。 – Fattie

回答

0

謝謝大家的迴應,我很感激,我確信有幾種不同的方式來檢測水龍頭。下面是我的代碼,它已被提示階段,使用階段來判斷一個觸摸是否有移動階段或不允許我告訴觸摸是否已移動,並滿足以下抽頭特性:

很少或沒有運動

另外通過查看觸摸之間的時間間隔的開始和結束階段,我可以檢測用於一個抽頭的第二特性,那就是:手指之間

一個非常短的時間最初接觸和終於 退出手機

這裏是我下面的代碼 -

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

我敢肯定,tapCount會在Android上工作。 在我的方案中,處理輸入的不是從MonoBehaviour派生。相反,它只是我傳遞的一個對象。我不會提供全班,但只是處理手機觸摸/水龍頭。

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) 
        { 
        } 
       } 

的我,是因爲我想知道用戶有多少接觸了,但是這應該讓你去至少。

編輯:我忘了提及,你可能想要這個if語句塊在協程裏面。

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

希望這有助於。

+0

說實話,我真的不明白你的代碼是什麼,但我有認爲通過階段的使用可以提供幫助,因爲我可以檢查觸摸是否已經經歷了開始階段和結束階段,而沒有移動階段,因此是敲擊。我會測試一下。您的代碼的任何進一步解釋將受到歡迎。 @MrKeeame –

+0

此外,它不會在Android上運行,因此'Android設備不會計算點擊數,該字段總是1'。直接從統一手冊http://docs.unity3d.com/Manual/MobileInput.html –

+0

那麼,可能是統一版本的差異,但我得到了代碼在幾個遊戲在iOS和Android。但是,這就是說,一旦我家有病就更新我的答案,希望能幫助你更多。 @g_l – TheNoob

2

首先,你必須找出你的Android設備是否確實可以註冊幾個觸摸。如果你有更新的設備,這應該不成問題。我會假設你的設備可以,如果不行 - 你很快就會發現。

讓我們從更新方法開始吧。

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

我們首先要做的就是註冊觸摸。我們可以通過放入一個foreach來檢查Input.touches中的觸摸。像這樣:

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

    } 
} 

通過這樣做,我們總是檢查當前屏幕上有多少觸摸。我們現在可以做的是通過fingerId檢查,如果fingerId == 0,1,2 ...運行一些代碼。這裏是我們現在得到的:

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! 
     } 
    } 
} 

到目前爲止我們太棒了!我們現在想要做的是檢測我們想要的動作。在我們的例子中,我們想要點擊,對吧?這應該與TouchPhase開始完美結合,並且結束。還有TouchPhase.Moved,但我們現在不需要。

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."); 
    } 
} 

在這裏,我們正在檢查的相應手指的階段。如果你現在運行它,你應該能夠在第一次觸摸進入時看到控制檯中的消息,並且離開屏幕。這可以通過幾個觸摸完成,所以這裏是'整個'腳本:

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."); 
      } 
     } 
    } 
} 

我希望這會幫助你。我自己對此很新,所以如果我們幸運的話 - 有更多經驗的人可以來幫忙。我相信這可以寫得更清潔。請記住,如果您構建它,則無法看到控制檯消息。如果還沒有,請查看Unity Remote。祝你好運! :)