当我实例化它时,我试图使对象从零到它的正常大小,所以看起来它会弹出到屏幕上。
因此,当对象开始时我得到它的正常大小然后将其更新为零,然后在更新中我正在缩放它。
这是我的代码:
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;
}
}
谢谢。
答案 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...
}
}