- 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

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.

### Follow this Question

### Related Questions

Animating y only on an object resembling a bomb 0 Answers

How Do I Make a 3D Axis Mover UI? 1 Answer

can't find the error source 2 Answers

Why do I get error when using yield? 1 Answer

Terrain tools error, can anyone help? 0 Answers