C# 统一-将锁定位置反转回原始位置

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

我的逻辑在这里一定很离谱。基本上,我有一个加载条,当鼠标悬停激活时,它将使覆盖的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;
    }
}
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变量。非常感谢。