2016-10-10 1 views
0

Dies ist heißer Fall. Im Sinne, dass es selbst in Vorschlägen keine Erklärung gibt.Warum Unity3D Farbe ändert, wenn ich Farbkanäle verringern, die bereits gleich Null ist?

So.

Ich habe Würfel in Szene.

Im Zyklus beginne ich Koroutine für jeden Würfel, und das Koroutine als nächstes tun Dinge:

Es ändert sich die Farbe des Würfels von Schwarz (0, 0, 0) bis rot (1, 0, 0) und führen Sie dann umgekehrte Aktion. In meinem Code, zum Teil, wo ich die Farbe von rot nach schwarz zurückgebe, verringere ich die Werte von G- und B-Feldern. Warum sollte ich das tun? Ich tun würde, wenn ich forgeted diese Zeilen nach copypast von Aktion zu ändern, wo ich Farbe von schwarz auf rot, wenn es nicht rot war, und wenn ich änderte R und G und B.

private IEnumerator CororRoutine(Material cubeMaterial) 
{ 
    float coff = 1f; 

    while (cubeMaterial.color.r < 1.0f) 
    { 
     cubeMaterial.color = new Color(
      cubeMaterial.color.r + coff * Time.deltaTime, 
      0.0f, 
      0.0f); 

     yield return new WaitForEndOfFrame(); 
    } 

    while (cubeMaterial.color.r > 0.0f) 
    { 
     cubeMaterial.color = new Color(
      cubeMaterial.color.r - coff * Time.deltaTime, 
      cubeMaterial.color.g - coff * Time.deltaTime, 
      cubeMaterial.color.b - coff * Time.deltaTime); 

     yield return new WaitForEndOfFrame(); 
    } 
} 

So gibt es eine sehr seltsame Dinge passieren ... Screenshots: enter image description here

Wie Sie sehen können, Würfel, die bereits in beiden Richtungen verändert haben, haben einen kleinen roten Schatten. ABER. Werte in ihrer Albedo-Farbe im Material genau (0, 0, 0). Auf dem Bildschirm sehen Sie eine Art roten Schatten auf dem Material.

Wenn Sie etwas wissen, das kann mir ein Verständnis davon, was hier passiert ist, wäre es wirklich hilfreich.

Edit_1:

Die Frage ist: Warum Farbe ändert, wenn ich Farbkanäle zu verringern, die bereits 0 ist? Machen Sie das jemandem bekannt? Ich weiß, dass ich die Werte von Kanälen, die bereits 0 ist, nicht verringern sollte. Aber es scheint sehr seltsam, wenn sich die Farbe des Materials ändert, wenn ich es tue.

+2

Bitte geben Sie einen angemessenen Titel. Dies ist keine Zeitung. –

+0

Welchen Shader verwenden Sie? Standard Shader? – Programmer

+0

@Programmer Ja, ich verwende Standard-Shader mit transparentem Rendering-Modus. –

Antwort

1

Warum Farbe ändert, wenn ich Farbkanäle zu verringern, die bereits 0 ist? Machen Sie das jemandem bekannt? Ich weiß, dass ich Werte von Kanäle nicht verringern sollte, die bereits gleich 0 ist. Aber es scheint sehr seltsam, wenn Farbe des Materials ändert, wenn ich es tue.

ChristF und Le len haben bereits Ihre Frage beantwortet. Bitte lies sie. Lies den negativen Wert, über den beide sprachen. Das ist das Problem.

Der einzige Grund, warum ich dies beantworte, ist, weil ich denke, dass Sie das falsch machen und beide Antwort nicht eine ordnungsgemäße Möglichkeit zur Änderung der Farbe bieten.

Setzen

Debug.Log("R: " + cubeMaterial.color.r); 
Debug.Log("G: " + cubeMaterial.color.g); 
Debug.Log("B: " + cubeMaterial.color.b); 

in der zweiten Schleife while. Sie werden feststellen, dass sich der RGB-Wert in negative Werte ändert. Ich habe unter den Wert:

R: -0.0210881 
G: -1.026095 
B: -1.026095 

Die color.r, color.g, color.b und color.a Eigenschaften nur Werte 0.0f-1.0f ermöglichen. Sie kann nicht verwenden Wert, der weniger als 0f oder Wert, der größer als 1f ist. Wenn Sie dies tun, erhalten Sie undefiniertes Verhalten, da niemand weiß, wie Unity mit Werten handelt, die außerhalb dieses Bereichs liegen. Frag nicht warum, denn dies ist eine Regel, die von Unity festgelegt wird. So einfach ist das.

Ein direktes Zitat aus Unity Doc:

Diese Struktur im gesamten Einheit verwendet wird, um Farben zu übergeben. Jede Farbkomponente ist ein Gleitkommawert mit einem Bereich von 0 bis 1.

Beachten Sie, dass Ihre aktuelle while-Schleife nicht Werte verhindern kann von unten 0 gehen oder über 1.

SOLUTION:

Sie haben zwei Möglichkeiten.

.Sie können Mathf.Clamp oder Mathf.Clamp01 verwenden, um dieses Problem zu beheben. Dadurch wird Ihr Wert zwischen 0 und 1 geklemmt.

ersetzen

cubeMaterial.color = new Color(
cubeMaterial.color.r - coff * Time.deltaTime, 
cubeMaterial.color.g - coff * Time.deltaTime, 
cubeMaterial.color.b - coff * Time.deltaTime); 

