统一 lerp 比例不起作用
unity lerp scale doesn't work
我试图在实例化对象时使对象从零缩放到正常大小,因此它看起来就像弹出到屏幕上一样。
所以当对象开始时我得到它的正常大小然后将它更新为零,然后在更新中我正在缩放它。
这是我的代码:
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;
}
}
谢谢。
根据 https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html 你在
中的第三个参数
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
}
}
有了这个,你总是在改变它的当前比例,当然你在上次更新时改变了
transform.localScale = Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);
你需要做的是在update函数之外创建两个Vector3,一个用于起始大小,一个用于最终大小
Vector3 start = Vector3.zero;
Vector3 end = new Vector3(1,1,1);
您还需要一个计时器:
浮动 lerpTime = 0;
一共得到
transform.localScale = Vector3.Lerp(start, end, lerpTime);
lerpTime += Time.deltaTime // times whatever multiplier you want for the speed
您的代码中有几个问题可能会导致问题。第一个是您传递给 lerp 的 start/end 值:
Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);
在你的第二帧,.localScale
大约是 (0.1, 0.1, 0.1)
。第二帧 lerp 的 max 值是第一帧的值。这意味着您当前的代码正在不断缩小目标 - 与您想要的相反。
另一个问题是你处理时间的方式。您正在传递 5f * Time.deltaTime
,这(可能)总是小于 1。这意味着您永远不会达到最大值。
因此,要解决这些问题,您需要做两件事:首先,您需要确保您的 min/max 值实际上是 min/max 值,而不是之间的任意值。其次,您需要确保您的第三个参数在定义的时间内从 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...
}
}
我试图在实例化对象时使对象从零缩放到正常大小,因此它看起来就像弹出到屏幕上一样。
所以当对象开始时我得到它的正常大小然后将它更新为零,然后在更新中我正在缩放它。
这是我的代码:
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;
}
}
谢谢。
根据 https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html 你在
中的第三个参数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
}
}
有了这个,你总是在改变它的当前比例,当然你在上次更新时改变了
transform.localScale = Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);
你需要做的是在update函数之外创建两个Vector3,一个用于起始大小,一个用于最终大小
Vector3 start = Vector3.zero;
Vector3 end = new Vector3(1,1,1);
您还需要一个计时器:
浮动 lerpTime = 0;
一共得到
transform.localScale = Vector3.Lerp(start, end, lerpTime);
lerpTime += Time.deltaTime // times whatever multiplier you want for the speed
您的代码中有几个问题可能会导致问题。第一个是您传递给 lerp 的 start/end 值:
Vector3.Lerp(transform.localScale * 0.1f, transform.localScale, 5f * Time.deltaTime);
在你的第二帧,.localScale
大约是 (0.1, 0.1, 0.1)
。第二帧 lerp 的 max 值是第一帧的值。这意味着您当前的代码正在不断缩小目标 - 与您想要的相反。
另一个问题是你处理时间的方式。您正在传递 5f * Time.deltaTime
,这(可能)总是小于 1。这意味着您永远不会达到最大值。
因此,要解决这些问题,您需要做两件事:首先,您需要确保您的 min/max 值实际上是 min/max 值,而不是之间的任意值。其次,您需要确保您的第三个参数在定义的时间内从 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...
}
}