2014-11-02 140 views
0

我想改变主摄像头的背景颜色。当我把代码放在下面时,它会改变每一帧的颜色。为什么会发生?我该如何解决它?UNITY - 如何更改颜色?

function Update() { 
ChangeColor(); 
} 

function ChangeColor() { 
this.camera.backgroundColor = Color32(Random.Range(0, 255), Random.Range(0, 255), Random.Range(0, 255), 1); 
yield WaitForSeconds(5); 
} 

回答

1

您正在寻找叫做Coroutines的东西。

Update()被称为每秒60次。由于Update()方法中有ChangeColor(),所以无论ChangeColor()方法中的yield语句如何,它都会被调用,因为yield只能在协同程序中使用。

您需要调用这样的方法:

StartCoroutine(ChangeColor()); 

StartCoroutine("ChangeColor"); 

请注意,如果你把该行的Update()方法里面,你会开始一个新的协程60倍一秒。如果你想让ChangeColor()在启动后继续运行,你需要稍微改变它的逻辑,并将它放在你的Start()方法中,或者放在它被调用一次的地方。

function ChangeColor() { 
    while(true){ 
     this.camera.backgroundColor = Color32(Random.Range(0, 255), Random.Range(0, 255),  Random.Range(0, 255), 1); 
     yield WaitForSeconds(5); 
     } 
    } 

你会注意到我添加了一个while循环是一个无限循环,和里面的while循环,我把yield语句。这将适当地产生5秒的方法,然后再次循环并永久生效。

一些其他注意事项:

  • 确保你选择的StartCoroutine(...)正确的版本。采取字符串的那个可以通过使用StopCoroutine("NameOfMethod")来停止。另一个采用方法签名本身的方法在启动后不能停止。

  • 协程生成在创建它们的gameobject脚本上。因此,如果您的相机具有调用ChangeColor()方法的脚本并且其被破坏,那么协程也会停止并被销毁。

指向其他协程方法的链接。

StartCoroutine

+0

也是一个警告的话。不要将协程与多线程混淆。协程将在Unity主循环期间运行.http://docs.unity3d.com/Manual/ExecutionOrder.html – TimeEchoes 2014-11-02 04:42:15

+0

WORKs!谢谢 – Bryce 2014-11-02 04:45:23