Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity脚本:如何使用color.lerp逐渐更改对象的颜色?_C#_Unity3d - Fatal编程技术网

C# Unity脚本:如何使用color.lerp逐渐更改对象的颜色?

C# Unity脚本:如何使用color.lerp逐渐更改对象的颜色?,c#,unity3d,C#,Unity3d,我有一个按钮,可以改变物体的颜色。我使用color.lerp,但我需要它逐渐改变。慢慢地。我现在所拥有的: public Renderer engineBodyRenderer; public float speed; public Color startColor, endColor; float startTime; // Start is called before the first frame update void Start() { startTime = Time.ti

我有一个按钮,可以改变物体的颜色。我使用color.lerp,但我需要它逐渐改变。慢慢地。我现在所拥有的:

public Renderer engineBodyRenderer;
public float speed;
public Color startColor, endColor;
float startTime;

// Start is called before the first frame update
void Start()
{
    startTime = Time.time;
    ChangeEngineColour();
}

public void ChangeEngineColour()
{
    float t = (Time.time - startTime) * speed;
    engineBodyRenderer.material.color = Color.Lerp(startColor, endColor, t);
}

所以物体的颜色变化并不缓慢。我缺少什么?

在您的解决方案中,该方法只运行一次,因此只能发生一次颜色更改。我通常是这样做的:

void Start() 
{
    // ... your other stuff 

    StartCoroutine(ChangeEngineColour());
}

private IEnumerator ChangeEngineColour()
{
    float tick = 0f;
    while (engineBodyRenderer.material.color != endColor)
    {
        tick += Time.deltaTime * speed;
        engineBodyRenderer.material.color = Color.Lerp(startColor, endColor, tick);
        yield return null;
    }
}

通过启动协同程序,此代码将与其余代码一起异步运行,并使用
yield return null
以与
Update()
函数相同的速度循环,因此本质上您创建了一个独立的Update()方法,在每一帧中运行,并在每一帧中逐渐改变颜色。

异步运行
在这里有点误导;)为什么呢从代码的角度来看,协程确实是异步运行的,您需要像处理真正的异步代码一样从概念上处理它们,因为它们仍然在主线程中运行。从线程和CPU的角度来看,它们并不是真正的异步。您必须处理真正的
async
和线程执行,这与协程非常不同。我明白你的意思,我同意你的回答。我只是说,将其称为
异步
是一种误导,因为这通常指的是线程化的代码,而协同程序显然不是仅在
启动中一次
。。您可以在
Update
中调用它,也可以每帧调用一次。