Unity - 将 Lerped 位置反转回原始位置
Unity - Reversing Lerped Position Back to Original Position
我的逻辑一定是错的。本质上,我有一个加载栏,当鼠标悬停激活时,它会覆盖 UI 面板左侧位置增加以提供加载效果。这很好用。
问题在于,当 UI 面板在第二个 while 循环中未激活时,将面板左侧位置反转回其原始位置 (0,0)。这是我的代码 -
IEnumerator LerpCoroutine()
{
Vector2 xyz;
float timeElapsed = 0;
float lerpDuration = 2;
Vector2 startPos = sliderOverlayRt.offsetMin;
Vector2 x = new Vector2(0, 0);
while (isActivated && timeElapsed < lerpDuration)
{
xyz = Vector2.Lerp(startPos, new Vector2(300, 0), EaseOut(timeElapsed / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
yield return null;
}
while (!isActivated && timeElapsed < lerpDuration)
{
xyz = Vector2.Lerp(sliderOverlayRt.offsetMin, new Vector2(0, 0), EaseOut(timeElapsed / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
yield return null;
}
}
出于某种原因,sliderOverlayRt.offsetMin 在第二个 while 循环中被设置为零,因此 UI 面板左侧位置会立即回到 (0,0)。
如果有人能提供更好的方法来做到这一点,甚至不必使用双 while 语句,那将不胜感激!
TLDR - 如果 isActivated,我想让 Vector2 从 (0,0) -> (0,300) 插入。但是,如果 !isActivated 在 lerp 转换的中间,在这种情况下它只从 (0,0) -> (0,150) 进行,那么我希望它从 (0,150) -> (0,0) 进行。
谢谢。
这是我看到的:
在第二个循环中,您正在从 sliderOverlayRt.offsetMin
回退到 (0,0)
,但之后您会立即更新 sliderOverlayRt.offsetMin
。因此,在下一次迭代中,您将从更新后的 sliderOverlayRt.offsetMin
中进行 lerping,但由于 lerp 因子基于时间增量,因此数量较大。
此外,您将在 timeElapsed / lerpDuration
处开始第二个 lerp。我想您希望 lerp 因子从 0
开始,而不是某个更大的值。
所以,我会试试这个。
此外,我还没有尝试编译它。
IEnumerator LerpCoroutine()
{
Vector2 xyz;
float timeElapsed = 0;
float lerpDuration = 2;
float lerpFactor = 0;
Vector2 startPos = sliderOverlayRt.offsetMin;
Vector2 x = new Vector2(0, 0);
var lerpMax = new Vector3(300,0);
while (isActivated && timeElapsed < lerpDuration)
{
xyz = Vector2.Lerp(startPos, lerpMax, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
/// increasing lerpFactor so the bar moves right...
lerpFactor += time.deltaTime;
yield return null;
}
while (!isActivated && lerpFactor >= 0)
{
xyz = Vector2.Lerp(startPos, lerpMax, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
/// decreasing lerpFactor here so the bar moves left
lerpFactor -= Time.deltatime;
yield return null;
}
}
TL;DR
在第二个循环中保持你的起始位置不变,确保 lerp 值有意义,你应该是好的。
这是清理后的协程函数(感谢 Dave)-
IEnumerator FadeInMaterial()
{
Vector2 lerpedOffsetMin;
Vector2 startPos = new Vector3(0, 0);
Vector2 endPos = new Vector3(300, 0);
float lerpDuration = 2;
float reverseLerpDurationMultiple = 2; // 2 would make it twice as fast when reversing
float lerpFactor = 0;
while (isActivated && lerpFactor < lerpDuration)
{
lerpedOffsetMin = Vector2.Lerp(startPos, endPos, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = lerpedOffsetMin;
/// increasing lerpFactor so the bar moves right...
lerpFactor += Time.deltaTime;
yield return null;
}
while (!isActivated && lerpFactor >= 0)
{
lerpedOffsetMin = Vector2.Lerp(startPos, endPos, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = lerpedOffsetMin;
/// decreasing lerpFactor here so the bar moves left
lerpFactor -= Time.deltaTime * reverseLerpDurationMultiple;
yield return null;
}
}
我的逻辑一定是错的。本质上,我有一个加载栏,当鼠标悬停激活时,它会覆盖 UI 面板左侧位置增加以提供加载效果。这很好用。
问题在于,当 UI 面板在第二个 while 循环中未激活时,将面板左侧位置反转回其原始位置 (0,0)。这是我的代码 -
IEnumerator LerpCoroutine()
{
Vector2 xyz;
float timeElapsed = 0;
float lerpDuration = 2;
Vector2 startPos = sliderOverlayRt.offsetMin;
Vector2 x = new Vector2(0, 0);
while (isActivated && timeElapsed < lerpDuration)
{
xyz = Vector2.Lerp(startPos, new Vector2(300, 0), EaseOut(timeElapsed / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
yield return null;
}
while (!isActivated && timeElapsed < lerpDuration)
{
xyz = Vector2.Lerp(sliderOverlayRt.offsetMin, new Vector2(0, 0), EaseOut(timeElapsed / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
yield return null;
}
}
出于某种原因,sliderOverlayRt.offsetMin 在第二个 while 循环中被设置为零,因此 UI 面板左侧位置会立即回到 (0,0)。
如果有人能提供更好的方法来做到这一点,甚至不必使用双 while 语句,那将不胜感激!
TLDR - 如果 isActivated,我想让 Vector2 从 (0,0) -> (0,300) 插入。但是,如果 !isActivated 在 lerp 转换的中间,在这种情况下它只从 (0,0) -> (0,150) 进行,那么我希望它从 (0,150) -> (0,0) 进行。
谢谢。
这是我看到的:
在第二个循环中,您正在从 sliderOverlayRt.offsetMin
回退到 (0,0)
,但之后您会立即更新 sliderOverlayRt.offsetMin
。因此,在下一次迭代中,您将从更新后的 sliderOverlayRt.offsetMin
中进行 lerping,但由于 lerp 因子基于时间增量,因此数量较大。
此外,您将在 timeElapsed / lerpDuration
处开始第二个 lerp。我想您希望 lerp 因子从 0
开始,而不是某个更大的值。
所以,我会试试这个。
此外,我还没有尝试编译它。
IEnumerator LerpCoroutine()
{
Vector2 xyz;
float timeElapsed = 0;
float lerpDuration = 2;
float lerpFactor = 0;
Vector2 startPos = sliderOverlayRt.offsetMin;
Vector2 x = new Vector2(0, 0);
var lerpMax = new Vector3(300,0);
while (isActivated && timeElapsed < lerpDuration)
{
xyz = Vector2.Lerp(startPos, lerpMax, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
/// increasing lerpFactor so the bar moves right...
lerpFactor += time.deltaTime;
yield return null;
}
while (!isActivated && lerpFactor >= 0)
{
xyz = Vector2.Lerp(startPos, lerpMax, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = xyz;
timeElapsed += Time.deltaTime;
/// decreasing lerpFactor here so the bar moves left
lerpFactor -= Time.deltatime;
yield return null;
}
}
TL;DR
在第二个循环中保持你的起始位置不变,确保 lerp 值有意义,你应该是好的。
这是清理后的协程函数(感谢 Dave)-
IEnumerator FadeInMaterial()
{
Vector2 lerpedOffsetMin;
Vector2 startPos = new Vector3(0, 0);
Vector2 endPos = new Vector3(300, 0);
float lerpDuration = 2;
float reverseLerpDurationMultiple = 2; // 2 would make it twice as fast when reversing
float lerpFactor = 0;
while (isActivated && lerpFactor < lerpDuration)
{
lerpedOffsetMin = Vector2.Lerp(startPos, endPos, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = lerpedOffsetMin;
/// increasing lerpFactor so the bar moves right...
lerpFactor += Time.deltaTime;
yield return null;
}
while (!isActivated && lerpFactor >= 0)
{
lerpedOffsetMin = Vector2.Lerp(startPos, endPos, EaseOut(lerpFactor / lerpDuration));
sliderOverlayRt.offsetMin = lerpedOffsetMin;
/// decreasing lerpFactor here so the bar moves left
lerpFactor -= Time.deltaTime * reverseLerpDurationMultiple;
yield return null;
}
}