#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» при выходе