首先UGUI是自带的mask遮罩组件的,但也有其优缺点
优点:
使用自带组件方便使用,不用额外代码
缺点:
1.锯齿效果比较严重
2.增加额外的draw call,影响性能
我们可以通过unity组件的可扩展性,自定义一个mask遮罩
//核心脚本
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Sprites;
using UnityEngine.UI;
public class CircleImage : Image
{
/// <summary>
///圆形由多少块三角形拼成即圆形精度,值越大精度越高
/// </summary>
[SerializeField]
private int segements = 100;
/// <summary>
/// 显示部分占圆形的百分比.
/// </summary>
[SerializeField]
private float showPercent = 1f;
private readonly Color32 GRAY_COLOR = new Color32(60, 60, 60, 255);
private List<Vector3> _vertexList;
protected override void OnPopulateMesh(VertexHelper vh)
{
vh.Clear();
_vertexList = new List<Vector3>();
AddVertex(vh, segements);
AddTriangle(vh, segements);
}
private void AddVertex(VertexHelper vh, int segements)
{
float width = rectTransform.rect.width;
float heigth = rectTransform.rect.height;
int realSegments = (int)(segements * showPercent);
//四维向量可代表着二维平面的四个坐标(uv.x,uv.y),(uv.z,uv.y),(uv.x,uv.w)(uv.z,uv.w)
Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
float uvWidth = uv.z - uv.x;
float uvHeight