繁体   English   中英

Unity Camera Follow 2D口吃

[英]Unity Camera Follow 2D stutter

现在,我对此有很多问题,并且一直在使用它们作为2D资产包的一部分提供的基本Unity代码,如下所示: 使用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;
    }
}
}

我遇到这个问题的主要原因之一是因为我对Unity很陌生,实际上只接触过UnityScript,但是我的主要问题是,随着游戏速度的提高,摄像头开始停顿,感觉与阻尼有关?

绝对没有必要在update()找到播放器( target update() 我假设玩家背后的GameObject保持不变,因此请在Start()方法中找到玩家一次

我不确定这是否是您遇到问题的原因。 您可以通过将FindPlayer()的0.5f的绝对值设置为0.02f或sth来临时尝试。 这将更频繁地更新目标。 如果这有帮助,那是因为您每秒仅更新两次实际目标位置。

如果不定义相机脚本和目标移动的顺序,则相机可能位于动作后面,这会导致结结。

将相机脚本更改为: LateUpdate() -如果您自己移动目标。 FixedUpdate() -如果目标是由Physics移动的FixedUpdate()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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