Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Nikki_heley · Jun 21, 2018 at 01:45 AM · errorx-axisy axis

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..alt text

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

sketch-1529509965547.png (85.8 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

4 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

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;
         }
 
     }
Comment
Add comment · Show 6 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Nikki_heley · Jun 21, 2018 at 05:26 AM 0
Share

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...

avatar image Nikki_heley · Jun 21, 2018 at 05:56 AM 0
Share

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..

avatar image LeeroyLin Nikki_heley · Jun 21, 2018 at 11:35 AM 0
Share

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.

avatar image Nikki_heley LeeroyLin · Jun 21, 2018 at 12:18 PM 0
Share

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.

Show more comments
Show more comments
avatar image
0

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

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

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Nikki_heley · Jun 21, 2018 at 11:12 AM 0
Share

Plz can you explain this...

avatar image UnbreakableOne Nikki_heley · Jun 21, 2018 at 11:44 AM 0
Share

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.

avatar image
0

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

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Nikki_heley · Jun 21, 2018 at 12:58 PM 0
Share

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

avatar image
0

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...

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Nikki_heley · Jun 27, 2018 at 04:42 PM 0
Share

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

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

116 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Animating y only on an object resembling a bomb 0 Answers

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

Parsing Error CS8025 1 Answer

Insert a semicolon error 1 Answer

Null Reference Exception 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges