C# 统一-将锁定位置反转回原始位置
我的逻辑在这里一定很离谱。基本上,我有一个加载条,当鼠标悬停激活时,它将使覆盖的UI面板的左位置增加,以提供加载效果。这个很好用 问题在于,当UI面板在第二个while循环中未激活时,将其左位置反转回其原始位置(0,0)。这是我的密码-C# 统一-将锁定位置反转回原始位置,c#,unity3d,lerp,C#,Unity3d,Lerp,我的逻辑在这里一定很离谱。基本上,我有一个加载条,当鼠标悬停激活时,它将使覆盖的UI面板的左位置增加,以提供加载效果。这个很好用 问题在于,当UI面板在第二个while循环中未激活时,将其左位置反转回其原始位置(0,0)。这是我的密码- IEnumerator LerpCoroutine() { Vector2 xyz; float timeElapsed = 0; float lerpDuration = 2; Vector2 startPos = slid
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;
}
}
IEnumerator LerpCoroutine()
{
矢量2xyz;
float timeappeased=0;
浮动时间=2;
Vector2 startPos=sliderOverlayRt.offsetMin;
向量2 x=新向量2(0,0);
while(已激活&&timepassed
出于某种原因,sliderOverlayRt.offsetMin在第二个while循环中被设置为零,因此UI面板的左位置会向右返回(0,0)
如果有人能展示一个更好的方法来做到这一点,甚至不必使用double while语句,那将是非常感谢的
TLDR-如果激活,我想从(0,0)->(0300)获取指向lerp的向量2。然而,如果!在LERP过渡的中间被激活,在这种情况下它只从(0,0)->(0150)开始,然后我希望它从(0150)->(0,0)开始。< /强>
谢谢。以下是我看到的:
在第二个循环中,您将从sliderOverlayRt.offsetMin
返回到(0,0)
,但随后立即更新sliderOverlayRt.offsetMin
。因此,在下一次迭代中,您将从更新的sliderOverlayRt.offsetMin
中执行lerp操作,但由于lerp因子基于时间增量,因此执行的次数更大
另外,您将在timepassed/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;
}
}
IEnumerator LerpCoroutine()
{
矢量2xyz;
float timeappeased=0;
浮动时间=2;
浮动系数=0;
Vector2 startPos=sliderOverlayRt.offsetMin;
向量2 x=新向量2(0,0);
var lerpMax=新矢量3(300,0);
while(已激活&&timepassed=0)
{
xyz=Vector2.Lerp(startPos、lerpMax、EaseOut(lerpFactor/lerpDuration));
sliderOverlayRt.offsetMin=xyz;
timeappeased+=Time.deltaTime;
///减小此处的lerpFactor,使条向左移动
lerpFactor-=Time.deltatime;
收益返回空;
}
}
TL;DR
保持第二个循环上的起始位置不变,确保lerp值有意义,并且应该是良好的。在一些清理之后,这里是Coroutine函数(感谢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;
}
}
IEnumerator FadeInMaterial()
{
向量2 lerpedOffsetMin;
Vector2 startPos=新Vector3(0,0);
向量2 endPos=新向量3(300,0);
浮动时间=2;
float reverseLerpDurationMultiple=2;//2将使其在反转时速度加倍
浮动系数=0;
while(已激活&&lerpFactor=0)
{
lerpedOffsetMin=Vector2.Lerp(开始、结束、结束(lerpFactor/lerpDuration));
sliderOverlayRt.offsetMin=lerpedOffsetMin;
///减小此处的lerpFactor,使条向左移动
lerpFactor-=Time.deltaTime*ReverseElerpDurationMultiple;
收益返回空;
}
}
您只是想在一种情况下得到0比1,在另一种情况下得到1比0吗?关闭。如果悬停,我想得到(0,0)->(0300)。然而,如果在LERP过渡的中间徘徊,它只从(0,0)->(0150)开始,那么我希望它在(0150)->(0,0)期间进行。抱歉,这在帖子中没有说得更清楚!插上电源,效果很好。我从未想过使用您使用的lerpFactor变量。非常感谢。