参考链接:

http://www.cnblogs.com/leoin2012/p/6425089.html

前面说过Mask组件会影响性能:https://www.cnblogs.com/lyh916/p/10587632.html

因此,尽量少使用Mask,对于类似技能图标那样的圆形图片,可以考虑用本文的方式去实现。

1.CircleImage.cs

 using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Sprites;
using System.Collections.Generic; public class CircleImage : Image { public float fillPercent = 1f; //填充比例
public int fillNum = ; //填充个数
private List<Vector2> outerVertexs; //圆上顶点列表 protected override void Awake()
{
base.Awake();
outerVertexs = new List<Vector2>();
} protected override void OnPopulateMesh(VertexHelper toFill)
{
if (overrideSprite == null)
{
base.OnPopulateMesh(toFill);
return;
} switch (type)
{
case Type.Simple:
GenerateSimpleSprite(toFill, preserveAspect);
break;
}
} void GenerateSimpleSprite(VertexHelper vh, bool lPreserveAspect)
{
vh.Clear();
outerVertexs.Clear(); //计算准备
Vector4 uv = (overrideSprite != null) ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero; float degreeDelta = * Mathf.PI / fillNum;
int curNum = (int)(fillNum * fillPercent);
float width = rectTransform.rect.width;
float height = rectTransform.rect.height;
float radius = width * 0.5f; float uvCenterX = (uv.x + uv.z) * 0.5f;
float uvCenterY = (uv.y + uv.w) * 0.5f;
float uvScaleX = (uv.z - uv.x) / width;
float uvScaleY = (uv.w - uv.y) / height; //添加第一个点
UIVertex uiVertex = new UIVertex();
uiVertex.color = color;
uiVertex.position = Vector2.zero;
uiVertex.uv0 = new Vector2(uvCenterX, uvCenterY);
vh.AddVert(uiVertex); //添加圆上的点
int vertNum = (fillPercent == ) ? curNum : curNum + ;
for (int i = ; i <= vertNum; i++)
{
float curDegree = (i - ) * degreeDelta;
float cosA = Mathf.Cos(curDegree);
float sinA = Mathf.Sin(curDegree);
Vector2 curVertice = new Vector2(cosA * radius, sinA * radius); uiVertex = new UIVertex();
uiVertex.color = color;
uiVertex.position = curVertice;
uiVertex.uv0 = new Vector2(uvCenterX + curVertice.x * uvScaleX, uvCenterY + curVertice.y * uvScaleY);
vh.AddVert(uiVertex); outerVertexs.Add(curVertice);
} //连接点
for (int i = ; i < vertNum; i++)
{
vh.AddTriangle(, i + , i);
}
if (fillPercent == )
{
vh.AddTriangle(, , curNum);
} //连接点击区域
if (fillPercent < )
{
outerVertexs.Add(Vector2.zero);
}
} public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
Sprite sprite = overrideSprite;
if (sprite == null)
return true; Vector2 local;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, eventCamera, out local); return MathTool.IsPointInPolygon(local, outerVertexs);
}
}

效果如下:

分析:

a.顶点数据

这里以pivot为(0.5,0.5)为例。在这种情况下,图片的位置中心和uv中心重合,即都在图片的中点处。因此这时位置和uv是成比例的,即uv.z - uv.x对应width,uv.w - uv.y对应height,这样就可以根据当前点的位置计算出对应的uv坐标。

关于圆上的顶点个数,当填充比例小于1时,顶点个数=三角形个数+1;当填充比例等于1时,顶点个数=三角形个数(因为点重合)

b.顶点连接

要按顺时针连接(顺时针表示正对屏幕,逆时针表示背对屏幕)。这里使用(0, i + 1, i)的顺序。

c.点击区域

使用这个算法:https://www.cnblogs.com/lyh916/p/10633132.html

要注意的是,当填充比例小于1时,要把原点也加上去,可以考虑一下下面的情况:

2.CircleImageEditor.cs

 using UnityEditor;
using UnityEditor.UI; [CustomEditor(typeof(CircleImage))]
public class CircleImageEditor : ImageEditor { SerializedProperty fillPercent;
SerializedProperty fillNum; protected override void OnEnable()
{
base.OnEnable();
fillPercent = serializedObject.FindProperty("fillPercent");
fillNum = serializedObject.FindProperty("fillNum");
} public override void OnInspectorGUI()
{
base.OnInspectorGUI(); serializedObject.Update(); fillPercent.floatValue = EditorGUILayout.Slider("填充比例", fillPercent.floatValue, , );
fillNum.intValue = EditorGUILayout.IntSlider("填充个数", fillNum.intValue, , ); serializedObject.ApplyModifiedProperties();
}
}

