- Home /
Question by
Nikki_heley · Jun 26, 2018 at 01:39 PM ·
androidscripting problem
How to increase number of movement in one swipe input ?
Hi guys.. i am making a game in unity for android platform i have made a cube which rolls with a swipe input. When i swipe on the screen the cube roll one time but i want that when i swipe on screen the cube rolls as many times as possible in that particular time (time taken in one swipe) . Can anyone help me with that. Here is my script which sits on the cube :-
public float rotationPeriod = 0.3f;
public float sideLength = 1f;
bool isRotate = false;
float directionX = 0;
float directionZ = 0;
Vector3 startPos;
float rotationTime = 0;
float radius;
Quaternion fromRotation;
Quaternion toRotation;
float x, y;
public float minSwipeDistY = 1;
public float minSwipeDistX = 1;
private Vector3 touchStartPos;
// Use this for initialization
void Start()
{ radius = sideLength * Mathf.Sqrt (2f) /2f;}
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR || UNITY_STANDALONE
DetectMouseSwipe();
#else DetectSwipe();
#endif if ((x != 0 || y != 0) && !isRotate)
{ directionX = y;
directionZ = x;
startPos = transform.position; fromRotation = transform.rotation; transform.Rotate(directionZ * 90, 0, directionX * 90, Space.World);
toRotation = transform.rotation;
transform.rotation = fromRotation;
rotationTime = 0; isRotate = true; }
}
void FixedUpdate()
{ if (isRotate) { rotationTime += Time.fixedDeltaTime;
float ratio = Mathf.Lerp(0, 1, rotationTime / rotationPeriod);
float thetaRad = Mathf.Lerp(0, Mathf.PI / 2f, ratio);
float distanceX = -directionX * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad));
float distanceY = radius * (Mathf.Sin(45f * Mathf.Deg2Rad + thetaRad) - Mathf.Sin(45f * Mathf.Deg2Rad));
float distanceZ = directionZ * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad));
transform.position = new Vector3(startPos.x + distanceX, startPos.y + distanceY, startPos.z + distanceZ);
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, ratio);
if (ratio == 1)
{ isRotate = false;
directionX = 0;
directionZ = 0;
rotationTime = 0; }
}
}
void DetectSwipe()
{ x = y = 0;
if (Input.touchCount > 0) { Touch touch = Input.touches[0];
Vector3 touchPos = touch.position;
if (touch.phase == TouchPhase.Began) { touchStartPos = touchPos; }
else if (touch.phase == TouchPhase.Ended) { float angle = CalculateAngle(touchStartPos - touchPos, Vector2.right);
int dir = Mathf.CeilToInt((angle - 45) / 90f);
if (dir == 4) dir = 0;
if (dir == 0) x = 1;
else if (dir == 2) x = -1;
if (dir == 3) y = -1;
else if (dir == 1) y = 1; }
}
}
float CalculateAngle(Vector3 from, Vector3 to) { Vector3 euler = Quaternion.FromToRotation(Vector3.right, to - from).eulerAngles;
return euler.z != 0 ? euler.z : euler.y; }
void DetectMouseSwipe()
{ x = y = 0;
if (Input.GetMouseButtonDown(0)) { touchStartPos = Input.mousePosition; }
else if (Input.GetMouseButtonUp(0)) { float angle = CalculateAngle(touchStartPos - Input.mousePosition, Vector2.right);
int dir = Mathf.CeilToInt((angle - 45) / 90f);
if (dir == 4) dir = 0;
if (dir == 0) x = 1;
else if (dir == 2) x = -1;
if (dir == 3) y = -1;
else if (dir == 1) y = 1; }
}
Comment
Answer by Glurth · Jun 27, 2018 at 02:47 PM
I think the issue lies with
if (touch.phase == TouchPhase.Ended)
Not quite sure because the code is in a very hard to read format, but it looks like if you change this conditional to
if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Moved)
you'll get it to work during movement, and not just at the end.
Thanks bro i appreciate your answer . But can explain this to me ..pls sry for that.. By the way i have edited the question..