0

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

1 Answer 1

1

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); 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.