Jerky Character movement after adding mouse orbit script

I added a custom mouse orbit script to my project. This is when right mouse button is clicked camera can be rotated around the player.

Now issue I have after this is my player movement has become jerky / choppy and not smooth. If I remove my mouse orbit script, player moment is back to normal i.e smooth. I cant seem to pin point what is causing this jerky movement withing MouseOrbit script

Video
https://youtu.be/zsP65JmXBVM

Code

 /* This is where we initialize our script */
    void Start()
    {
        Initialize();
    }

    /* This is where we set our private variables, check for null errors,
     * and anything else that needs to be called once during startup */
    void Initialize()
    {
        h = this.transform.eulerAngles.x;
        v = this.transform.eulerAngles.y;

        cameraTransform = this.transform;
        cam = Camera.main;
        smoothDistance = distance;
        timerot = TimeSignature((1 / rotationDampening)) * 100.0f;
        NullErrorCheck();
    }

    /* We check for null errors or warnings and notify the user to fix them */
    void NullErrorCheck()
    {
        if (!viewTarget)
        {
            Debug.LogError("Please make sure to assign a view target!");
            Debug.Break();
        }
        if (collisionLayers == 0)
        {
            Debug.LogWarning("Make sure to set the collision layers to the layers the camera should collide with!");
        }
    }

    /* This is where we do all our camera updates. This is where the camera
     * gets all of its functionality. From setting the position and rotation,
     * to adjusting the camera to avoid geometry clipping */
    void Update()
    {
        if (!viewTarget)
            return;

        if (Input.GetMouseButton(1))
            {
                Cursor.lockState = CursorLockMode.Locked;

                h += Input.GetAxis("Mouse X") * horizontalRotationSpeed * Time.deltaTime;
                v -= Input.GetAxis("Mouse Y") * verticalRotationSpeed * Time.deltaTime;

                h = ClampAngle(h, -360.0f, 360.0f);
                v = ClampAngle(v, minVerticalAngle, maxVerticalAngle);
                //				Debug.Log ("value of h: "+h);
                newRotation = Quaternion.Euler(v, h, 0.0f);
            }
            else
            {
                Cursor.lockState = CursorLockMode.None;
            }
        
        if (Input.GetKeyDown(KeyCode.D))
        {
            h = transform.eulerAngles.y + 90;
            newRotation = Quaternion.Euler(transform.eulerAngles.x, h, transform.eulerAngles.z);
        }

        if (Input.GetKeyDown(KeyCode.A))
        {
            h = transform.eulerAngles.y - 90;
            newRotation = Quaternion.Euler(transform.eulerAngles.x, h, transform.eulerAngles.z);
        }


        /* We set the distance by moving the mouse wheel and use a custom
         * growth function as the time value for linear interpolation */
        distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel") * 10, minDistance, maxDistance);
        smoothDistance = Mathf.Lerp(smoothDistance, distance, TimeSignature(distanceSpeed));

        /*We give the rotation some smoothing for a nicer effect */
        smoothRotation = Quaternion.Slerp(smoothRotation, newRotation, TimeSignature((1 / rotationDampening) * 100.0f));

        newPosition = viewTarget.position;
        newPosition += smoothRotation * new Vector3(0.0f, height, -smoothDistance);

        /* Calls the function to adjust the camera position to avoid clipping */
        CheckSphere();

        smoothRotation.eulerAngles = new Vector3(smoothRotation.eulerAngles.x, smoothRotation.eulerAngles.y, 0.0f);
        Vector3 dir = new Vector3(0, 0, -distance);

        cameraTransform.position = newPosition;
        //cameraTransform.position = viewTarget.position + smoothRotation * dir;
        cameraTransform.rotation = smoothRotation;
    }

TimeSignature method

private float TimeSignature(float speed)
    {
        return 1.0f / (1.0f + 80.0f * Mathf.Exp(-speed * 0.02f));
    }

:man_facepalming:

It was a simple case of changing

void Update()

to

void LateUpdate()

https://docs.unity3d.com/ScriptReference/MonoBehaviour.LateUpdate.html

I remember Ben touching on this in one of the lectures and I probably wasn’t paying enough attention at the time.

1 Like

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.

Privacy & Terms