Unity UGUI Image镜像详解

在镜像之前需要先了解uv坐标,什么是uv坐标呢?博主找到了一篇很详细的博客
什么是uv坐标

Unity UGUI Image镜像详解_第1张图片

如图所示:坐标轴中的矩形是我们的图片,原本a、b、c、d四个点的坐标为
a(0,0)  b(1,0)  c(0,1)  d(1,1)
经过horizontal镜像之后,四个点的坐标应该变成
a(1,0)  b(0,0)  c(1,1)  d(0,1)
根据图可知从a->b x方向的变量变换了两倍的从a点到中心轴的位置
从b->a x的方向也是变换了两倍从b点到中心轴的位置,只是方向不同
由此可得
a->b变换后的x坐标=a的x坐标+(中心轴的x坐标-a的x坐标)*2
b->a变换后的y坐标=b的x坐标+(中心轴的x坐标-b的x坐标)*2

同理可得
Vertical镜像
a->c变换后的y坐标=a的y坐标+(中心轴的y坐标-a的y坐标)*2
c->a变换后的y坐标=c的y坐标+(中心轴的y坐标-c的y坐标)*2

由此,我们可以去编写Image镜像的代码

[RequireComponent(typeof(RectTransform), typeof(Graphic)), DisallowMultipleComponent]
[AddComponentMenu("UI/Effects/Extensions/MirrorImage")]
public class MirrorImage : MonoBehaviour, IMeshModifier
{

    [SerializeField]
    private bool _horizontal = false;

    [SerializeField]
    private bool _vertical = false;

    private Graphic graphic;

    private UIVertex uiVertex;
    private Vector3 tempVec = Vector3.zero;

    public bool horizontal
    {
        get { return _horizontal; }
        set
        {
            _horizontal = value;
            OnValidate();
        }
    }

    public bool vertical
    {
        get { return _vertical; }
        set
        {
            _vertical = value;
            OnValidate();
        }
    }

    protected void OnValidate()
    {
        if (graphic == null)
        {
            graphic = GetComponent<Graphic>();
        }
        graphic.SetVerticesDirty();
    }

    public void ModifyMesh(Mesh mesh)
    {
        throw new System.NotImplementedException();
    }

    public void ModifyMesh(VertexHelper verts)
    {
        //重新设置网格信息
        RectTransform rt = transform as RectTransform;

        for (int i = 0; i < verts.currentVertCount; ++i)
        {
            int index = i;
            verts.PopulateUIVertex(ref uiVertex, index);

            //根据对称轴设置镜像之后的坐标

            //新的坐标位置=原本的坐标位置+(中心点的位置(根据对称的方向确定轴)-原本的坐标位置)*2
            tempVec.x = _horizontal ? (uiVertex.position.x + (rt.rect.center.x - uiVertex.position.x) * 2) : uiVertex.position.x;
            tempVec.y = _vertical ? (uiVertex.position.y + (rt.rect.center.y - uiVertex.position.y) * 2) : uiVertex.position.y;
            tempVec.z = uiVertex.position.z;
            uiVertex.position = tempVec;
            verts.SetUIVertex(uiVertex, i);
        }
    }
}

你可能感兴趣的:(游戏开发,UI,Unity3D,unity,mesh,游戏引擎)