2017-11-02 3 views
3

Ich versuche, die Hintergrundfarbe der Kamera zwischen zwei zufällig ausgewählten Farben zu ändern. Ich habe das schon erreicht, aber dann habe ich festgestellt, dass es immer einen Blitz gibt, wenn eine neue Farbe ausgewählt wird. Ich habe ein Video des Problems auf diesem link hochgeladen. Und das ist das Skript, das ich gerade verwende:Ändern der Kamera Hintergrundfarbe nach dem Zufallsprinzip Überstunden

public Color color1; 
public Color color2; 

float time; 
float time2; 
float transition; 

int firstColor = 0; 


void Update() 
{ 
    if (firstColor == 0) 
    { 
     color1 = Random.ColorHSV(Random.value, Random.value); 
     color2 = Random.ColorHSV(Random.value, Random.value); 

     firstColor = 1; 
    } 

    Camera.main.backgroundColor = Color.Lerp(color2, color1, transition); 

    time += Time.deltaTime; 
    time2 += Time.deltaTime; 
    transition = time2/5; 

    if (time > 5) 
    { 
     color2 = color1; 
     color1 = Random.ColorHSV(Random.value, Random.value); 

     time = 0; 
     time2 = 0; 
    } 
} 

Jede Hilfe wird sehr geschätzt.

Antwort

2

Sie müssen dies mit einer Coroutine tun. Sie können dann leicht programmieren, wann eine neue Farbe nach dem Ende des aktuellen Übergangs geändert werden soll. Wenn Sie Überstunden machen müssen, sollten Sie immer an Coroutines denken. Es beseitigt die Notwendigkeit für viele boolesche Variablen und Verwirrung.

Sie können in einer Coroutine-Funktion ohne boolesche Variable warten, aber Sie können nicht in einer Void-Funktion wie die Update-Funktion arbeiten. Sie verwenden bereits Time.deltaTime und die Lerp Funktion, so dass Sie wissen, was Sie auf halbem Weg tun. Hier ist eine richtige Art und Weise, dies zu tun:

//2 seconds within each transition/Can change from the Editor 
public float transitionTimeInSec = 2f; 

private bool changingColor = false; 

private Color color1; 
private Color color2; 


void Start() 
{ 
    StartCoroutine(beginToChangeColor()); 
} 

IEnumerator beginToChangeColor() 
{ 
    Camera cam = Camera.main; 
    color1 = Random.ColorHSV(Random.value, Random.value); 
    color2 = Random.ColorHSV(Random.value, Random.value); 

    while (true) 
    { 
     //Lerp Color and wait here until that's done 
     yield return lerpColor(cam, color1, color2, transitionTimeInSec); 

     //Generate new color 
     color1 = cam.backgroundColor; 
     color2 = Random.ColorHSV(Random.value, Random.value); 
    } 
} 

IEnumerator lerpColor(Camera targetCamera, Color fromColor, Color toColor, float duration) 
{ 
    if (changingColor) 
    { 
     yield break; 
    } 
    changingColor = true; 
    float counter = 0; 

    while (counter < duration) 
    { 
     counter += Time.deltaTime; 

     float colorTime = counter/duration; 
     Debug.Log(colorTime); 

     //Change color 
     targetCamera.backgroundColor = Color.Lerp(fromColor, toColor, counter/duration); 
     //Wait for a frame 
     yield return null; 
    } 
    changingColor = false; 
} 
+1

Das ist so ein toller Code, danke für die Erklärung. –

+0

Gern geschehen! – Programmer

1

Meine Vermutung wäre der Fehler ist hier:

if (time > 5) 
{ 
    color2 = color1; 
    color1 = Random.ColorHSV(Random.value, Random.value); 

    time = 0; 
    time2 = 0; 
} 

Wenn Sie bemerken, das Blinken etwa 5 Sekunden nach der Spielzeit beginnt auftritt, Spielzeit beginnt bei etwa 3 Sekunden und die grüne Blink geschieht bei etwa 7 -8 Sekunden in.

Ich denke, die Linie color2 = color1; ist die eine Schuld.

Grundsätzlich glätten Sie die Farbe die ersten 5 Sekunden mit interpolieren zwischen den 2 Farben und dann erzwingen Sie die Farbe zufällig. Das erzeugt den Blink-Effekt.

+0

Der Grund, warum ich das tue, ist der Übergang zwischen der alten Farbe und der neu gewählten Farbe. Ich habe sogar versucht, dies zu tun, "color2 = Camera.main.backgroundColor", aber ich habe immer noch das gleiche Ergebnis. Gibt es einen besseren Weg, dies zu erreichen? –

0

Obwohl @ Programmer Antwort vor Ort war und es funktioniert perfekt, ich es geschafft, das Problem in meinem obigen Code zu finden.

was geschieht, ist, dass, nachdem I color1 gesetzt in Leitung 29 zu einer neuen Zufall Farbe, Übergang, den Wert 1 hat (eingespannt). So bevor Übergang im nächsten Rahmen auf der Leitung festgelegt wird 25, Zeile 21 führt, und da Übergang = 1, die neuen color1 zurückgeführt wird, damit die „Flashen“ der neuen color1. Also habe ich einfach neu eingestellt Übergang-0 nach erneuter Einstellung Zeit und zeit2.

Verwandte Themen