2016-08-01 12 views
0

Ich möchte diesen Tunneleffekt erzeugen, bei dem kleine Kreise mit unterschiedlichem Radius innerhalb eines anderen Kreises dargestellt werden und i möchten, dass sich die Farben zwischen ihnen von einem inneren Kreis zu einem anderen äußeren Kreis verschieben.Einen Kreis (sprite/image oder mesh) kreisförmig von der Mitte bis zum gewünschten Radius einfärben

Ich habe versucht, 4 Kreise unter einem gemeinsamen Objekt zu platzieren und dort Materialfarbe (4kreise als Bilder in Leinwand, Sprite und Modell aus Mixer auch. Ich brauche eine gute Richtung. Ich habe eine Textur erstellt, um wie in SetPixel verwenden() Ich habe es gemacht, um es mit vollem Radius zu arbeiten, da SetPixel ganzzahlig ist. In meinen Gedanken liegt die Lösung in der Tatsache, entweder brauche ich circluar Linien, die das Ding allmählich füllen können oder kleine Flächen füllen für Kreise. m bereit, mit Shadern oder einem anderen Ansatz zu arbeiten, wie notwendig Codebeispiel:. Hier enthält circlesContainer viele solche Kreise und jeder Kreis enthalten vier Kreise mit 0-Index als kleinster Kreis innerhalb der größeren

public IEnumerator TunnelingColors(float delayTime,Transform circlesContainer) 
{ 
    currentColor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 

    for (int i = 0; i < circlesContainer.transform.childCount; i++) { 
     for (int j = 0; j < circlesContainer.GetChild (i).transform.childCount; j++) { 


        circlesContainer.GetChild (i).transform.GetChild (j).GetComponent<MeshRenderer>().material.color = currentColor; 


     } 
    } 

    while (true) 
    { 
[UnityEngine.Random.Range (0, CircleColors.Length)]; 
      smallestCirclecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 
      smallerCirclecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 
      smallCirclecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 
      Circlecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 

     for( t = 0 ; t <= delayTime ; t += 1f) 
     { 
      yield return new WaitForSeconds (1f); 

      if (t > 1f && t <= 3f) { 

       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 



          circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallestCirclecolor; 



       } 

      } else if (t >= 3f && t <= 5f) { 

       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


          circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallerCirclecolor; 


          circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<MeshRenderer>().material.color = smallestCirclecolor; 



       } 

      } else if (t > 5f && t <=6f) { 
       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


          circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 


          circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<MeshRenderer>().material.color = smallerCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<MeshRenderer>().material.color = smallestCirclecolor; 




       } 

      } else if (t > 6f&&t<=7f) { 
       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


          circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<MeshRenderer>().material.color = smallerCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<MeshRenderer>().material.color = smallestCirclecolor; 


       } 


      }else if (t > 7f && t<= 8f) { 
       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


          circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 


          circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<MeshRenderer>().material.color = smallerCirclecolor; 

       } 


      }else if (t > 8f) { 
       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


          circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 



          circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 
         } 


          circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 
         } 

          circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<MeshRenderer>().material.color = smallCirclecolor; 
         } 
         currentColor = smallCirclecolor; 

       } 


      } 


     } 



     yield return null ; 
    } 


} 
. in ersten Fall

circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<MeshRenderer>().material.color = smallestCirclecolor; 
          Color.Lerp(currentcolor,smallestCircleColor,t/delaytime); 

Ergebnisse mit lerping

und ich habe versucht, wie die Farben lerping. kleines Video: https://drive.google.com/file/d/0B7LoX90Lc4O2OTJRNGhGLWpfY0k/view?usp=sharing

EDIT: @mgear Hier ist der aktualisierte Code und das dazugehörige Video, das ich hier einige Zweifel habe.

