【问题标题】:Unity-I can't seem to lerp my GameObject's ColorUnity-我似乎无法控制我的游戏对象的颜色
【发布时间】:2018-06-25 15:21:59
【问题描述】:

我只是想让一个观察者模式程序一个对象随机改变颜色并导致一组其他对象改变相同的颜色,但我希望它们在 5 秒内逐渐改变。我正在尝试 lerp,但它只是立即交换颜色。我认为这可能与 lerp 的起始颜色有关,因为主要对象是不断变换颜色,新颜色变成旧颜色。所以我需要考虑如何为 lerp 选择起始颜色。我不确定这是否与我的 lerp 不起作用有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。谢谢你。

public class Subject : MonoBehaviour {

public float timer = 0.0f;
public GameObject[] observers;
float t = 0;


Color oldColor;

void Update () {
    t += Time.deltaTime / 5.0f;
  timer += Time.deltaTime;

  if (timer >= 10f) {
    Color newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
    GetComponent<Renderer>().material.color = newColor;

    for (int i = 0; i < observers.Length; i++) {
      observers[i].GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
    }
    newColor=oldColor
    timer = 0;
    }
  }
}

【问题讨论】:

    标签: unity3d lerp


    【解决方案1】:

    Color.Lerp(Color a, Color b, float t) 所做的是

    在颜色 a 和 b 之间通过 t 线性插值

    例如,Color.Lerp(Color.blue, Color.red, 0.5f) 返回蓝色和红色之间的中间插值。 当你说 Color.Lerp(oldColor, newColor, 5) 时,它会返回 newColor,因为

    t 被限制在 0 和 1 之间。当 t 为 0 时,返回 a。当 t 为 1 时 返回 b。

    所以 5 与放入 1 是一样的。

    因此,您需要在某处保留一个从 0 开始并递增到 1 的 t 变量,您将其放入 Lerp

    例如:

    float t = 0;
    private void Update()
    {
        t += Time.deltaTime / 5.0f; // Divided by 5 to make it 5 seconds.
    
        this.GetComponent<Renderer>().color = Color.Lerp(oldColor, newColor, t);
    }
    

    https://docs.unity3d.com/ScriptReference/Color.Lerp.html

    编辑

    还有你的代码中发生了什么,假设你在计时器命中时重置了 t

    1. 定时器 >= 10.0f
    2. Lerp 一次
    3. 将计时器重置为 0

    。 你可以做的是这样的事情(我取出观察者和其他东西只是为了让它更容易看到)

    float t, timer;
    bool lerping = false;
    Color newColor;
    void Update()
    {
        t += Time.deltaTime / 5.0f;
        timer += Time.deltaTime;
    
        if (timer >= 10f)
        {
            lerping = true;
            t = 0;
            newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
            Debug.Log("Lerping!");
            timer = 0;
        }
    
        if (lerping)
        {
            GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
            if (t >= 1.0f)
            {
                lerping = false;
                Debug.Log("Stopped lerping");
            }
    
        }
    }
    

    【讨论】:

    • 我试过这个,但颜色仍然会立即改变。我将 t 增量线放在哪里有关系吗,不管它是在 if 语句中还是在 for 循环中?
    • 我尝试在我的示例中应用代码,它工作正常。如果那不是您的意图,我认为它不应该在 for 循环中
    • 另外,如果你在每一帧都添加 t,当你真正想使用它时,它的值可能 > 1.. 所以要么在你开始 lerping 之前重置它,或者在你是 lerping。
    • 我尝试在 lerp 之前使用 t=0 行,但这会导致所有观察者立即变为黑色。我刚刚编辑了我的代码。您能告诉我是否有任何不妥之处吗?
    • 谢谢,地球上对 lerp 的唯一很好的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 2019-01-03
    相关资源
    最近更新 更多