渐变无法在Unity3D GUI对象上正确呈现

时间:2015-12-13 01:55:22

标签: unity3d gradient

我正在尝试对Unity3D(5.2)gui对象应用渐变效果,但它好像完全忽略了其中一个渐变颜色键。我尝试过实例化一个新的渐变场并声明一个渐变场public并在编辑器中编辑它的键,但效果保持不变。 我开始认为我不应该以我使用它的方式在BaseMeshEffect中使用Gradients。如果只有2个键,颜色会正确呈现。我哪里错了?

这是一个代码示例,后跟屏幕截图。

 public class GradientUI : BaseMeshEffect
    {

        [SerializeField]
        public Gradient Grad; 

        public override void ModifyMesh(VertexHelper vh)
        {
            if (!IsActive())
            {
                return;
            } 

            List<UIVertex> vertexList = new List<UIVertex>();
            vh.GetUIVertexStream(vertexList);

            ModifyVertices(vertexList);

            vh.Clear();
            vh.AddUIVertexTriangleStream(vertexList);
        }

        void ModifyVertices(List<UIVertex> vertexList)
        {
            int count = vertexList.Count;
            float bottomY = vertexList[0].position.y;

            float topY = vertexList[0].position.y;

            for (int i = 1; i < count; i++)
            {
                float y = vertexList[i].position.y;
                if (y > topY)
                {
                    topY = y;
                }
                else if (y < bottomY)
                {
                    bottomY = y;
                }
            }

            float uiElementHeight = topY - bottomY;

            for (int i = 0; i < count; i++)
            {
                UIVertex uiVertex = vertexList[i];
                float percentage = (uiVertex.position.y - bottomY) / uiElementHeight;
                //   Debug.Log(percentage);
                Color col = Grad.Evaluate(percentage);
                uiVertex.color = col;

                vertexList[i] = uiVertex;
                 Debug.Log(uiVertex.position);
            }
        }

Screen shot

1 个答案:

答案 0 :(得分:1)

你的脚本实际上没问题,没问题。这里的问题是UI元素根本没有足够的几何图形来实际看到整个渐变。

让我解释一下。简而言之,每个UI元素实际上是一个由几个3D三角形组成的网格,每个三角形都旋转成与摄像机正好面向摄像机,因此它看起来像2D。您可以通过为这些三角形的每个顶点指定颜色值来过滤工作。三角形中间的颜色值基于每个彩色顶点的接近度进行插值。

如果你看一下线框中的UI元素,你会发现它的几何图形非常简单。例如,这是切片图像的外观:

UI Panel wireframe

如您所见,它的所有顶点都集中在角落,中间没有顶点。所以,我们假设你的渐变是2键WHITE =&gt; RED。上顶点的值为WHITE或接近WHITE,底值为RED或接近RED。这适用于2个键。

现在假设您有3个键WHITE =&gt; BLUE =&gt; RED。上限值为WHITE或接近WHITE,底部值为RED或接近RED,BLUE值应该位于中间的某个位置,但中间没有顶点,因此不会将其分配给任何内容。所以你仍然可以获得WHITE到RED渐变。

现在,您可以做什么:

1)您可以通过编程方式添加更多几何体,例如通过简单地细分整个网格。这可能会对您有所帮助:http://answers.unity3d.com/questions/259127/does-anyone-have-any-code-to-subdivide-a-mesh-and.html。请注意,在这种情况下,渐变具有的键越多,所需的细分就越多。

2)使用看起来像渐变渐变的纹理。