mit

cubeMaterial.color = new Color(
Mathf.Clamp(cubeMaterial.color.r - coff * Time.deltaTime, 0, 1), 
Mathf.Clamp(cubeMaterial.color.g - coff * Time.deltaTime, 0, 1), 
Mathf.Clamp(cubeMaterial.color.b - coff * Time.deltaTime, 0, 1)); 

.DO diesem dem richtigen Weg. Sie sollten keinen Farbwert an erster Stelle erhöhen. Die erste Lösung in dieser Antwort ist nur ein Hack. Die wirkliche Lösung ist die Verwendung von Color.Lerp. Dies wird zwischen zwei Farben wechseln. Ich empfehle diese Lösung sehr.

private IEnumerator CororRoutine(Material cubeMaterial) 
{ 
    float counter = 0f; 
    float changeDuration = 1f; 

    Color blackColor = Color.black; //OR new Color(0f,0f,1f); 
    Color redColor = Color.red; //OR new Color(1f,0f,0f); 

    //Black To Red 
    while (counter < changeDuration) 
    { 
     counter += Time.deltaTime; 
     cubeMaterial.color = Color.Lerp(blackColor, redColor, counter/changeDuration); 
     yield return new WaitForEndOfFrame(); 
    } 

    counter = 0; 

    //Red To Black 
    while (counter < changeDuration) 
    { 
     counter += Time.deltaTime; 
     cubeMaterial.color = Color.Lerp(redColor, blackColor, counter/changeDuration); 
     yield return new WaitForEndOfFrame(); 
    } 
} 
0

vielleicht, weil Sie sagen

 cubeMaterial.color.g - coff * Time.deltaTime, 
     cubeMaterial.color.b - coff * Time.deltaTime); 

während es bereits 0

+0

Also, warum macht es roten Schatten auf Würfel, wenn es kommt zu schwarz (verkleinern R auf Null und verringern G und B wenn es BEREIT ist Null)? –

+0

Sie sprechen von seltsamen Ergebnissen, das ist ein merkwürdiger Code. Ich weiß nicht, wie negative Werte durch Einheit gehandhabt werden, Tatsache ist aber: Sie setzen negative Werte, negative Werte, die RED so weit wie möglich hervorbringen. –

+0

Ich versuche nur, Verständnis für diese bestimmte Frage zu bekommen (worüber du sprichst): Wie werden negative Werte in Farbe durch Einheit verarbeitet? –

0

In meinem Code, zum Teil, wo ich die Farbe von rot bis schwarz zurückkehren, I-Werte von G und B zu verringern Felder. Warum sollte ich das tun? Ich tun würde, wenn ich forgeted diese Zeilen nach copypast von Aktion zu ändern, wo ich Farbe von schwarz auf rot, wenn es nicht rot war, und wenn ich änderte R und G und B.

Es sieht sicher wie Sie vergessen haben, um diesen Code zu ändern, wenn Sie den Code von woanders kopierten.

Wenn Sie genau wissen, dass die grünen und blauen Komponenten nicht ändern, dann können Sie einfach schreiben:

while (cubeMaterial.color.r > 0.0f) 
{ 
    cubeMaterial.color = new Color(
     cubeMaterial.color.r - coff * Time.deltaTime, 
     0.0f, 
     0.0f); 

    yield return new WaitForEndOfFrame(); 
} 

Wenn die Werte geändert haben könnte, dann würde man einen Scheck aufnehmen möchten, dass die grüne und blaue Komponenten waren nicht bereits Null, bevor sie ihre Werte dekrementierten.

Es kann auch ein Problem auftreten, wenn der Wert coff - Time.deltaTime größer ist als der aktuelle Wert cubeMaterial.color.r. Dies führt zu einer "negativen" Farbe. Ich weiß nicht einmal, ob das erfolgreich erstellt wird.

Wenn es nicht erstellt wird, wird Ihr Objekt mit der letzten gültigen Farbe verlassen - ein sehr dunkles Rot.

Wenn es erstellt wird, wenn der Anzeigecode das Zeichen ignoriert, würde dies den sehr leichten Rotstich Ihrer Objekte erklären.

Sie arbeiten mit float Werte, die, während sie für die Geschwindigkeit groß sind, Genauigkeitsprobleme haben. Ich würde einen zusätzlichen Test fügen Sie den Wert exakt auf Null zu setzen, wenn man nahe genug bekommen:

float offset = coff * Time.deltaTime; 
while (cubeMaterial.color.r > 0.0f) 
{ 
    cubeMaterial.color = new Color(
     (offset > cubeMaterial.color.r) ? cubeMaterial.color.r - offset : 0.0f, 
     0.0f, 
     0.0f); 

    yield return new WaitForEndOfFrame(); 
} 
+0

Ich habe es nicht irgendwo kopiert. Ich habe es geschrieben, und zum ersten Mal habe ich vergessen, diese Zeilen der Farbe G B zu ändern, um eine Null zu bleiben. Wenn es gleich null ist, funktioniert es nur fin, Aber. Dies bringt nicht die Antwort, warum die Farbe der Würfel am Ende der Farbe zu Schwarz wechselt, wenn sie einen Wert von Null hat und nicht verkleinert werden kann. –

Verwandte Themen