• 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 Gode14 · May 28, 2013 at 02:04 AM · movementz axis

[Solved] Writing simple movement script; z axis behaving very strangely

Recently picked up Unity and decided to write my own simple movement script to get used to checking for buttons and manipulating the player controller (and C#). While x axis movement works fine, moving backwards on the z axis warps me into the ground/launches me in the air, and moving forward only works if I'm looking in a certain direction. Here's all the relevant code (I think):

 void Update ()
     {        
         CharacterController controller = GetComponent<CharacterController> ();
         
         //If forwards and backwards aren't pressed or are both pressed, don't move forwards or backwards
         if (!(Input.GetButton (Forward)) && !(Input.GetButton (Backward)) || ((Input.GetButton (Forward)) && (Input.GetButton (Backward)))) {
             MoveDirection [2] = 0;
             MoveDirection = transform.TransformDirection (MoveDirection);
         } else {
             //If forward is pressed, move forward
             if (Input.GetButton (Forward)) {
                 MoveDirection [2] = MoveSpeed;
                 MoveDirection = transform.TransformDirection (MoveDirection);
             }
             //And vice versa
             if (Input.GetButton (Backward)) {
                 MoveDirection [2] = MoveSpeed;
                 MoveDirection = transform.TransformDirection (-MoveDirection);
             } 
         }    
         
         //If right and left aren't pressed or are both pressed, don't move left or right
         if ((!(Input.GetButton (Left)) && !(Input.GetButton (Right))) || ((Input.GetButton (Left)) && (Input.GetButton (Right)))) {
             MoveDirection [0] = 0;
             MoveDirection = transform.TransformDirection (MoveDirection);
         } else {
             //If left is pressed, move left
             if (Input.GetButton (Left)) {
                 MoveDirection [0] = -MoveSpeed;
                 MoveDirection = transform.TransformDirection (MoveDirection);
             }    
             //And vice versa
             if (Input.GetButton (Right)) {
                 MoveDirection [0] = MoveSpeed;
                 MoveDirection = transform.TransformDirection (MoveDirection);
             } 
         }    
                         
         MoveDirection.y -= Gravity * Time.deltaTime;    
         controller.Move (MoveDirection * Time.deltaTime);    
     }

If anyone could give me some insight as to why one axis works fine and the other doesn't it would be much appreciated! I could post input configurations or any other information if necessary. Thanks!

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

1 Reply

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

Answer by Benproductions1 · May 28, 2013 at 02:12 AM

Hello,

So the first thing I see is that you are accessing the x, y and z components using indexes. It's much easier for people to read and for you to understand if you go MoveDirection.x rather than MoveDirection[0].
Your problem with movement lies with transform.TransformDirection. After every input check (vertical and horizontal) you are transforming the movement vector into global space. So unintentionally, you are transforming it twice.
To correct this, you should not transform the vector after every input check, but rather only just before you call Move. This will ensure that while you are getting the input, MoveDirection will be in local space and only just before you move, do you translate it into world space

Hope this helps,
Benproductions1

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 Gode14 · May 28, 2013 at 02:16 AM 0
Share

That works perfectly! I knew it was something simple like that. Thanks for your help. And your advice about Unity shorthand is noted - I will try to use the community's advised notation in the future. Thanks again!

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.

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.

Follow this Question

Answers Answers and Comments

14 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

Related Questions

How to move character X and Z axis? 1 Answer

My player doesn't move along the z axis 0 Answers

Mobile z axes movement 2 Answers

The name 'Joystick' does not denote a valid type ('not found') 2 Answers

Making a bubble level (not a game but work tool) 1 Answer


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