简体   繁体   中英

Unity Camera Follow 2D stutter

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?

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM