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