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 /
  • Help Room /
This question was closed Nov 28, 2019 at 09:03 AM by BigBadSlug for the following reason:

Problem was solved

avatar image
1
Question by BigBadSlug · Nov 25, 2019 at 10:37 PM · scripting problemmovementphysics3dfirst-person-controller

Air Control not working on Character Controller

Hi all,

I've been trying to find a solution to this problem for some time now and haven't had too much luck. I'm trying to implement limited air control for my first-person character controller, but I keep facing an issue in which if I try to move while mid-air, my player starts bugging out or flying in circles.

I've tried checking if x and z input is positive/negative and adding/subtracting respectively but can't seem to get it to change at all.

Here's what I have currently

     void Start()
     {
         controller = GetComponent<CharacterController>();
         controllerCollider = GetComponent<CapsuleCollider>();
     }
     private void Update()
     {
         GetPlayerInput();
 
         if (controller.isGrounded)
         {
             velocity.x = xInput;
             velocity.z = zInput;
             velocity.y = 0f;
             controller.slopeLimit = 45.0f;
             if (Input.GetButton("Jump"))
             {
                 velocity.y = jumpHeight;
                 controller.slopeLimit = 90.0f;
             }
 
         }
         else
         {
             velocity.x = (velocity.x + xInput);
             velocity.z = (velocity.z + zInput);
         }
 
         velocity.y -= gravity * Time.deltaTime;
 
         velocity = transform.TransformDirection(velocity);
 
         controller.Move(velocity * walkingSpeed * Time.deltaTime);
 
         if ((zInput != 0 || xInput != 0) && AntibumpCheck())
         {
             controller.Move(Vector3.down * controller.height / 2 * antiBumpMultiplier * Time.deltaTime);
         }
     }
 
     private void GetPlayerInput()
     {
         xInput = Input.GetAxisRaw("Horizontal");
         zInput = Input.GetAxisRaw("Vertical");
         if (xInput != 0f && zInput != 0f)
         {
             xInput *= 0.7071f;
             zInput *= 0.7071f;
         }
     }

Any help is appreciated, 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

  • Sort: 
avatar image
1

Answer by lgarczyn · Nov 27, 2019 at 02:15 AM

I had to try to fix your code after your last ask. Had to get rid of the bump check since I don't have the source for that, but if you do keep it, I would suggest not calling Move twice in the same frame, as advised by the documentation.

 private void Update()
 {
     Vector3 input = GetPlayerInput();

     if (controller.isGrounded)
     {
         velocity = input * walkingSpeed;
         controller.slopeLimit = 45.0f;

         if (Input.GetButton("Jump"))
         {
             velocity.y = jumpHeight;
             controller.slopeLimit = 90.0f;
         }

     }
     else
     {
         velocity += input * airSpeed;
     }

     velocity.y -= gravity * Time.deltaTime;

     controller.Move(velocity * Time.deltaTime);
 }

 private Vector3 GetPlayerInput()
 {
     Vector3 output = new Vector3();

     output.x = Input.GetAxisRaw("Horizontal");
     output.z = Input.GetAxisRaw("Vertical");
     output = Vector3.ClampMagnitude(output, 1f);
     output = transform.rotation * output;
     output.y = 0;

     return (output);
 }

The problem was keeping the velocity local, when it should have been in world coordinates.

This code will work as long as you do not rotate the CharacterController on any axis but the Y axis. If you rotate it downward to look down, your character will move slower when you do so.

To add a 'look up and down' functionality, it's usually best to rotate the camera inside the player, instead of rotating the player.

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 BigBadSlug · Nov 27, 2019 at 08:34 AM 0
Share

Hello again, I'm glad my last question struck a chord with you!
Can you explain a little more on what you mean by not rotating on any axis but the Y axis? I had written a $$anonymous$$ouse Look script to handle the rotation of the player. This just matched the character controller's rotation with the camera's. Is this the kind of rotation you're suggesting to avoid?
For the AntiBumpCheck, is there a way for me to optimize this? As in without calling .$$anonymous$$ove twice in the same frame. Would a coroutine work better for this?
Thanks

avatar image lgarczyn BigBadSlug · Nov 27, 2019 at 10:22 PM 0
Share

The Y axis is the vertical axis. It's the one axis character controllers usually rotate around. It's not really made to rotate sideways.

If your game is an fps, the camera would likely be a child of the character controller. In that case, only the camera will look up or down (along with the head of the character if it is animated), while the whole character controller rotates to look left or right.

So the character controller rotates around the Y axis, and the camera rotates around the X axis.

I don't know what antibumpcheck does, but you can replace two $$anonymous$$oves by a single $$anonymous$$ove using the sum of the arguments of the two $$anonymous$$oves.

Follow this Question

Answers Answers and Comments

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

Move like 2D sonic in 3D space around in a spiral 1 Answer

How can i look for collisions of the bulidngs in may array ? how can i use OnTRiggerEnter/exit ? 0 Answers

Rotate sphere to the direction of movement 0 Answers

Character Controller - Limit controller speed 0 Answers

How to make a ladder script 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