- Home /

# How to make my cube move on X axis and Y axis (not tangentlly) ?

Hi guys i am making a 3D android game in unity. In this game we have to move our cube (basically rolling it). I have a script which sits on cube .. according to the script the cube must move in X axis and Y axis but when i swipe tangentlly (between x axis and y axis) cube show irregular movement it gets tossed etc.. how to fix that cube on X axis and y axis . I will show you the pic..

And this is my code for 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
x = Input.GetAxisRaw("Horizontal");
if (x == 0)
{
y = Input.GetAxisRaw("Vertical");
}
#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];
switch (touch.phase)
{
case TouchPhase.Began:
touchStartPos = touch.position;
break;
case TouchPhase.Ended:
float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, touchStartPos.y, 0)).magnitude;
if (swipeDistVertical > minSwipeDistY)
{
float swipeValue = Mathf.Sign(touch.position.y - touchStartPos.y);
y = swipeValue;
/*if (swipeValue > 0)//up swipe
Jump ();
else if (swipeValue < 0)//down swipe
Shrink ();*/
}
float swipeDistHorizontal = (new Vector3(touch.position.x,0, 0) - new Vector3(touchStartPos.x, 0, 0)).magnitude;
if (swipeDistHorizontal > minSwipeDistX)
{
float swipeValue = Mathf.Sign(touch.position.x - touchStartPos.x);
x = swipeValue;
/*if (swipeValue > 0)//right swipe
MoveRight ();
else if (swipeValue < 0)//left swipe
MoveLeft ();*/
}
break;
}
}
}
```

**Answer** by LeeroyLin
·
Jun 21, 2018 at 03:55 AM

God! I can't reply to you. Maybe I need a higher "Reputation". So I just edit my answer here.
I create a DetectMouseSwipe function to receive mouse input, you can change your DetectSwipe function by yourself. And here is a CalculateAngle function to calculate the angle(0-360).

I divide the 360angle into 4 directions, which means your move directions.
This will make your cube only move in 4 directions, maybe it's what you mean.
Hope this can help you, bro:

```
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()
{
// ...
}
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;
}
}
```

Leeroylin thanks bro i appreciate your answer but i didn't get this function

```
float CalculateAngle(Vector3 from, Vector3 to)
{
Vector3 euler = Quaternion.FromToRotation(Vector3.right, to - from).eulerAngles;
return euler.z != 0 ? euler.z : euler.y;
}
```

How to put this function in my script...

Also sir i want that my cube moves in X and Y axis ...not tangently...when i swipe between the x and y axis it moves on its vertices as show in the pic ...the arrow b/w x and y axis . I just want that weather i swipe in north east direction ..it must move in X axis or Y axis.. $$anonymous$$ay be u understand bro..

How about my new answer? I edit it because I can't reply to you just now. I'm not sure you have seen it.

Thanks i understand what you are saying but what about my detectswipe function , can you please modify my script ...you have maded a new function which is similar to detectswipe..??? What about the detectswipe function..

Plz edit the answer.

**Answer** by UnbreakableOne
·
Jun 21, 2018 at 11:10 AM

Maybe detect movement in x and y and only move on the bigger one?

I'm just giving you my 2 cents here. After you get input on your Update(), compare them and move the cube on the bigger amount, or based on it.

**Answer** by rkoHari
·
Jun 21, 2018 at 11:51 AM

float x=Input.GetAxis("Mouse x"); float y=Input.GetAxis("Mouse Y");

try this code,i

Bro this not a swipe movement this is a mouse movement .

**Answer** by nareshbishtasus
·
Jun 27, 2018 at 02:48 PM

I didnt understand the question fully... But if you want to move the cube in x or y direction only then u can write this code

float x = Input.GetAxis("Horizontal"); Float y = inpu.getaxis("vertical");

If(x > y) y=0; else x = 0;

transform.translate(x, 0, y);

I didnt understand what do do with rotation... Tell me i think i can help...

Thanks bro i appreciate that but i want to change the keys input to touch input.. And now it is done... Thanks...

### Your answer

### Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.