如何将对象缓慢缩放到0,0,0?

时间:2018-11-28 06:56:45

标签: c# unity3d

此脚本已附加到我要缩放为0,0,0的对象上 它只是对附加的对象不做任何事情。 没有错误或异常就什么都不做。

在这种情况下,maxSize为4,3,0.2 minSize为0,0,0

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Scale : MonoBehaviour
{
    public GameObject objectToScale;
    public float duration = 1f;
    public Vector3 minSize;
    public Vector3 maxSize;
    public bool scaleUp = false;
    public Coroutine scaleCoroutine;
    public bool scalingHasFinished = false;

    private void Start()
    {
        objectToScale.transform.localScale = maxSize;
        scaleOverTime();
    }

    private void Update()
    {

    }

    public IEnumerator scaleOverTime()
    {
        float counter = 0;
        Vector3 startScaleSize = objectToScale.transform.localScale;

        while (counter < duration)
        {
            counter += Time.deltaTime;
            objectToScale.transform.localScale = Vector3.Lerp(startScaleSize, minSize, counter / duration);

            yield return new WaitForSeconds(duration);
        }

        scalingHasFinished = true;
    }
}

主要目标是像魔术效果一样将物体从所有大小挤压到0,0,0,使物体缓慢消失。

2 个答案:

答案 0 :(得分:1)

您没有调用scaleOverTime函数。由于它的类型为IEnumerator,因此您需要使用coroutine

将其称为StartCoroutine(scaleOverTime())

来自coroutine docs

  

从本质上讲,这是一个使用IEnumerator返回类型声明的函数,并且yield return语句包含在主体中的某个位置。收益率返回线是暂停执行并在下一帧继续执行的点。要设置协程运行,您需要使用StartCoroutine函数:

答案 1 :(得分:1)

您可以按照以下方式修改协程

IEnumerator ScaleDownAnimation(float time)
    {
        float i = 0;
        float rate = 1 / time;

        Vector3 fromScale = transform.localScale;
        Vector3 toScale = Vector3.zero;
        while (i<1)
        {
            i += Time.deltaTime * rate;
            transform.localScale = Vector3.Lerp(fromScale, toScale, i);
            yield return 0;
        }
    }

在这里您可以将time传递给此协程

因此,您可以在Start()中将此协程称为

StartCoroutine(ScaleDownAnimation(1.0f));

因此,在这种情况下,从初始比例缩小到Vector3.zero大约需要1秒。

我建议使用AnimationCurve制作更流畅的动画

您可以在脚本中声明public AnimationCurve curve,然后从检查器修改该曲线。

现在将代码transform.localScale = Vector3.Lerp(fromScale, toScale, i);修改为transform.localScale = Vector3.Lerp(fromScale, toScale, curve.Evaluate(i));

我很确定您会得到理想的结果。