Unity3D高级编程:主程手记
上QQ阅读APP看书,第一时间看更新

4.4.5 VertexModifiers

VertexModifiers模块的作用是作为顶点修改器。顶点修改器为效果制作提供了更多基础方法和规则。

VertexModifiers模块的文件夹结构如图4-7所示。

图4-7 VertexModifiers模块的文件夹结构图

VertexModifiers模块主要用于修改图形网格,在UI元素网格生成完毕后可对其进行二次修改。

其中BaseMeshEffect类是抽象基类,提供所有在修改UI元素网格时所需的变量和接口。

IMeshModifier是关键接口,在渲染核心类Graphic中会获取所有拥有这个接口的组件,然后依次遍历并调用ModifyMesh接口来触发改变图像网格的效果。

当前在源码中拥有的二次效果包括Outline(包边框)、Shadow(阴影)、PositionAsUV1(位置UV),都继承自BaseMeshEffect基类,并实现了关键接口ModifyMesh。其中Outline继承自Shadow,它们的共同关键代码如下:


protected void ApplyShadowZeroAlloc(List<UIVertex>verts, Color32 color, int start, int end, float x, float y)
{
    UIVertex vt;
    var neededCpacity = verts.Count * 2;
    if (verts.Capacity<neededCpacity)
        verts.Capacity = neededCpacity;
    for (int i = start; i<end; ++i)
    {
        vt = verts[i];
        verts.Add(vt);
        Vector3 v = vt.position;
        v.x += x;
        v.y += y;
        vt.position = v;
        var newColor = color;
        if (m_UseGraphicAlpha)
            newColor.a = (byte)((newColor.a * verts[i].color.a) / 255);
        vt.color = newColor;
        verts[i] = vt;
    }
}

ApplyShadowZeroAlloc()函数的作用是在原有的网格顶点基础上加入新的顶点,这些新的顶点复制了原来的顶点数据,修改颜色并向外扩充,使得在原图形外渲染出外描边或者阴影。