Character Controller Shaking While in Elevator Going Up

Hey Guys…My Character Controller is working fine while walking and jumping and all…but when it goes in elevator and elevator goes up it start to be shaky i have attached a video below…

my FPS Character Script is …

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;


public class FPS_Controller : MonoBehaviour {


    [System.Serializable]
    public class Script_Resources
    {
        [Header("Script Resources:")]
        public Mobile_Joystick Joystick;
        public Mobile_Touchpad Touchpad;
        public Camera FPS_Camera;
        public Button Stance_Button;
   

    }
    public Script_Resources Resources;


    [System.Serializable]
    public class Player_Settings
    {
        [Header("FPS Player Setting:")]

        public Vector3 Stand_Size;
        public Vector3 Crouch_Size;
        public enum Stances
        {Stand,Crouch};
        public Stances Current_Stance;
        public float Camera_Height;
        public float Max_Look_Angle;
        public float Move_Cam_Speed;
        public float Gravity;
        public float Stand_Walk_Speed=12.5f;
        public float Crouch_Walk_Speed=2.5f;
        public float Max_Climb_Angle;
        public string Slide_Object_Tag;
        public float Slide_Speed;
        public float InAir_SpeedMagnitude=0.3f;
        public float Jump_Bob_Speed;
        public float Jump_Bob_Magnitude;


    }
    public Player_Settings FPS_Settings;





    //Joystick and touchpad variables
    private Vector2 Joystick_Vector=Vector2.zero;
    private Vector3 Movement_Vector=Vector3.zero;
    private Vector2 Touchpad_Vector=Vector3.zero;
    private Vector3 Camrotation_Vector=Vector3.zero;

    //Access Private Varibles
    private CharacterController Character_Controller;



    //other private variables
    private bool Is_Sliding=false;
    private bool Make_Jump=false;

    //ray cast up while crouching to stand for obsticals over head
    private Vector3 Ray_UP;
    private RaycastHit Ray_Down;
    private Vector3 Ray_Down_Position;

    private float Cam_Rotation_X;
    private float Cam_Rotation_Y;
    private float Jetpack_Jump_Height;
    private float In_Air_Counter;


    private Vector3 Desired_Movement;

    void Start () {
   
        Character_Controller = GetComponent<CharacterController> ();

        Character_Controller.slopeLimit = FPS_Settings.Max_Climb_Angle;

    }


    void Update () {

        Joystick_Vector = Resources.Joystick.Joystick_Input ();
       
        Touchpad_Vector = Resources.Touchpad.Touchpad_Input ();

        Cam_Rotation_X += Touchpad_Vector.y;

        Cam_Rotation_Y += Touchpad_Vector.x;

        Cam_Rotation_X = Mathf.Clamp (Cam_Rotation_X, -FPS_Settings.Max_Look_Angle, FPS_Settings.Max_Look_Angle);

        Resources.FPS_Camera.transform.rotation=Quaternion.Euler (-Cam_Rotation_X,Cam_Rotation_Y,0);

        transform.rotation= Quaternion.Euler (Cam_Rotation_Y * Vector3.up);

        Ray_UP = transform.TransformDirection (Vector3.up);

        Desired_Movement = transform.forward*Joystick_Vector.y + transform.right*Joystick_Vector.x;

        if (Character_Controller.isGrounded) {

            Check_Sliding ();

            if (Is_Sliding) {
               
                Ray_Down_Position = Ray_Down.normal;
                Movement_Vector = new Vector3 (Ray_Down_Position.x, -Ray_Down_Position.y, Ray_Down_Position.z);
                Vector3.OrthoNormalize (ref Ray_Down_Position, ref Movement_Vector);
                Movement_Vector *= FPS_Settings.Slide_Speed;
            }

            else if (!Is_Sliding) {


                Movement_Vector = new Vector3 (Desired_Movement.x, 0, Desired_Movement.z);

                if (FPS_Settings.Current_Stance == FPS_Controller.Player_Settings.Stances.Stand)
                    Movement_Vector *= FPS_Settings.Stand_Walk_Speed;
               
                else if (FPS_Settings.Current_Stance == FPS_Controller.Player_Settings.Stances.Crouch)
                    Movement_Vector *= FPS_Settings.Crouch_Walk_Speed;
               
                if (Make_Jump && FPS_Settings.Current_Stance != FPS_Controller.Player_Settings.Stances.Crouch && !Physics.Raycast (transform.position, Ray_UP, Jetpack_Jump_Height)) {
                    Make_Jump = false;
                    Movement_Vector.y = Jetpack_Jump_Height;
                }
            }
        }
        else if (!Character_Controller.isGrounded) {

            Movement_Vector.x += Desired_Movement.x*FPS_Settings.InAir_SpeedMagnitude;
            Movement_Vector.z += Desired_Movement.z*FPS_Settings.InAir_SpeedMagnitude;


        }
           

        Movement_Vector.y -= FPS_Settings.Gravity * Time.deltaTime;
        Character_Controller.Move (Movement_Vector * Time.deltaTime);
       
    }
       
