【问题标题】:Is it possible to smooth my Unity3D progress bar?是否可以平滑我的 Unity3D 进度条?
【发布时间】:2015-02-25 04:18:24
【问题描述】:

我创建了一个简单的 GUI 进度条,它从 0px 开始并扩展到 640px。它工作得很好,但看起来有点紧张。我可以忍受它,但如果我能让它看起来更平滑,那将是理想的。

有什么建议吗?

IEnumerator Timer() {

    DateTime start = DateTime.Now;

    while (true) {

        float tick = (float)DateTime.Now.Subtract(start).TotalSeconds;

        Debug.Log("TimeInSeconds: " + (int)tick);

        rawImageRectTransform.sizeDelta = new Vector2(tick / 60f * 640f, 10f); 

        if (tick > 60f) {
            break;
        }

        yield return null;
    }
}

更新:

根据建议,我尝试了以下,效果是一样的。

rawImageRectTransform.sizeDelta = Vector2.Lerp(new Vector2(0, 10f), new Vector2(640f, 10f), tick/60f);

我也试过这样:

rawImageRectTransform.sizeDelta = Vector2.Lerp(new Vector2(0, 10f), new Vector2(640f, 10f), Time.fixedTime/60f);

效果是一样的,但是进度条没有同步到DateTime.TotalSeconds(即tick)值,所以这不起作用。

【问题讨论】:

  • 把它放在 FixUpdate() 中,而不是调用协程。
  • 不确定这会有什么帮助,因为它都是基于秒数的时间。
  • 我会使用 lerp 或 slerp,或者使用平滑的 deltaTime 而不是您现在使用的日期。

标签: c# unity3d


【解决方案1】:

尝试在FixedUpdate() 中使用Vector3.lerp()Vector2.lerp(),这将确保您的要求每秒被调用固定次数,但它也可以在没有太多视觉效果的情况下与协同程序一起使用违规行为。

// for a 3d system
public static Vector3 Lerp(Vector3 from, Vector3 to, float t);

// for a 2d system
public static Vector2 Lerp(Vector2 from, Vector2 to, float t);

【讨论】:

  • sizeDelta 是通过 Vector2 分配的宽度和高度属性。我不确定 Lerp 是否会在这种情况下起作用。
  • @JasonCaldwell 还有一个vector2.lerp,我会更新答案!
  • 好的,我想我可以看到它是如何使用的——我会玩它并在这里发回。
  • 好吧,遇到了障碍。您有机会根据我的代码提供一个示例吗?
  • @JasonCaldwell 我没有尝试发布任何示例,因为统一 API 有一个很好的示例。你试过docs.unity3d.com/ScriptReference/Vector3.Lerp.html 吗?如果它不起作用,我会更新我的答案以满足您的要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多