Muhammad usman
Muhammad usman

Reputation: 521

Need helping getting a character controller to jump

So far I have a character controller that enables me to move around, sprint and crouch (no animation) , but I am unable to get the controller to jump. I know 100% the character is getting the input to jump, and the movement vector is around ~40 on the Y axis, so the player should be moving. The problem is, nothing happens. The player can still move around, and fall of ledges, but nothing happens when i press space This is my code:

 using UnityEngine;

 public class KeyboardMovement : MonoBehaviour
 {
     private CharacterController controller;
     public float walkSpeed;
     public float sprintSpeed;
     public float crouchSpeed;
     public float jumpHeight;
     Vector3 up = Vector3.zero;
     Vector3 movement = Vector3.zero;
     Vector3 forward = Vector3.zero;
     Vector3 sideways = Vector3.zero;
     void Start()
     {
         controller = GetComponent<CharacterController>();
     }


     void Update()
     {
         float speed = walkSpeed;
         //If crouching, set speed to crouch speed. This ovverides sprinting
         if (SingletonSettings.GetKey(SingletonSettings.Keybindings.crouch))
             speed = crouchSpeed;
         //Else if sprinting, set speed to sprint speed
         else if (SingletonSettings.GetKey(SingletonSettings.Keybindings.sprint))
             speed = sprintSpeed;

         //Create vectors for movement
         forward = transform.TransformDirection(Vector3.forward) * Input.GetAxis("Vertical");
         sideways = transform.TransformDirection(Vector3.right) * Input.GetAxis("Horizontal");
         //up = SingletonSettings.GetKey(SingletonSettings.Keybindings.jump) && controller.isGrounded ? Vector3.up * jumpHeight : Vector3.zero;
         movement = (up * 100) + ((forward + sideways) * 10 * Time.deltaTime * speed);

         //Combine vectors and Multiply by DeltaTime to ensure smooth movement at different framerates.
         //Also multiply by 10*speed to ensure correct speed in different states
          if (controller.isGrounded && Input.GetKey(KeyCode.Space))
         {
             movement.y = jumpHeight*50 * Time.deltaTime;
         }
         controller.SimpleMove(movement);
     }
     void OnGUI()
     {
         GUILayout.Label('\n' + Newtonsoft.Json.JsonConvert.SerializeObject(movement.y, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings
         {
             ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
         }));
     }
 }

Upvotes: 0

Views: 2598

Answers (1)

Rishaan Gupta
Rishaan Gupta

Reputation: 563

CharacterController.SimpleMove from the docs

Moves the character with speed.

Velocity along the y-axis is ignored.

Gravity is automatically applied.

https://docs.unity3d.com/ScriptReference/CharacterController.SimpleMove.html


You should use CharacterController.Move

A more complex move function taking absolute movement deltas.

Attempts to move the controller by motion, the motion will only be constrained by collisions. It will slide along colliders

...

This function does not apply any gravity.

https://docs.unity3d.com/ScriptReference/CharacterController.Move.html

With this method, you'll need to apply gravity yourself

movement.y -= gravity * Time.deltaTime;

controller.Move(movement * Time.deltaTime);

Upvotes: 1

Related Questions