stepper
stepper

Reputation: 1157

2D Character stuttering with a smooth camera

My character is stuttering when I have a smooth camera following me, although this doesn't annoy me. It annoys the players that play this.

So is there any way to fix this? The smooth camera looks really good imo and so does it to others, but only the stuttering needs to be fixed and it'll look great.

The camera script:

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

    public GameObject cameraTarget; // object to look at or follow
    public GameObject player; // player object for moving

    public float smoothTime = 0.1f;    // time for dampen
    public bool cameraFollowX = true; // camera follows on horizontal
    public bool cameraFollowY = true; // camera follows on vertical
    public bool cameraFollowHeight = true; // camera follow CameraTarget object height
    public float cameraHeight = 2.5f; // height of camera adjustable
    Vector2 velocity; // speed of camera movement

    private Transform thisTransform; // camera Transform

    // Use this for initialization
    void Start()
    {
        thisTransform = transform;
    }

    // Update is called once per frame
    void Update()
    {
        if (cameraFollowX)
        {
            thisTransform.position = new Vector3(Mathf.SmoothDamp(thisTransform.position.x, cameraTarget.transform.position.x, ref velocity.x, smoothTime), thisTransform.position.y, thisTransform.position.z);
        }
        if(cameraFollowY){
            thisTransform.position = new Vector3(thisTransform.position.x, Mathf.SmoothDamp(thisTransform.position.y, cameraTarget.transform.position.y, ref velocity.y, smoothTime), thisTransform.position.z);
        }
    }
}

Upvotes: 3

Views: 5018

Answers (1)

Charleh
Charleh

Reputation: 14002

I'm pretty sure this is due to trying to smooth at a moving target over the physics timestep

I'd just change your code to smooth over a fraction of the camera -> target distance with a tolerance

e.g.

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

    public GameObject cameraTarget; // object to look at or follow
    public GameObject player; // player object for moving

    public float smoothTime = 0.1f;    // time for dampen
    public bool cameraFollowX = true; // camera follows on horizontal
    public bool cameraFollowY = true; // camera follows on vertical
    public bool cameraFollowHeight = true; // camera follow CameraTarget object height
    public float cameraHeight = 2.5f; // height of camera adjustable
    Vector2 velocity; // speed of camera movement

    private Transform thisTransform; // camera Transform

    // Charleh - added these tweakable values - change as neccessary
    private float threshold = 0.5f; // Threshold distance before camera follows
    private float fraction = 0.7f;  // Fractional distance to move camera by each frame (smooths out the movement)

    // Use this for initialization
    void Start()
    {
        thisTransform = transform;
    }

    // Update is called once per frame
    void Update()
    {
        // Charleh - updated code here
        if (cameraFollowX)
        {
            if(Math.abs(cameraTarget.transform.position.x - thisTransform.position.x) > threshold)
            {
                // target vector = (target.position - this.position)
                // now multiply that by the fractional factor and your camera will
                // move 70% of the distance (0.7f) towards the target. It will never
                // actually reach the target hence the threshold value (but you probably don't
                // want this as it can result in a noticeable SNAP if you try to put the camera
                // on the target when it's beneath the threshold)
                // Edit: oops, missing brackets which are quite important!
                thisTransform.position.x = (cameraTarget.transform.position.x - thisTransform.position.x) * fraction;
            }
        }
        // Repeat for Y
    }
}

Upvotes: 1

Related Questions