此脚本已附加到我要缩放为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,使物体缓慢消失。
答案 0 :(得分:1)
您没有调用scaleOverTime
函数。由于它的类型为IEnumerator
,因此您需要使用coroutine
StartCoroutine(scaleOverTime())
从本质上讲,这是一个使用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));
我很确定您会得到理想的结果。