从中间开始以圆形方式着色圆(精灵/图像或网格)直到所需的半径

时间:2016-08-01 19:49:57

标签: unity3d

我想创造这种隧道效果,其中在另一个圆圈内显示不同半径的小圆圈,我想在它们之间无缝地从一个内圈到另一个外圈进行色移。

我尝试在一个普通物体下面放置4个圆圈,并在那里更改材料颜色(4个圆圈作为画布中的图像,精灵和模型也来自搅拌机。我需要一个好的方向。我已经创建了一个纹理,用于使用setPixel(我已经完成了半径的工作。因为SetPixel采用整数。在我看来,我认为解决方案在于我要么需要一个可以逐渐填满物体的圆圈线,或者需要一个小的区域填充圆圈。我&#39 ; m随时准备使用着色器或任何其他方法。 代码示例:这里的circlesContainer包含许多这样的圆圈,每个圆圈包含4个圆圈,0个索引作为较大圆圈内的最小圆圈。

 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 ;
    }


}

我尝试了像第一种情况一样的颜色

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

lerping的结果。 小视频:https://drive.google.com/file/d/0B7LoX90Lc4O2OTJRNGhGLWpfY0k/view?usp=sharing

编辑: @mgear这是更新后的代码和相关视频我在这里有些疑惑。

 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;
        }


    }

如果我在代码中有唯一的注释行,那么颜色会长时间保持不变,如果我没有这条线,那么所有颜色都会突然改变。 我想要的是拥有相同的颜色,并以类似的方式再次开始着色,我对Lerping并不好,并且感觉到最后一个参数是导致颜色停留的那个。< / p>

以下是最后一种颜色的视频。

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

1 个答案:

答案 0 :(得分:3)

需要查看您想要实现的示例图像..

但仍然有很多选择:

  • 使用多个重叠的精灵并缩放它们(可以为每个精灵调整色调)
  • 使用顶点颜色生成圆形网格(可以调整脚本中的颜色或使用着色器或纹理/蒙版纹理。请参阅Google Cardboard reticle作为圆形网格生成示例)
  • 使用着色器(下面的示例图片只是一个四边形网格并使用this shader

CircularShader