C# Unity脚本:如何使用color.lerp逐渐更改对象的颜色?
我有一个按钮,可以改变物体的颜色。我使用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
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
中调用它,也可以每帧调用一次。