2016-10-16 6 views
0

Помогите мне изменить свой «ClickCounter.cs» с OnMouseButton() для мобильного телефона с мультитач. Я хочу показать, сколько раз я нажимаю на дисплей, но мой счетчик «var» увеличивает каждый кадр в Update(). Мой код для мыши - "ClickCounter.cs"Multitouch tap count

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 

public class ClickCounter : MonoBehaviour 
{ 

    Text ScoreText; //var for my text 

    void Start() 
    { 
     ScoreText = GameObject.Find("Score").GetComponent<Text>(); 
    } 


    int count = 0; 
    void OnMouseDown() //func count my click, but cant counting multitouch 
    { 
     count++; 
     ScoreText.text = "Score: " + count.ToString(); //text field with score (click count) 
     GameObject.Find("Pride").GetComponent<Animator>().SetTrigger("Click"); //some animation 
     Debug.Log(count); 

    } 
} 

Мой код для андроида

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 

public class TouchCounter : MonoBehaviour 
{ 
    Text scoreText; 

    void Start() 
    { 
     scoreText = GameObject.Find("Score").GetComponent<Text>(); //same 
    } 


    void Update() 
    { 
      if (Input.touchCount > 0) Counter(); //touch check 
    } 

    int count = 0; 
    void Counter() // 
    { 
      count++; 
      scoreText.text = "Score: " + count.ToString(); 
      GameObject.Find("Pride").GetComponent<Animator>().SetTrigger("Click"); 
    } 
} 

ответ

0

if (Input.touchCount > 0) всегда true, когда один или несколько пальцев помещается на экран. Поскольку это выполняется в функции обновления, Counter() будет называться десятки раз в секунду в зависимости от частоты кадров.

Вы также должны проверить на TouchPhase.Ended или TouchPhase.Began.

if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) Debug.Log("Tapped"); 

или

if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) Debug.Log("Tapped"); 

должны это сделать.

Даже если это должно сработать, возникает и другая проблема. Он не будет работать с одновременным нажатием нескольких пальцев. Вы должны зациклиться на Input.touchCount, чтобы сделать эту работу несколькими пальцами.

Другое дело, что кран должен иметь таймер. Таймер, определяющий, следует ли это рассматривать как кран или нет. Например, удерживание пальца на экране более чем на секунду не следует называть краном. Решение ниже решает все эти проблемы. Переменная timeOut может использоваться для определения того, как долго игрок должен держать палец на экране, чтобы он считался краном.

Для по умолчанию ничего более 0.5 секунд не является краном.

float[] fingerIdTimer = new float[5] { 0f, 0f, 0f, 0f, 0f }; //5 fingers max 
bool[] fingerIdValid = new bool[5] { true, true, true, true, true }; //One determine invalid, must be rest in TouchPhase.Ended 
const float timeOut = 0.5f; //Anything more than 0 and less than timeOut value is tap 

void Update() 
{ 
    //Loop over all finger touching the screen 
    for (int i = 0; i < Input.touchCount; i++) 
    { 
     //Will only increment if finger is valid 
     if (fingerIdValid[i]) 
     { 
      fingerIdTimer[i] += Time.deltaTime; 
     } 

     //If we reach the time out value and finger is still valid reset the finger id 
     if (fingerIdTimer[i] > timeOut && fingerIdValid[i]) 
     { 
      fingerIdTimer[i] = 0f; //Reset Held Time 
      fingerIdValid[i] = false; //Invalid 
      OnTapFailed(i, fingerIdTimer[i]); 
     } 

     //After touch is released, Anything more than 0 and less than timerOut value is tap 
     if (Input.GetTouch(i).phase == TouchPhase.Ended) 
     { 
      if (fingerIdTimer[i] > 0 && fingerIdTimer[i] < timeOut) 
      { 
       OnTapSuccess(i, fingerIdTimer[i]); 
      } 

      fingerIdTimer[i] = 0f; //Reset Held Time when released 
      fingerIdValid[i] = true; //Reset Invalid when released 
     } 
    } 
} 

int count = 0; 

//Tap was successful 
void OnTapSuccess(int fingerId, float heldTime) 
{ 
    count++; //Increment the tap count 

    Debug.Log("Tapped Count: " + count + "\r\n" 
     + "Finger ID: " + fingerId + "\r\n" 
     + "Held Time: " + heldTime); 

    //scoreText.text = "Score: " + count.ToString(); 
    //GameObject.Find("Pride").GetComponent<Animator>().SetTrigger("Click"); 
} 

//Tap failed (Time out Occured) 
void OnTapFailed(int fingerId, float heldTime) 
{ 
    Debug.Log("Tap Failed: " + fingerId); 
} 
+0

Спасибо спариваться! Он отлично работает! Я пытался «TouchPhase.Ended & TouchPhase.Began», скрипт работал, но я потерял способность мультитач. Еще раз спасибо – Evgeniy

+0

Добро пожаловать! – Programmer

0

установить кол = 0, но за пределами функции Update. Поэтому после одного прикосновения счет всегда будет! 0. Просто поставьте это предложение в функцию, и оно будет работать.

+0

Нет) есть другой способ решить – Evgeniy

+0

когда я ставлю этот вар внутри функции, я получаю «Count = 1» на выходе – Evgeniy