这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细

点击这里

我写的这个只支持正方形图片,效果是酱紫的~

一共三个代码,还需要两个代码,原帖里都有的,我只是修改了其中一个。

 using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Sprites; [AddComponentMenu("UI/Circle Image")]
public class CircleImage1 : BaseImage {
// Use this for initialization
void Awake () {
innerVertices = new List<Vector3>();
outterVertices = new List<Vector3>();
} // Update is called once per frame
void Update () { } [Range(, )]
public float scale = 1f; [Range(, )]
public int segements = ; private List<Vector3> innerVertices;
private List<Vector3> outterVertices; protected override void OnPopulateMesh(VertexHelper vh)
{ vh.Clear();
Rect pixelAdjustedRect = this.GetPixelAdjustedRect(); Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
//Debug.LogError("uv:" + uv+","+uv.w+","+uv.x+","+uv.y+","+uv.z); Vector2 u = new Vector2(, );
float w = pixelAdjustedRect.width; #region
//
for (int i =; i < segements+; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i ==)
{
//半径*
uivertex.uv0 = new Vector2(uv.x + (scale / ) * (uv.z - uv.x) * ( - Mathf.Sin(i * / segements)), uv.y + (scale / ) * (uv.w - uv.y) * ( - Mathf.Cos(i * / segements)));
u = new Vector2((scale / ) * ( - Mathf.Sin(i * / segements)),(scale / ) * ( - Mathf.Cos(i * / segements)));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (scale / ) * (uv.z - uv.x) * ( - Mathf.Sin(Mathf.PI / (180f / (i * / segements)))), uv.y + (scale / ) * (uv.w - uv.y) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))));
u = new Vector2((scale / ) * ( - Mathf.Sin(Mathf.PI / (180f / (i * / segements)))),(scale / ) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / ); vh.AddVert(uivertex);
}
//
for (int i = ; i < segements + ; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i == )
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (scale / ) * ( - Mathf.Cos(i * / segements)), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Sin(i * / segements)));
u = new Vector2((scale / ) - (scale / ) * Mathf.Cos(i * / segements), ( - scale / ) + (scale / ) * Mathf.Sin(i * / segements));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (scale / ) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements)))));
u = new Vector2( (scale / ) * ( - Mathf.Cos(Mathf.PI / (180f / (i * / segements)))), ( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / );
vh.AddVert(uivertex);
}
//
for (int i = ; i < segements + ; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i == )
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Sin(i * / segements)), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Cos(i * / segements)));
u = new Vector2(( - scale / ) + (scale / ) * Mathf.Sin(i * / segements), ( - scale / ) + (scale / ) * Mathf.Cos(i * / segements));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements)))), uv.y + (uv.w - uv.y) * (( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements)))));
u= new Vector2(( - scale / ) + (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements))), ( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / );
vh.AddVert(uivertex);
}
//
for (int i = ; i < segements + ; i++)
{
UIVertex uivertex = new UIVertex();
uivertex.color = color;
if (i == )
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Cos(i * / segements)), uv.y + (uv.w - uv.y) * ((scale / ) - (scale / ) * Mathf.Sin(i * / segements)));
u = new Vector2(( - scale / ) + (scale / ) * Mathf.Cos(i * / segements), (scale / ) - (scale / ) * Mathf.Sin(i * / segements));
}
else
{
uivertex.uv0 = new Vector2(uv.x + (uv.z - uv.x) * (( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements)))), uv.y + (uv.w - uv.y) * ((scale / ) - (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements)))));
u = new Vector2(( - scale / ) + (scale / ) * Mathf.Cos(Mathf.PI / (180f / (i * / segements))), (scale / ) - (scale / ) * Mathf.Sin(Mathf.PI / (180f / (i * / segements))));
}
uivertex.position = new Vector3(w * u.x - w / , w * u.y - w / );
vh.AddVert(uivertex);
} //((点*4+8个点-3)条弦+1)个三角形
for (int i = ; i < ((segements - ) * + - + ); i++)
{
vh.AddTriangle(, i + , i + );
}
#endregion
} public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
// Sprite sprite = overrideSprite;
// if (sprite == null)
// return true; // Debug.LogError("鼠标点击:" + screenPoint); // Vector2 local;
// RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, eventCamera, out local);
return true;
} private bool Contains(Vector2 p, List<Vector3> outterVertices, List<Vector3> innerVertices)
{
var crossNumber = ;
RayCrossing(p, innerVertices, ref crossNumber);//检测内环
RayCrossing(p, outterVertices, ref crossNumber);//检测外环
return (crossNumber & ) == ;
} /// <summary>
/// 使用RayCrossing算法判断点击点是否在封闭多边形里
/// </summary>
/// <param name="p"></param>
/// <param name="vertices"></param>
/// <param name="crossNumber"></param>
private void RayCrossing(Vector2 p, List<Vector3> vertices, ref int crossNumber)
{
for (int i = , count = vertices.Count; i < count; i++)
{
var v1 = vertices[i];
var v2 = vertices[(i + ) % count]; //点击点水平线必须与两顶点线段相交
if (((v1.y <= p.y) && (v2.y > p.y))
|| ((v1.y > p.y) && (v2.y <= p.y)))
{
//只考虑点击点右侧方向,点击点水平线与线段相交,且交点x > 点击点x,则crossNumber+1
if (p.x < v1.x + (p.y - v1.y) / (v2.y - v1.y) * (v2.x - v1.x))
{
crossNumber += ;
}
}
}
} }

最新文章

  1. 小白学习MVC5+EF6遇到的问题一
  2. 【WP8】WebBrowser相关
  3. Nginx反向代理设置 从80端口转向其他端口
  4. BZOJ4384 : [POI2015]Trzy wieże
  5. php课程---Windows.open()方法参数详解
  6. LintCode Count 1 in Binary
  7. Chap3: question: 11 - 18
  8. AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方
  9. 同步窗体移动 FormMove
  10. 计算几何(凸包):SHTSC 2012 信用卡凸包
  11. leetcode旋转数组查找 二分查找的变形
  12. (转载)ubuntu安装pyton-pip问题解决
  13. 从html字符串中获取div内容---jquery
  14. JS实现信息的显示和隐藏
  15. 团队作业8——第二次项目冲刺(Beta阶段)日志集合处
  16. yum fastermirror插件屏蔽一些国内源
  17. android 资源
  18. 论文笔记系列-Neural Network Search :A Survey
  19. [加密]证书、CA、证书信任链
  20. Git 使用规范流程【转】

热门文章

  1. ArchLinux 下文件描述符
  2. UITouch笔记
  3. [开源JVM] yvm - 自制Java虚拟机
  4. CRS无法随操作系统自动启动
  5. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
  6. oracle nvl()函数
  7. DP 免费馅饼 HDU1176
  8. API Monitor程序分析工具简介
  9. python函数超时情况应对总结
  10. 4.nginx动静分离