我正在尝试对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);
}
}
答案 0 :(得分:1)
你的脚本实际上没问题,没问题。这里的问题是UI元素根本没有足够的几何图形来实际看到整个渐变。
让我解释一下。简而言之,每个UI元素实际上是一个由几个3D三角形组成的网格,每个三角形都旋转成与摄像机正好面向摄像机,因此它看起来像2D。您可以通过为这些三角形的每个顶点指定颜色值来过滤工作。三角形中间的颜色值基于每个彩色顶点的接近度进行插值。
如果你看一下线框中的UI元素,你会发现它的几何图形非常简单。例如,这是切片图像的外观:
如您所见,它的所有顶点都集中在角落,中间没有顶点。所以,我们假设你的渐变是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)使用看起来像渐变渐变的纹理。