简体   繁体   English

Unity Camera Follow 2D口吃

[英]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; 现在,我对此有很多问题,并且一直在使用它们作为2D资产包的一部分提供的基本Unity代码,如下所示: using System.Collections; 使用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? 我遇到这个问题的主要原因之一是因为我对Unity很陌生,实际上只接触过UnityScript,但是我的主要问题是,随着游戏速度的提高,摄像头开始停顿,感觉与阻尼有关?

There is absolutely no necessity to find the player ( target ) inside update() . 绝对没有必要在update()找到播放器( target update() I assume that the GameObject behind the player will stay the same, so find the player once in the Start() method. 我假设玩家背后的GameObject保持不变,因此请在Start()方法中找到玩家一次

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. 您可以通过将FindPlayer()的0.5f的绝对值设置为0.02f或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. 将相机脚本更改为: LateUpdate() -如果您自己移动目标。 FixedUpdate() - if target is a Rigidbody moved by Physics. FixedUpdate() -如果目标是由Physics移动的FixedUpdate()

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

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