【项目总结六】:圆形图片

变胖

 

public class CircleImage : Image
{
    const int FILL_PERCENT = 100;
    float thickness = 5;

    [SerializeField] [Range(3, 360)] private int _segments = 36;

    [SerializeField, Range(0f, 1f)] private float maskSize = 1;
    public int segments
    {
        get { return _segments; }
        set
        {
            if (_segments != value)
            {
                _segments = value;
                SetVerticesDirty();
#if UNITY_EDITOR
                UnityEditor.EditorUtility.SetDirty(transform);
#endif
            }
        }
    }

    protected override void OnPopulateMesh(VertexHelper vh)
    {
        
        
        float outer = -rectTransform.pivot.x * rectTransform.rect.width;
        float inner = -rectTransform.pivot.x * rectTransform.rect.width + this.thickness;

        vh.Clear();

        Vector2 prevX = Vector2.zero;
        Vector2 prevY = Vector2.zero;
        Vector2 uv0 = new Vector2(0,1);
        Vector2 uv1 =new Vector2(1,0);
        Vector2 uv2 = new Vector2(1,1);
        Vector2 uv3 =new Vector2(0,0);

        float tw = rectTransform.rect.width;
        float th = rectTransform.rect.height;
        float angleByStep = FILL_PERCENT / 100f * (Mathf.PI * 2f) / segments;
        float currentAngle = 0f;
        for (int i = 0; i < segments + 1; i++)
        {

            float c = Mathf.Cos(currentAngle);
            float s = Mathf.Sin(currentAngle);

            Vector2 pos0;
            Vector2 pos1;
            Vector2 pos2;
            Vector2 pos3;
            StepThroughPointsAndFill(outer, inner, ref prevX, ref prevY, out pos0, out pos1, out pos2, out pos3, c, s);

            uv0 = GetUvVector(pos0);
            uv1 = GetUvVector(pos1);
            uv2 = GetUvVector(pos2);
            uv3 = GetUvVector(pos3);

            vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));

            currentAngle += angleByStep;
        }
    }

    private Vector2 GetUvVector(Vector2 pos)
    {
        float tw = rectTransform.rect.width;
        Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
        float uvCenterX = (uv.x + uv.z) * 0.5f;
        float uvCenterY = (uv.y + uv.w) * 0.5f;
        float uvScaleX = uv.z - uv.x;
        float uvScaleY = uv.w - uv.y;
        var x = uvCenterX + pos.x / tw*uvScaleX*maskSize;
        var y = uvCenterY + pos.y / tw*uvScaleY*maskSize;
        return new Vector2(x,y);
    }
    private void StepThroughPointsAndFill(float outer, float inner, ref Vector2 prevX, ref Vector2 prevY, out Vector2 pos0, out Vector2 pos1, out Vector2 pos2, out Vector2 pos3, float c, float s)
    {
        pos0 = prevX;
        pos1 = new Vector2(outer * c, outer * s);

        pos2 = Vector2.zero;
        pos3 = Vector2.zero;

        prevX = pos1;
        prevY = pos2;
    }

    protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)
    {
        UIVertex[] vbo = new UIVertex[4];
        for (int i = 0; i < vertices.Length; i++)
        {
            var vert = UIVertex.simpleVert;
            vert.color = color;
            vert.position = vertices[i];
            vert.uv0 = uvs[i];
            vbo[i] = vert;
        }
        return vbo;
    }
}

 

 

[CustomEditor(typeof(CircleImage), true), CanEditMultipleObjects]
public class CircleImageInspector : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        CircleImage circle = target as CircleImage;
        circle.segments = Mathf.Clamp(EditorGUILayout.IntField("边数", circle.segments), 4, 360);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值