版权声明:本文为原创文章,转载请声明https://www.cnblogs.com/unityExplorer/p/13524824.html

使用UGUI进行游戏开发的过程中经常会遇到一个问题:玩家的头像在不同的界面或场景显示的形状可能不一样,有的地方需要显示成圆形,有些地方需要显示成方形

为了避免这种问题,我们选择殴打策划,恩。。。但是如果打策划打不过,美术小姐姐又不好意思打的话,怎么办?真出两套图,那不是一个精益求精的攻城狮乐意的看到的结果

有没有办法可以让同一张图可以显示成不同的形状呢?有的朋友说了,可以用UGUI的Mask来实现

这也是一种办法,但是这种办法有个弊端,就是遮罩图片尺寸很小的话,边缘锯齿会相当严重,这与UGUI中Mask的原理有关

所以有没有更好的办法呢?有的,我们先分析下UGUI图片的渲染原理

实际上,UGUI中的图片其实就是一个由两个三角面拼接成的平面模型

当场景中只有一张图片时,可以看到,Tris是2,Verts是4

基于此,将顶点围成的图形修改成圆形,那就实现了我们的目的

将n个三角形拼接到一起就是一个近似圆形的形状,比如:

实现代码如下:

    public class CircleImage : Image
{
public int segements = ;
public float fillPercent = ; protected override void OnPopulateMesh(VertexHelper vh)
{
vh.Clear(); float tw = rectTransform.rect.width;
float th = rectTransform.rect.height;
float outerRadius = 0.5f * Mathf.Min(tw, th);
float degreeDelta = * Mathf.PI / segements;
int curSegements = (int)(segements * fillPercent);
        
       //因UGUI的锚点系统,这里需要考虑pivot的差值,以避免因物体原点的改变导致图片歪了
Vector2 pivotVector = new Vector2(tw * (0.5f - rectTransform.pivot.x), th * (0.5f - rectTransform.pivot.y));
Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
Vector2 center = new Vector2(uv.x + uv.z, uv.y + uv.w) * 0.5f;
float uvScaleX = (uv.z - uv.x) / tw;
float uvScaleY = (uv.w - uv.y) / th; float curDegree = ;
UIVertex uiVertex;
int verticeCount;
int triangleCount;
Vector2 curVertice; curVertice = Vector2.zero;
verticeCount = curSegements + ;
uiVertex = new UIVertex
{
color = color,
position = curVertice + pivotVector,
uv0 = new Vector2(curVertice.x * uvScaleX, curVertice.y * uvScaleY) + center
};
vh.AddVert(uiVertex); for (int i = ; i < verticeCount; i++)
{
curVertice = new Vector2(Mathf.Cos(curDegree) * outerRadius, Mathf.Sin(curDegree) * outerRadius);
curDegree += degreeDelta; uiVertex = new UIVertex
{
color = color,
position = curVertice + pivotVector,
uv0 = new Vector2(curVertice.x * uvScaleX, curVertice.y * uvScaleY) + center
};
vh.AddVert(uiVertex);
} triangleCount = curSegements * ;
for (int i = , vIdx = ; i < triangleCount - ; i += , vIdx++)
{
vh.AddTriangle(vIdx, , vIdx + );
}
if (fillPercent == )
{
//首尾顶点相连
vh.AddTriangle(verticeCount - , , );
}
}
}

将正中心的点作为图形顶点的起始点,按照逆时针或顺时针方向画三角形,最终再回到中心点,就形成了一个封闭的圆形

三角面的数量决定了圆形的圆滑程度,作为组件,我们可以将三角面的数量作为参数对外暴露

这个组件继承自UGUI的Image,所以也拥有Image的部分属性,事实上出于性能开销考虑,继承RawImage性价比会更高

但是RawImage有个一个问题,就是不兼容图集系统,也就是说,即使是打在图集中的图片,如果使用RawImage,内存会额外计算,综合考虑下,也只能这样了

unity探索者之UGUI圆形图片组件的更多相关文章

  1. unity探索者之UGUI图片描边

    版权声明:本文为原创文章,转载请声明https://www.cnblogs.com/unityExplorer/p/13524270.html 自从UGUI出现之后,我就已经放弃使用NGUI了,原因不 ...

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

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

  3. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  4. Unity关于一个UGUI优化效率的方法

    无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...

  5. [UGUI]圆形Image

    参考链接: http://www.cnblogs.com/leoin2012/p/6425089.html 前面说过Mask组件会影响性能:https://www.cnblogs.com/lyh916 ...

  6. Unity教程之-UGUI一个优化效率小技巧

    无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...

  7. 关于Unity中的UGUI优化,你可能遇到这些问题

    https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...

  8. Android 自定义圆形图片 CircleImageView

    1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...

  9. flutter 图片组件

    加入图片的几种方式 Image.asset:加载资源图片,就是加载项目资源目录中的图片,加入图片后会增大打包的包体体积,用的是相对路径. Image.network:网络资源图片,意思就是你需要加入一 ...

随机推荐

  1. Webpack前世今生

    在正式介绍Webpack之前,先给大家说明一下前端为什么需要模块化 1.为什么需要模块化 1.1JS原始功能 在网页开发的早期,js制作作为一种脚本语言,做一些简单的表单验证或动画实现等,那个时候代码 ...

  2. 001.Nginx简介

    一 Nginx概述 1.1 Nginx简介 Nginx是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在B ...

  3. Mybatis——Mapper解析

    Mapper的注册入口在Configuration的addMapper方法中,其会调用MapperRegistry的addMapper方法. Mapper的注册过程分为两个步骤: 1.创建Mapper ...

  4. springboot(九)文件上传

    在企业级项目开发过程中,上传文件是最常用到的功能.SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入.下面我们来创建一个SpringBoot项目完成单个. ...

  5. TCP通信---文件上传案例、多线程文件上传

    目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现. TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件 代码实 ...

  6. 让内层浮动的Div将外层Div撑开 -----清浮动

    清浮动的好处写多了都能体会到,解决高度塌陷, 一般情况下是要清除浮动的,不然会影响下面标签的排版. <div class="parent" style="width ...

  7. SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本

    1.项目基础 项目是基于Spring Boot2.x版本的 2.添加依赖 <!-- quartz依赖 --> <dependency> <groupId>org.s ...

  8. excel文件双击打开空白

    excel文件双击打开之后进入软件,没有去读文件 一.现象描述 打开现象如下所示,只有excel模板,看不到excel中的表格模板. 二.想要打开文件 (1)在软件的文件--->打开--> ...

  9. IPython magic命令

  10. Django学习路16_获取学生所在的班级名

    在 urls.py 中先导入getgrades from django.conf.urls import url from app5 import views urlpatterns = [ url( ...