[UGUI]圆形Image的更多相关文章

  1. unity探索者之UGUI圆形图片组件

    版权声明:本文为原创文章,转载请声明https://www.cnblogs.com/unityExplorer/p/13524824.html 使用UGUI进行游戏开发的过程中经常会遇到一个问题:玩家 ...

  2. CircleList-使用UGUI实现的圆形列表

    CircleList CircleList是一个通过UGUI实现的圆形列表,通过缩放.平移和层级的改变模拟一个3D的圆形列表. 效果 添加与旋转 间距调整 椭圆形的旋转 参数 CenterX: 椭圆圆 ...

  3. 【转】超简单利用UGUI制作圆形小地图

    http://sanwen.net/a/ithhtbo.html 由于UI都是Achor自己用PS做的,比较粗糙,大家见谅,不过丝毫不影响功能的实现,下面我们看看今天的笔记: 首先我们看看需要哪些组件 ...

  4. unity 支持圆形、切倒角和虚化UGUI Shader

    // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt ...

  5. [Unity] UGUI研究院之游戏摇杆

    最近在做Unity基于UGUI的摇杆,发现了一种非常简单并且巧妙的方法,原文在这里, 不过要FQ!!http://godstamps.blogspot.tw/2015/07/unity-ugui-sc ...

  6. 丢掉Mask遮罩,更好的圆形Image组件[Unity]

    写在前面 全文解析圆形Image组件的实现原理,取关键代码介绍算法细节,源码已经上传Github下载地址,欢迎下载试用. 一.Unity原生Image组件实现圆形图片的缺陷 Mask渲染消耗 许多游戏 ...

  7. UGUI简易摇杆

    实现 直接使用系统自带圆形控件图标 编写脚本, 实现UGUI拖拽事件 将多拽范围限定于给定半径和圆心的圆内 计算出等同于Input.GetAxis()的值,直接控制被控制物体 代码 using Sys ...

  8. Unity UGUI优化整理

    看了不少UI优化方面的东西,还是记下来方便记忆,优化性能往往是在各种选择之间做出平衡(空间换时间,或者GPU换CPU,舍弃精度等). 主要优化点在减少Drawcall,减少Overdraw. Mask ...

  9. 【UGUI源码分析】Unity遮罩之Mask详细解读

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...

随机推荐

  1. Forth词典条目结构

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  2. Android Studio安装时候遇到HAXM问题

    之前抽风,把AS写在卸载掉了,再进行重装时候就爆炸了,一直提示下面这个错误: <一>failed to install Intel HAXM. For details, pleasse c ...

  3. 三、fgetc与fputc

    fgetc 功能:从流中读取一个字符 原型:int fgetc(FILE *stream); 参数: stream:要读取的流指针 返回:读取到的字符,如果读完则返回EOF,EOF是end of fi ...

  4. 2.oracle之用户管理sql

    --创建用户--create user  用户名  identified by  密码;create user jojo identified by bean; --给用户授权--grant conn ...

  5. Linux 查看端口被什么程序占用

    lsof -i:8899 输出: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEjava 38889 root 329u IPv6 5883661 ...

  6. api管理平台

    安装和介绍 安装要求:(centos安装环境) nodejs(7.6+) mongodb(2.6|+) 安装get和编译的工具 yum -y install wget make gcc gcc-c++ ...

  7. 百度前端代码规范:HTML

    HTML 1.代码风格 1.1缩进与换行 [强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符. <style> ul { padding:; } < ...

  8. js补零方法

    方法如下: function getZero(num, index) { if((parseInt(num) != 0) && (typeof num == "undefin ...

  9. 一台服务器绑定多个ip地址

    一台服务器绑定多个ip地址. 方法一: 使用标准的网络配置工具(比如ifconfig和route命令)添加lP别名: 在eth0网卡再绑定一个ip:192.168.101.103 /sbin/ifco ...

  10. python trie

    Trie 库 https://github.com/pytries/marisa-trie/blob/master/docs/tutorial.rst http://marisa-trie.readt ...