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;
         }
     }
 }

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;
        }

    }

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

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

try this code,i

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…