我想创造这种隧道效果,其中在另一个圆圈内显示不同半径的小圆圈,我想在它们之间无缝地从一个内圈到另一个外圈进行色移。
我尝试在一个普通物体下面放置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
答案 0 :(得分:3)
需要查看您想要实现的示例图像..
但仍然有很多选择: