【问题标题】:Unity sprite fade in and out speedunity sprite 淡入淡出速度
【发布时间】:2015-12-04 05:14:12
【问题描述】:

我正在尝试统一循环播放精灵的淡入和淡出。我是 Unity 和 C# 的新手。

我当前的代码:

public float minimum = 0.0f;
public float maximum = 1f;
public float duration = 50.0f;

public bool faded = false;

private float startTime;
public SpriteRenderer sprite;

void Start () {
    startTime = Time.time;
}

void Update () {
    float t = (Time.time - startTime) / duration;

    if (faded) {
        sprite.color = new Color(1f, 1f, 1f, Mathf.SmoothStep(minimum, maximum, t));
        if (t > 1f) {
            faded = false;
            startTime = Time.time;
        }
    } else {
        sprite.color = new Color(1f, 1f, 1f, Mathf.SmoothStep(maximum, minimum, t));
        if (t > 1f) {
            faded = true;
            startTime = Time.time;
        }
    }
}

这可行,但太慢了,我希望让淡入更快,淡出比淡入慢一点。有点像心跳的效果。如何为此更新我的代码?

另外,有没有更好的方法呢?我认为Update() 上的NEW 太多会导致内存泄漏。

至于安德鲁给出的,我尝试调试他的代码:

    } else {
        sprite.color = new Color(1f, 1f, 1f, Mathf.Lerp(sprite.color.a, minimum, step));
        print (Mathf.Abs(sprite.color.a - minimum));
        print (threshold);

给我看:

 2.206551E-20 // Mathf.Abs()?
 1.401298E-45 // threshold?

【问题讨论】:

  • @Sayse,我确实尝试将持续时间设置得更低,比如5f,但没有太大区别,我认为它根本没有任何作用。
  • 2.206551E-20 // Mathf.Abs() == 00000000000000000002206551 1.401298E-45 // threshold == 000000000000000000000000000000000000000000001401298

标签: c# unity3d


【解决方案1】:

不用担心Update()中的new,因为Color是值类型,而C#擅长处理垃圾回收

public float minimum = 0.0f;
public float maximum = 1f;
public float speed = 5.0f;
public float threshold = float.Epsilon;

public bool faded = false;

public SpriteRenderer sprite;

void Update () {
    float step = speed * Time.deltaTime;

    if (faded) {
        sprite.color = new Color(1f, 1f, 1f, Mathf.Lerp(sprite.color.a, maximum, step));
        if (Mathf.Abs(maximum - sprite.color.a) <= threshold)
            faded = false;

    } else {
        sprite.color = new Color(1f, 1f, 1f, Mathf.Lerp(sprite.color.a, minimum, step));
        if (Mathf.Abs(sprite.color.a - minimum) <= threshold)
            faded = true;
    }
}

另外,如果您只关心淡入淡出效果,您只需要一行:

public float max = 1f;
public float speed = 5.0f;

public SpriteRenderer sprite;

void Update () {
    sprite.color = new Color(1f, 1f, 1f, Mathf.PingPong(Time.time * speed, max));
}

【讨论】:

  • 啊,我明白了,谢谢你把它清理干净。但是您提供的代码使精灵褪色但再也没有回来。我也将float.epsilon 替换为float.Epsilon。小写字母有错误。
  • 尝试将阈值提高到喜欢0.001f
  • 我将尝试对此进行试验,但到目前为止,更新后的阈值仍未使精灵再次显示(淡入)。
  • 是的,没有问题,我也更新了实现它的第二种方法
  • 谢谢,我也更新了我的问题。只是为了给出一些关于它为什么不回来(淡入)的背景。另外,我需要它来产生心跳效果。所以淡入比淡出快一点。 1-liner 能用吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 2019-12-15
  • 1970-01-01
  • 2010-11-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多