Character having character controller is very jittery/shaking

My character is having a character controller which is very jittery while movement. i tried tweaking character controller values but nothing worked for me. It is an infinite runner game where the player moves and performs certain animations while moving as the player is standing there is no shaking but as it starts moving it jitters badly.

public class PlayerMotor : MonoBehaviour
public static PlayerMotor Instance { get; set;}
private const float LANE_DISTANCE = 2.5f;
private const float TURN_SPEED = 0.05f;
public GameObject Enemy;
public GameObject StakeBoard;

private bool isRunning = false;
public bool magnetAttract = false;
public bool Skateboarding = false;
public bool SkateValue = true;

public Animator anim;

private CharacterController controller;
private float jumpForce = 10.0F;   // how high player can jump
private float gravity = 12.0f;    //Gravity makes the body fall down
private float verticalVelocity;//This will be set for every single frame

private int desiredLane = 1;   // 0=Left , 1= Middle , 2=Right

//Speed Modifier
private float originalSpeed = 8.0f;
private float Speed = 8.0f;    // Player Speed
private float speedIncreaseLastTick;   // Last time speed was increased
private float speedIncreaseTime = 2.5f;
private float speedIncreaseAmount = 0.1f;

private void Start()
    Instance = this;
    Speed = originalSpeed;
    controller = GetComponent<CharacterController>();
    anim = GetComponentInChildren<Animator>();

private void Update()
	if (!isRunning)
if (Skateboarding == true && SkateValue==true)
        anim.SetBool("Skate", true);
        SkateValue = false;

    if (Time.time - speedIncreaseLastTick > speedIncreaseTime)
        speedIncreaseLastTick = Time.time;
        Speed += speedIncreaseAmount;

    //Gather the inputs on which lane we should be
    if (MobileInput.Instance.SwipeLeft)
    if (MobileInput.Instance.SwipeRight)

    // Calculate Where we should be in the future
    Vector3 targetPosition = transform.position.z * Vector3.forward;
    if (desiredLane == 0)
        targetPosition += Vector3.left * LANE_DISTANCE;
    else if (desiredLane == 2)
        targetPosition += Vector3.right * LANE_DISTANCE;

    // Calculate our move dalta
    Vector3 moveVector =;
    moveVector.x = (targetPosition - transform.position).normalized.x
* Speed;  //where we should be - where we are right now  
, directional vector

bool isGrounded = IsGrounded();
    anim.SetBool("Grounded", isGrounded);

    // Calculate Y
    if (IsGrounded()) //if Grounded
        verticalVelocity = -0.1f;
        if (MobileInput.Instance.SwipeUp)
            if (Skateboarding == true)
                anim.SetBool("SkateJump", true);
            anim.SetBool("Jump", true);

            verticalVelocity = jumpForce;
            Invoke("Stopjump", 1.0f);

        else if (MobileInput.Instance.SwipeDown)
            Invoke("StopSliding", 1.0f);
        verticalVelocity -= (gravity * Time.deltaTime);

        //Fast falling Mechanics while in the air
            verticalVelocity = -jumpForce;

    moveVector.y = verticalVelocity;
    moveVector.z = Speed;

    //Move the player
    controller.Move(moveVector * Time.deltaTime);

    //Rotate the player to where he is going
    Vector3 dir = controller.velocity;
        dir.y = 0;
        transform.forward = Vector3.Lerp(transform.forward, dir
    , TURN_SPEED);


private void StartSliding()
    if (Skateboarding == true)
        anim.SetBool("SkateSlide", true);
        anim.SetBool("Sliding", true);

    controller.height /= 2; = new Vector3(,,;

private void StopSliding()
    if (Skateboarding == true)
        anim.SetBool("SkateSlide", false);
        anim.SetBool("Sliding", false);

    controller.height *= 2; = new Vector3(, * 2,;
private void Stopjump()
    if (Skateboarding == true)
        anim.SetBool("SkateJump", false);
        anim.SetBool("Jump", false);
   // controller.height *= 2;
 // = new Vector3(, * 2,;
public void MoveLane(bool goingRight)

    desiredLane += (goingRight) ? 1 : -1;
    desiredLane = Mathf.Clamp(desiredLane, 0, 2);

    // Same As above to check on which lane palyer is 
    //if (!goingRight)
    //    desiredLane--;
    //    if(desiredLane==-1)
    //        desiredLane = 0;
    //    desiredLane++;
    //    if(desiredLane==3)
    //        desiredLane = 2;

private bool IsGrounded()
    Ray groundray = new Ray(
    new Vector3(,
    ( - controller.bounds.extents.y) + 0.02f,,
    Debug.DrawRay(groundray.origin, groundray.direction, Color.cyan,

    return Physics.Raycast(groundray, 0.2f + 0.1f);

public void StartRunning()
    isRunning = true;

private void Crash()

  //  enemy.Instance.go();
    isRunning = false;

private void OnControllerColliderHit(ControllerColliderHit hit)
  switch (hit.gameObject.tag)
        case "Obstacle":


private void OnTriggerEnter(Collider other)
    if (other.tag == "scene")
        GameManager.currentLocation.z = 0.0f;
        GameManager.currentLocation.z = 200.0f;
    if (other.tag=="scene3")
        GameManager.currentLocation.z = 400.0f;
    if (other.tag=="scene4")
        GameManager.currentLocation.z = 600.0f;
    if (other.tag=="scene5")
        GameManager.currentLocation.z = 800.0f;


I had a similar issue. Make sure you are using the same method to update the character position and the camera position.

I had the camera position changing in FixedUpdate().
I had the character position changing in Update().

Changed them both to Update(), and now it moves smoothly.

I am having exactly the same problem. seems like we both are following N3K’s “Subway Skater” tutorials. I got it fixed for the PC but as soon as I export it to .apk, my player starts jittering on the phone like it used to do on pc earlier.
Please let me know if you’ve got it fixed or found an alternative way.
I am from Lahore, Pakistan. Discussed the problem with a couple of game developers but they were failed to give any solutions and it’s been around 3 weeks I am stuck at this problem so does my game.

I had the same problem and I just fix it. if you didnt find the solution yet.
just zero out the y axis of the character controller

My solution was to set the skin width (Located in the inspector on the character controller) to 10% the size of the radius. “Two colliders can penetrate each other as deep as their Skin Width. Larger Skin Widths reduce jitter. Low Skin Width can cause the character to get stuck. A good setting is to make this value 10% of the Radius.”(Unity - Manual: Character Controller component reference).