统一的lerp量表并不起作用

时间:2016-09-30 13:50:56

标签: unity3d scale lerp

当我实例化它时,我试图使对象从零到它的正常大小,所以看起来它会弹出到屏幕上。

因此,当对象开始时我得到它的正常大小然后将其更新为零,然后在更新中我正在缩放它。

这是我的代码:

void Start()
{
    normalScale = transform.localScale;
    transform.localScale *= 0.1f;
}
void Update()
{
    transform.localScale = Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);
    // destroy item
    if (transform.localScale == normalScale)
    {
        transform.localScale = transform.localScale * 0.1f;
    }
}

谢谢。

3 个答案:

答案 0 :(得分:1)

根据https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

中的第3个参数
transform.localScale = Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);

应该表示" fracJourney",换句话说它应该从0f变为1f以指示动画的进度,但是Time.deltaTime会给你自上一帧以来的时间,以便你可能会看到它跳过0.005(或者你的帧率是多少)。

您需要添加另一个变量来指示动画的进度:

public float speed = 1.0F;
private float startTime;

void Start() {
    startTime = Time.time;
    normalScale = transform.localScale;
}

void Update()
{
    float distCovered = (Time.time - startTime) * speed;

    transform.localScale = Vector3.Lerp(Vector3.zero, normalScale, distCovered);
    // destroy item
    if (transform.localScale >= normalScale)
    {
        startTime = Time.time; // Reset the animation
    }
}

答案 1 :(得分:1)

有了这个,你总是会改变它的当前比例,当然你改变了上一次更新

transform.localScale = Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);

你需要做的是在更新功能之外创建两个Vector3,一个用于起始大小,一个用于最终大小

Vector3 start = Vector3.zero;
Vector3 end = new Vector3(1,1,1);

你还需要一个计时器:

float lerpTime = 0;

总而言之

transform.localScale = Vector3.Lerp(start, end, lerpTime);
lerpTime += Time.deltaTime // times whatever multiplier you want for the speed

答案 2 :(得分:1)

您的代码存在一些可能导致问题的问题。第一个是您传入lerp的开始/结束值:

Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);

在第二帧中,.localScale大致为(0.1, 0.1, 0.1)。第二帧上lerp的 max 值是第一帧的值。这意味着您当前的代码无休止地缩小了目标 - 与您想要的相反。

另一个问题是你处理时间的方式。你正在通过5f * Time.deltaTime,这可能总是小于1.这意味着你永远不会达到最大值。

因此,要解决这些问题,您需要做两件事:首先,您需要确保您的最小值/最大值实际最小/最大值,而不是之间的任意值。其次,您需要确保第三个参数在定义的时间内从0平滑地进展到1。

这样的事情:

public float ScaleTime = 5f; // the time it'll take to grow, settable in the inspector

public float ScaleTime = 5f; // the time it'll take to grow, settable in the inspector

Vector3 _targetScale;
Vector3 _startScale;
float _currentLerp = 0f;

void Start()
{
    _targetScale = this.localScale;
    _startScale = _targetScale * 0.1f;
}

void Update()
{
    _currentLerp += Time.deltaTime * ScaleTime;

    if (_currentLerp < 1)
    {
        transform.localScale = Vector3.Lerp(_startScale, _targetScale, _currentLerp);
    }
    else
    {
        transform.localScale = _targetScale; // make sure we definitely hit the target size

        ... do whatever else you need to do here...
    }
}