Количество нажатий в режиме мультитач

#c# #android #unity3d #unityscript #unity5

#c# #Android #unity3d #unityscript #unity5

Вопрос:

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

 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);

    }
}
 

Мой код для android

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

Ответ №1:

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

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

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

или

 if (Input.touchCount > 0 amp;amp; 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 amp;amp; 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 amp;amp; 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   "rn"
          "Finger ID: "   fingerId   "rn"
          "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);
}
 

Комментарии:

1. Спасибо, приятель! Он работает отлично! Я пытался «TouchPhase. Завершено и фаза касания. Началось», скрипт работал, но я потерял возможность мультитач. еще раз спасибо

Ответ №2:

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

Комментарии:

1. когда я помещаю этот параметр внутри функции, я получаю «count = 1» при выходе