    void FixedUpdate()
    {
        if (FPS_Settings.Current_Stance == FPS_Controller.Player_Settings.Stances.Crouch) {
            Resources.Stance_Button.GetComponent<Button> ().interactable = (Physics.Raycast (transform.position, Ray_UP, FPS_Settings.Stand_Size.y)) ? false : true;
        }


    }

    void Check_Sliding ()
    {
        if (Physics.Raycast(transform.position, -Vector3.up, out Ray_Down, Character_Controller.radius+Character_Controller.height))
            Is_Sliding= (Ray_Down.collider.tag==FPS_Settings.Slide_Object_Tag && Vector3.Angle(Ray_Down.normal, Vector3.up) > FPS_Settings.Max_Climb_Angle) ? true : false;
    }



    void LateUpdate()
    {
        if (Character_Controller.isGrounded) {
            SetCam ();
            In_Air_Counter = 0;
        }
        else if (!Character_Controller.isGrounded) {
            Camera_Jump_Bob ();
            In_Air_Counter += FPS_Settings.Jump_Bob_Magnitude * Time.deltaTime;
        }
    }

    void SetCam()
    {

        Resources.FPS_Camera.transform.localPosition = Vector3.Lerp (Resources.FPS_Camera.transform.localPosition,new Vector3(0,FPS_Settings.Camera_Height,0), FPS_Settings.Move_Cam_Speed);

    }


    void Camera_Jump_Bob()
    {
        Resources.FPS_Camera.transform.localPosition = Vector3.Lerp (Resources.FPS_Camera.transform.localPosition,new Vector3(0,1-In_Air_Counter,0), FPS_Settings.Jump_Bob_Speed);
    }

    public virtual void JetPack_Jump(float Jump_Height)
    {
        if (Character_Controller.isGrounded) {

            Jetpack_Jump_Height = Jump_Height;

            Make_Jump = true;
        }
   
    }









}

and here is moving up platform script

using UnityEngine;
using System.Collections;

public class Moveup : MonoBehaviour {

    public float speed;

    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void Update () {
   

        transform.Translate (Vector3.up * speed * Time.deltaTime);
    }
}

and here is video of my problem

any one please help me out of this

That’s because you’re moving the elevator by modifying the transform directly – effectively teleporting the object which the physics system then has to account for. Attach a rigidbody to the elevator, mark it not affected by gravity and set the velocity.

Another strategy would be to make the character a child of the elevator object as it moves. That’ll work out better if you decide you want moving (horizontal) platforms later on.

3 Likes

yes thanks … I made character controller child of the moving platform and it made my day…thanks

GroZZleR’s solution worked for me as well - funny that someone else was having an FPS on an elevator jitter problem.

Im having the same issue, but parenting does not stop the jitter for me

For me using physics based movement on the elevator fixed the issue, you just cant use transform.Translate to move an elevator, even if you parent the player to the elevator.