Unity 圆形图片实现

本文介绍了一个Unity中实现圆形图片显示的方法,通过自定义Image子类CircleImageutils来绘制圆形图片,并通过三角形段数控制圆滑度。文章详细展示了如何计算顶点位置与纹理坐标,以确保图片正确地映射到圆形区域上。

Unity UGUI 圆形图片(通常用于用户头像)

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Sprites;

//圆形图片
public class CircleImageutils : Image
{
    /// <summary>
    /// 圆形由多少个三角形组成
    /// </summary>
    private int segement = 100;

    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();

        float width = rectTransform.rect.width;
        float height = rectTransform.rect.height;

        Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
        float uv_width = uv.z - uv.x;
        float uv_height = uv.w - uv.y;
        Vector2 uvCenter = new Vector2(uv_width * 0.5f, uv_height * 0.5f);
        Vector2 convertRatio = new Vector2(uv_width / width, uv_height / height);

        float radian = 2 * Mathf.PI / segement;
        float radius = width * 0.5f;

        UIVertex origin = new UIVertex();
        origin.color = color;
        origin.position = Vector3.zero;
        origin.uv0 = new Vector2(origin.position.x * convertRatio.x + uvCenter.x, origin.position.y * convertRatio.y + uvCenter.y);
        vh.AddVert(origin);

        int vertexCount = segement + 1;
        float curRadian = 0;
        for (int i = 0; i < vertexCount; i++)
        {
            float x = Mathf.Cos(curRadian) * radius;
            float y = Mathf.Sin(curRadian) * radius;
            curRadian += radian;

            UIVertex vertexTemp = new UIVertex();
            vertexTemp.color = color;
            vertexTemp.position = new Vector2(x, y);
            vertexTemp.uv0 = new Vector2(vertexTemp.position.x * convertRatio.x + uvCenter.x, vertexTemp.position.y * convertRatio.y + uvCenter.y);
            vh.AddVert(vertexTemp);
        }

        int id = 1;
        for (int i = 0; i < segement; i++)
        {
            vh.AddTriangle(id, 0, id + 1);
            id++;
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值