2016-08-02 95 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。祝你好运! :)