public IEnumerator TunnelingColorsMaterial (float delayTime,Transform circlesContainer) 
    { 

     currentColor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 

     for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


      circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = currentColor; 
      circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = currentColor;   
      circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<SpriteRenderer>().color = currentColor; 
      circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<SpriteRenderer>().color = currentColor; 
      circlesContainer.GetChild (i).transform.GetChild (4).GetComponent<SpriteRenderer>().color = currentColor; 


     } 


     while (true) { 
      smallestCirclecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 
      smallerCirclecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 
      smallCirclecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 
      Circlecolor = (Color)CircleColorsList [UnityEngine.Random.Range (0, CircleColors.Length)]; 

      for (t = 0; t <= delayTime; t += 0.01f) { 
     yield return new WaitForSeconds (0.01f); 

       for (int i = 0; i < circlesContainer.transform.childCount; i++) { 


        circlesContainer.GetChild (i).transform.GetChild (0).localScale = Vector3.Lerp (circlesContainer.GetChild (0).transform.GetChild (0).localScale, new Vector3 (circleDiameterRequiredInInchesforSmallestCircle, circleDiameterRequiredInInchesforSmallestCircle, circleDiameterRequiredInInchesforSmallestCircle), t/0.5f); 
        circlesContainer.GetChild (i).transform.GetChild (1).localScale = Vector3.Lerp (circlesContainer.GetChild (0).transform.GetChild (1).localScale, new Vector3 (circleDiameterRequiredInInchesforSmallCircle, circleDiameterRequiredInInchesforSmallCircle, circleDiameterRequiredInInchesforSmallCircle), t/1f); 
        circlesContainer.GetChild (i).transform.GetChild (2).localScale = Vector3.Lerp (circlesContainer.GetChild (0).transform.GetChild (2).localScale, new Vector3 (circleDiameterRequiredInInchesforLargeCircle, circleDiameterRequiredInInchesforLargeCircle, circleDiameterRequiredInInchesforLargeCircle), t/1.5f); 
        circlesContainer.GetChild (i).transform.GetChild (3).localScale = Vector3.Lerp (circlesContainer.GetChild (0).transform.GetChild (3).localScale, new Vector3 (circleDiameterRequiredInInchesforLargestCircle, circleDiameterRequiredInInchesforLargestCircle, circleDiameterRequiredInInchesforLargestCircle), t/2f); 

        if (circlesContainer.GetChild (i).transform.GetChild (0).localScale.x == circleDiameterRequiredInInchesforSmallestCircle) { 


         circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = Color.Lerp(currentColor,smallestCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = currentColor; 

        } 


        if (circlesContainer.GetChild (i).transform.GetChild (1).localScale.x == circleDiameterRequiredInInchesforSmallCircle) { 



         circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = Color.Lerp(smallestCirclecolor,smallerCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = Color.Lerp(currentColor,smallestCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<SpriteRenderer>().color = currentColor; 

        } 

        if (circlesContainer.GetChild (i).transform.GetChild (2).localScale.x == circleDiameterRequiredInInchesforLargeCircle) { 

         circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = Color.Lerp(smallestCirclecolor,smallerCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<SpriteRenderer>().color = Color.Lerp(currentColor,smallestCirclecolor,t); 

         circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<SpriteRenderer>().color = currentColor; 


        } 

        if (circlesContainer.GetChild (i).transform.GetChild (3).localScale.x == circleDiameterRequiredInInchesforLargestCircle) { 

         circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<SpriteRenderer>().color = Color.Lerp(smallestCirclecolor,smallerCirclecolor,t); 

         circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<SpriteRenderer>().color = Color.Lerp(currentColor,smallestCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (0).localScale = Vector3.Lerp (circlesContainer.GetChild (0).transform.GetChild (0).localScale, new Vector3 (circleDiameterRequiredInInchesforSmallCircle, circleDiameterRequiredInInchesforSmallCircle, circleDiameterRequiredInInchesforSmallCircle), t/0.5f); 


        } 
        if (circlesContainer.GetChild (i).transform.GetChild (0).localScale.x == circleDiameterRequiredInInchesforSmallCircle) { 

         circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<SpriteRenderer>().color = Color.Lerp(smallestCirclecolor,smallerCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (0).localScale = Vector3.Lerp (circlesContainer.GetChild (0).transform.GetChild (0).localScale, new Vector3 (circleDiameterRequiredInInchesforLargeCircle, circleDiameterRequiredInInchesforLargeCircle, circleDiameterRequiredInInchesforLargeCircle), t/0.5f); 



        } 

        if (circlesContainer.GetChild (i).transform.GetChild (0).localScale.x == circleDiameterRequiredInInchesforLargeCircle) { 

         circlesContainer.GetChild (i).transform.GetChild (0).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (1).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (2).GetComponent<SpriteRenderer>().color = Color.Lerp(smallerCirclecolor,smallCirclecolor,t); 
         circlesContainer.GetChild (i).transform.GetChild (3).GetComponent<SpriteRenderer>().color = Color.Lerp (smallerCirclecolor, smallCirclecolor, t); 
     //    circlesContainer.GetChild (i).transform.GetChild (4).GetComponent<SpriteRenderer>().color = Color.Lerp (currentColor, smallCirclecolor, t); 

        } 












     } 

      } 






      for (int i = 0; i < circlesContainer.transform.childCount; i++) { 
          circlesContainer.GetChild (i).transform.GetChild (0).localScale = new Vector3 (0, 0, 0); 
          circlesContainer.GetChild (i).transform.GetChild (1).localScale = new Vector3 (0, 0, 0); 
          circlesContainer.GetChild (i).transform.GetChild (2).localScale = new Vector3 (0, 0, 0); 
          circlesContainer.GetChild (i).transform.GetChild (3).localScale = new Vector3 (0, 0, 0); 

         } 



      yield return null; 
     } 


    } 

Wenn ich die einzige kommentierte Zeile im Code, was ich habe, ist die Farbe so lange bleibt, und wenn ich es nicht, dass die Linie haben plötzliche Veränderung aller Farben. Was ich haben möchte, ist eine gleiche Farbe zu haben und die Färbung wieder auf ähnliche Weise zu beginnen, ich bin nicht gut mit Lerping und bekomme das Gefühl, dass der letzte Parameter derjenige ist, der die Farbe verursacht.

Hier ist das Video, in dem die letzte Farbe bleibt.

https://drive.google.com/open?id=0B7LoX90Lc4O2czlWMldCMUpFYTg

+1

Nette Idee, aber was haben Sie versucht? Wo ist deine Frage? – ppeterka

+0

Ich habe versucht, 4 Kreise unter einem gemeinsamen Objekt zu platzieren und dort Materialfarbe (4kreise als Bilder in Leinwand, Sprite und Modell aus Mixer auch. Ich brauche eine gute Richtung. Ich habe eine Textur erstellt, um wie in setPixel() verwenden i haben es gemacht, um es mit vollem Radius zu arbeiten, da SetPixel int. nimmt –

+1

Bitte fügen Sie dieses Detail zu Ihrer Frage hinzu, zeigen Sie Ihren Code, zeigen Sie das Ergebnis an und beschreiben Sie auch, was Ihr Ziel ist und wie das Ergebnis das nicht erfüllt.Lesen Sie bitte [welche Fragen auf dieser Site geeignet sind und wie Sie danach fragen können] (http://stackoverflow.com/help/asking). – ppeterka

Antwort

3

Bräuchte Beispielbild zu sehen, was Sie wollen .. archieve

Aber noch gibt Bereich viele Möglichkeiten:

  • Verwenden Sie mehrere überlappende Sprites und skalieren (anpassen Tönungsfarbe für jedes Sprite)
  • Erzeugt ein kreisförmiges Netz mit Vertexfarben (kann Farben aus einem Skript anpassen oder Shader oder Texturen/Maskenstrukturen verwenden. Siehe Google Cardboard reticle als Beispiel kreisförmige Gittererzeugung)
  • Verwendung Shadern (Beispiel Bild unten ist nur ein Quad-Mesh und verwendet this shader)

CircularShader

+0

in Bezug auf Ihren ersten Punkt skalieren sie, ich habe es versucht mit Animation werde ich in der Lage sein, die Skala in der Animation durch Code zu steuern oder sollte ich gerne ändern die Skala in Coroutine oder Update-Typen –

+0

gut Test es nur von Skript zuerst in Update() Schleife, einfacher – mgear

+0

können Sie überprüfen, wo ich einen Fehler mache –