多边形裁剪图片
效果
原理:就是将原有区域分割成围绕中心0的多个三角形
using UnityEngine; using UnityEngine.Sprites; using UnityEngine.UI; [RequireComponent(typeof(Image))] public class PolygonMeshEffect : BaseMeshEffect { [SerializeField] [Range(3, 60)] private int m_SegmentCount = 3; public int segmentCount { get { return m_SegmentCount; } } private Image m_Image; public Image image { get { if (null == m_Image) m_Image = GetComponent<Image>(); return m_Image; } } public override void ModifyMesh(VertexHelper vh) { if (!enabled) return; if (null == image) return; if (image.type != Image.Type.Simple) return; var sp = image.sprite; var color = image.color; vh.Clear(); var imageRect = image.GetPixelAdjustedRect(); //左下角为pivot的坐标 var vertCenter = new Vector3(imageRect.x + imageRect.width * 0.5f, imageRect.y + imageRect.height * 0.5f); float radius = (imageRect.width > imageRect.height) ? imageRect.height * 0.5f : imageRect.width * 0.5f; //使用短的边作为半径 var uv = (null != sp) ? DataUtility.GetOuterUV(sp) : Vector4.zero; var uvCenter = new Vector2((uv.x + uv.z) * 0.5f, (uv.y + uv.w) * 0.5f); float sx = (uv.z - uv.x) / imageRect.width; float sy = (uv.w - uv.y) / imageRect.height; float radianPerSegment = 2 * Mathf.PI / m_SegmentCount; vh.AddVert(vertCenter, color, uvCenter); Vector3 tempVert = vertCenter; Vector2 tempUv = uvCenter; float tempRadian = 0; for (int i = 0; i < m_SegmentCount; ++i) { float dx = Mathf.Cos(tempRadian) * radius; float dy = Mathf.Sin(tempRadian) * radius; tempVert.x = vertCenter.x + dx; tempVert.y = vertCenter.y + dy; tempUv.x = uvCenter.x + dx * sx; tempUv.y = uvCenter.y + dy * sy; vh.AddVert(tempVert, color, tempUv); tempRadian += radianPerSegment; } for (int i = 1; i < m_SegmentCount; ++i) { vh.AddTriangle(0, i + 1, i); //顺时针, SceneView的wireframe才能正确显示 } vh.AddTriangle(0, 1, m_SegmentCount); //首尾相连 } }
参考
[Unity UGUI] 制作圆形图片的两种方式 - 知乎 (zhihu.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通