- Home /
Unresponsive Touch
Hello,
The title might be overstating it, but we are developing an action game and it requires fast and precise touches. However, sometimes, mainly during fps spikes (spikes = 25-30 fps, down from the regular 60 fps), the touch is... unresponsive, some of the touches are not interpreted.
My code for touch input detection is as follows:
using UnityEngine;
using System.Collections;
public class TouchHandlerGame : MonoBehaviour
{
//public TextMesh debugText;
private bool buttonClick;
private Camera mainCamera;
private bool mobile;
//Variables for mouse slash
private Vector3 initialSlashPos;
private Vector2 initialTouchPos;
private Vector2 initialClickCancelPos;
private LayerMask layerNotHud;
private LayerMask layerSlashable;
private void Start()
{
layerNotHud = (1 << LayerMask.NameToLayer("BackgroundHUD")) | (1 << LayerMask.NameToLayer("ForegroundHUD")) | (1 << LayerMask.NameToLayer("FinisherHUD"));
layerNotHud = ~layerNotHud;
layerSlashable = (1 << LayerMask.NameToLayer("Slashable"));
mainCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
mobile = true;
}
private void Update()
{
if (!GlobalValues.paused)
{
if (mobile)
{
foreach (Touch touch in Input.touches)
{
if (touch.phase == TouchPhase.Began)
{
buttonClick = true;
}
if (touch.phase == TouchPhase.Moved)
{
//Cancela o Click se mover d+
if (initialClickCancelPos == Vector2.zero)
initialClickCancelPos = touch.position;
{
float sqrLen = (initialClickCancelPos - touch.position).sqrMagnitude;
if (sqrLen > 10000)
{
initialClickCancelPos = Vector2.zero;
buttonClick = false;
}
}
Ray ray = mainCamera.ScreenPointToRay(touch.position);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerSlashable))
{
if (initialTouchPos == Vector2.zero)
initialTouchPos = touch.position;
{
float sqrLen = (initialTouchPos - touch.position).sqrMagnitude;
if (sqrLen > 200)
{
initialTouchPos = Vector2.zero;
hit.collider.gameObject.SendMessage("OnMouseSlash", SendMessageOptions.DontRequireReceiver);
}
}
}
}
if (touch.phase == TouchPhase.Ended)
{
if (buttonClick)
{
Ray ray = mainCamera.ScreenPointToRay(touch.position);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerNotHud))
{
if (hit.collider.tag != "Button")
hit.collider.gameObject.SendMessage("OnMouseClickDown", SendMessageOptions.DontRequireReceiver);
}
}
buttonClick = false;
initialTouchPos = Vector2.zero;
initialClickCancelPos = Vector2.zero;
}
}
}
else
{
if (Input.GetMouseButtonDown(0))
{
buttonClick = true;
}
if (Input.GetMouseButton(0))
{
//Cancela o Click se mover d+
if (initialSlashPos == Vector3.zero)
initialSlashPos = Input.mousePosition;
else
{
float sqrLen = (initialSlashPos - Input.mousePosition).sqrMagnitude; //Mais rapido que Vector3.Distance
if (sqrLen > 10000)
{
buttonClick = false;
initialSlashPos = Vector3.zero;
}
}
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerSlashable))
{
if (initialSlashPos == Vector3.zero)
initialSlashPos = Input.mousePosition;
else
{
float sqrLen = (initialSlashPos - Input.mousePosition).sqrMagnitude; //Mais rapido que Vector3.Distance
if (sqrLen > 1000)
{
buttonClick = false;
initialSlashPos = Vector3.zero;
hit.collider.SendMessage("OnMouseSlash", SendMessageOptions.DontRequireReceiver);
}
}
}
}
if (Input.GetMouseButtonUp(0))
{
if (buttonClick)
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerNotHud))
{
if (hit.collider.tag != "Button")
hit.collider.SendMessage("OnMouseClickDown", SendMessageOptions.DontRequireReceiver);
}
}
buttonClick = false;
initialSlashPos = Vector3.zero;
}
}
}
}
}
The game is playable, it doesnt happen all that often, but more often than desired... am I detecting touches wrong? Does anyone else have this kind of problem?
Thank you for your attention, Best regards, Allan
Your answer
Follow this Question
Related Questions
Make an object move in the direction of touch 0 Answers
Having an issue with getting my touch controls working 0 Answers
Touch joystick tutorials ? 0 Answers
android touch input 1 Answer
Replace Input.GetAxis with Touch 2 Answers