Unity3d 统一-我能';我似乎不喜欢我的游戏对象';s颜色

Unity3d 统一-我能';我似乎不喜欢我的游戏对象';s颜色,unity3d,lerp,Unity3d,Lerp,我只是想让一个观察者模式程序,一个对象随机改变颜色,并使一组其他对象改变相同的颜色,但我希望它们在5秒内逐渐改变。我正在尝试lerp,但它只是立即交换颜色。我认为这可能与lerp的起始颜色有关,因为主要对象是不断变换颜色,新颜色变成旧颜色。因此,我需要考虑如何为lerp选择起始颜色。我不确定这是否与我的lerp不起作用有关,但这是我正在考虑的。如果其他人有任何建议,我将不胜感激。多谢各位 public class Subject : MonoBehaviour { public float t

我只是想让一个观察者模式程序,一个对象随机改变颜色,并使一组其他对象改变相同的颜色,但我希望它们在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;
    }
  }
}
公共课科目:单一行为{
公共浮动计时器=0.0f;
公共游戏对象[]观察员;
浮动t=0;
颜色旧颜色;
无效更新(){
t+=时间增量/5.0f;
timer+=Time.deltaTime;
如果(计时器>=10f){
Color newColor=新颜色(Random.value,Random.value,Random.value,1.0f);
GetComponent().material.color=newColor;
for(int i=0;i颜色。Lerp(颜色a、颜色b、浮动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);
}
float t=0;
私有void更新()
{
t+=Time.deltaTime/5.0f;//除以5等于5秒。
this.GetComponent().color=color.Lerp(oldColor,newColor,t);
}

编辑

另外,假设在定时器触发时重置了t,代码中会发生什么

  • 定时器>=10.0f
  • 勒普一次
  • 将计时器重置为0
  • 。 你可以做的是这样的事情(我拿出了观察员和其他东西,只是为了让它更容易看到)

    float t,定时器;
    布尔勒平=假;
    新颜色;
    无效更新()
    {
    t+=时间增量/5.0f;
    timer+=Time.deltaTime;
    如果(计时器>=10f)
    {
    勒平=真;
    t=0;
    newColor=新颜色(Random.value,Random.value,Random.value,1.0f);
    Log(“Lerping!”);
    定时器=0;
    }
    如果(勒平)
    {
    GetComponent().material.color=color.Lerp(oldColor、newColor、t);
    如果(t>=1.0f)
    {
    勒平=假;
    Log(“已停止删除”);
    }
    }
    }
    
    我试过这个,但颜色仍然会立即改变。无论是在if语句中还是在for循环中,我将t增量行放在何处都很重要吗?我尝试在示例中应用代码,效果很好。我不认为它应该在for循环中,如果这不是你想要的,那么如果你一直在每帧增加t,当你真正想要使用它时,它的值可能大于1。。因此,要么在开始lerp之前重置它,要么在lerp时增加它。我尝试在lerp之前使用t=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");
            }
    
        }
    }