c# - Unity - 将 Leped 位置反转回原始位置

标签 c# unity-game-engine lerp

我的逻辑一定很不对劲。本质上,我有一个加载栏,当鼠标悬停激活时,它的覆盖 UI 面板左侧位置会增加以提供加载效果。这工作得很好。

问题在于,当 UI 面板在第二个 while 循环中未激活时,将 UI 面板左侧位置反转回其原始位置 (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) 进行 lerp。但是,如果 !isActivated 在 lerp 转换的中间,在这种情况下它只从 (0,0) -> (0,150) 开始,那么我希望它从 (0,150) -> (0,0) 开始。

谢谢。

最佳答案

这是我所看到的:

在第二个循环中,您将从 sliderOverlayRt.offsetMin 进行 lerping返回(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 值有意义,这样就可以了。

关于c# - Unity - 将 Leped 位置反转回原始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62958578/

相关文章:

javascript - JS |如何以弧度为单位旋转?

c# - 如何从数据库中获取最接近的日期时间?

c# - 执行更改 UI 的方法时,是否必须在 DIspatcher 上调用 CheckAccess()?

c# - 为什么 Json.Net 在序列化时会在我的对象上调用 Equals 方法?

unity-game-engine - 在 Unity 5 中部分隐藏 UI/图像

unity-game-engine - Unity作业系统和多维数组

c# - 以下代码是从单例创建对象的可靠方法吗?

c# - Unity 输入系统鼠标按钮按住并拖动

C# 从一个位置跳到另一个位置