【问题标题】:Unity Camera Follow 2D stutterUnity 相机跟随 2D 口吃
【发布时间】:2015-04-13 12:39:41
【问题描述】:

现在,我遇到了很多问题,我一直在使用他们作为 2D 资产包的一部分提供的基本 Unity 代码,如下所示: 使用 UnityEngine; 使用 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,但我的主要问题是随着我游戏中火箭速度的增加,相机开始结结巴巴,我感觉是和阻尼有关?

【问题讨论】:

  • 您尝试过使用 iTween 吗?我已将 iTween 脚本放在相机上,它有助于消除口吃。

标签: c# unity3d game-physics


【解决方案1】:

绝对没有必要在update() 中找到播放器 (target)。我假设玩家后面的 GameObject 会保持不变,所以在 Start() 方法中找到玩家一次

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

【讨论】:

  • 一旦分配了目标,您所指的功能就不会被调用,这不是事情卡顿的原因。
【解决方案2】:

如果您没有定义相机脚本和目标移动发生的顺序,您的相机可能是动作后面的帧,这会导致卡顿。

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

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多