Unity-我似乎无法控制我的游戏对象的颜色

use*_*595 3 unity-game-engine lerp

我只是试图让观察者模式程序一个对象随机改变颜色并导致一组其他对象改变相同的颜色,但我希望它们在 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*erg 5

什么Color.Lerp(Color a, Color b, float t)

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

例如,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 是一样的。

因此,您需要在t某处保留一个从 0 开始并递增到 1的变量,然后将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);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

  1. 定时器 >= 10.0f
  2. 一次
  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");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)