Problem with crouching

Hi :D,

so basically I am new to unity and I am trying to learn to add new mechanics. I am creating a 3D game let’s say FPS style. I am following guides on youtube and I managed to make my character move and jump. However, after I added simple code to make my character crouch it appears that it starts to sink a little bit into the floor. I am changing the height of the CharacterController to achieve crouching but after I hit shift to make my character crouch it just sinks even more into the ground and not changing its actual height.

I could leave it like that since it makes an illusion of crouching but I would love to know where I made a mistake. Also because of that when my character is falling down it slows down before hitting the floor which is annoying.

Here is my code:

public class PlayerMovement : MonoBehaviour
    public CharacterController controller;
    public float speed = 12f;
    public float jumpHeight = 3f; 

    Vector3 velocity;
    public float gravity  = -30f;

    public Transform groundCheck;
    public float groundDistance = 0.4f; 
    public LayerMask groundMask;

    bool isGrounded;

    // Start is called before the first frame update
    void Start()
        controller = gameObject.GetComponent<CharacterController>();

    // Update is called once per frame
    void Update()
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);

        if (isGrounded && velocity.y < 0)
            velocity.y = -2;
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 move = transform.right * x + transform.forward * z;

        controller.Move(move  * speed * Time.deltaTime);

        if(Input.GetButtonDown("Jump") && isGrounded)
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);


        velocity.y += gravity * Time.deltaTime;

        controller.Move(velocity * Time.deltaTime);
        if (Input.GetKey(KeyCode.LeftShift)) 
            controller.height = 0.5f;
            speed = 6f;
            controller.height = 2.8f;
            speed = 12f;

Also as a side question. Sometimes when I change values inside the script it doesn’t seem to change it inside the unity inspector. For example, I changed public float groundDistance = 0.4f; into 0.2f, and after saving in inspector it still was 0.4f.

Yeah, it’s probably something obvious but I will gladly hear your advice.


2 things that I think can help you.

1st. I noticed that if you change a public value in the code then it doesn’t change it in the inspector, you should edit it in the inspector instead.

2nd. maybe instead of trying to change the height of your character controller you should instead change the height of the actual game object child (if you have one)

so if you have a child that’s a shape as the child of the Character Controllers host object, then change the height of that. hope this helps!