[SOLVED] When touch and drag objects fast (in android), leave dragging.
When touch and drag objects in android fast, leave dragging.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class codigoBola : MonoBehaviour {
public Text debug; // <- aqui arrastro un texto que tengo dentro de un canvas para usarlo a modo de console.log().
GameObject objeto = null; // <- usare esta variable para saber a objeto se esta haciendo click en ese momento.
// Para el drag:
Plane plane;
Vector3 Offset;
void Start() {
//Screen.orientation = ScreenOrientation.Landscape;
}
Ray generateMouseRay(Vector3 touchPosition){
Vector3 touchNear = new Vector3 (touchPosition.x, touchPosition.y, Camera.main.nearClipPlane);
Vector3 touchFar = new Vector3 (touchPosition.x, touchPosition.y, Camera.main.farClipPlane);
Vector3 tnear = Camera.main.ScreenToWorldPoint (touchNear);
Vector3 tfar = Camera.main.ScreenToWorldPoint (touchFar);
Ray mr = new Ray ( tnear, tfar - tnear );
return mr;
}
void FixedUpdate() {
if (Input.touchCount > 0) {
Touch touch = Input.GetTouch(0);
// Ray ray = Camera.main.ScreenPointToRay(touch.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
// Ray mouseRay = generateMouseRay(touch.position);
// if(Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit, Mathf.Infinity) && hit.collider.tag == "Draggable" ){
if(Physics.Raycast(ray, out hit, Mathf.Infinity) && hit.collider.tag == "Draggable" ){
objeto = hit.collider.gameObject;
ray = Camera.main.ScreenPointToRay(touch.position);
float rayDistance;
plane = new Plane (Camera.main.transform.forward * -1, objeto.transform.position);
plane.Raycast(ray, out rayDistance);
if (touch.phase == TouchPhase.Began) {
debug.text = "Touched " + objeto.name;
plane.Raycast(ray, out rayDistance);
Offset = objeto.transform.position - ray.GetPoint(rayDistance);
} else if (touch.phase == TouchPhase.Moved){
if (plane.Raycast (ray, out rayDistance)){
objeto.transform.position = ray.GetPoint(rayDistance) + Offset;
debug.text = "Dragging... " + objeto.name + " " + objeto.transform.position;
}
} else if (touch.phase == TouchPhase.Ended){
debug.text = "Ended!";
}
}// end physiscs.raycast
} // end if > 0
} // end update
} // end class
Comment
Answer by zebus · Apr 03, 2017 at 11:53 AM
Solved, this is my new code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class codigoBola : MonoBehaviour {
public Text debug; // <- aqui arrastro un texto que tengo dentro de un canvas para usarlo a modo de console.log().
// Para el drag:
GameObject objeto = null;
Ray ray;
Plane plane;
float rayDistance;
Vector3 Offset;
bool mouseOver = false;
bool mousePressed = false;
void Start() {
//Screen.orientation = ScreenOrientation.Landscape;
}
void FixedUpdate() {
if (Input.touchCount > 0) {
mousePressed = true;
} else {
mousePressed = false;
objeto = null;
debug.text = "";
}
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if ( Physics.Raycast(ray, out hit, Mathf.Infinity) && hit.collider.tag == "Draggable" ){
mouseOver = true;
if (Input.GetTouch(0).phase != TouchPhase.Moved){ // <- con esto evito mover otros objetos mientras muevo el actual.
objeto = hit.collider.gameObject;
}
} else {
if (mousePressed == false){
mouseOver = false;
}
}
if (mouseOver){
if (mousePressed){
plane = new Plane (Camera.main.transform.forward * -1, objeto.transform.position);
plane.Raycast(ray, out rayDistance);
objeto.transform.position = ray.GetPoint(rayDistance) + Offset;
debug.text = "Arrastrando... " + objeto.name + " " + objeto.transform.position;
}
}
} // end update
} // end class
Your answer
Follow this Question
Related Questions
How can I determine the speed of my touch movements? 0 Answers
Code help with mobile touch drag 3D Top Down 0 Answers
What is the best way to implement a more responsive custom drag event with Scroll Rect? 0 Answers
Touch to move and drag to rotate object 2 Answers
Drag the screen back and forth to left/right level (mobile) 0 Answers