0
votes

Now, I've been having a lot of issues with this, and I've been using the base Unity code that they provide as part of their 2D assets pack, and can be seen as follows below: using UnityEngine; using System.Collections;

public class Camera2DFollow : MonoBehaviour {

public Transform target;
public float damping = 1;
public float lookAheadFactor = 3;
public float lookAheadReturnSpeed = 0.5f;
public float lookAheadMoveThreshold = 0.1f;
public float yPosRestriction = -1;

float offsetZ;
Vector3 lastTargetPosition;
Vector3 currentVelocity;
Vector3 lookAheadPos;

float nextTimeToSearch = 0;

// Use this for initialization
void Start () {
    lastTargetPosition = target.position;
    offsetZ = (transform.position - target.position).z;
    transform.parent = null;
}

// Update is called once per frame
void Update () {

    if (target == null) {
        FindPlayer ();
        return;
    }

    // only update lookahead pos if accelerating or changed direction
    float xMoveDelta = (target.position - lastTargetPosition).x;

    bool updateLookAheadTarget = Mathf.Abs(xMoveDelta) > lookAheadMoveThreshold;

    if (updateLookAheadTarget) {
        lookAheadPos = lookAheadFactor * Vector3.right * Mathf.Sign(xMoveDelta);
    } else {
        lookAheadPos = Vector3.MoveTowards(lookAheadPos, Vector3.zero, Time.deltaTime * lookAheadReturnSpeed);  
    }

    Vector3 aheadTargetPos = target.position + lookAheadPos + Vector3.forward * offsetZ;
    Vector3 newPos = Vector3.SmoothDamp(transform.position, aheadTargetPos, ref currentVelocity, damping);

    newPos = new Vector3 (newPos.x, Mathf.Clamp (newPos.y, yPosRestriction, Mathf.Infinity), newPos.z);

    transform.position = newPos;

    lastTargetPosition = target.position;       
}

void FindPlayer () {
    if (nextTimeToSearch <= Time.time) {
        GameObject searchResult = GameObject.FindGameObjectWithTag ("Player");
        if (searchResult != null)
            target = searchResult.transform;
        nextTimeToSearch = Time.time + 0.5f;
    }
}
}

One of the main reasons I've been having problems with this is because I am quite new to Unity and have really only touched upon UnityScript, but my main problem is that as the rocket in my game's speed increases, the camera begins stuttering, I get the feeling that it is something to do with the dampening?

2
Have you tried using iTween? I've placed iTween scripts on camera and it helps the stuttering.Apollo SOFTWARE

2 Answers

1
votes

There is absolutely no necessity to find the player (target) inside update(). I assume that the GameObject behind the player will stay the same, so find the player once in the Start() method.

I'm not sure if that is the reason for your problem. You could trying out temporarily by setting the absolute value of 0.5f inside FindPlayer() to 0.02f or sth. This will update the target more often. If this helps, it's because you update the real target position only twice a second.

0
votes

If you don't define the order in which you camera script and the movement of your target occur your camera can be a frame behind the action, which causes stuttering.

Change you camera script to: LateUpdate() - if you are moving target yourself. FixedUpdate() - if target is a Rigidbody moved by Physics.