生成圆形Image

目标任务:实现一个圆形面片的Image,实现效果如下:

为什么要实现这个东西呢,其实原先在做这种圆形效果的时候都是在用Mask实现的(相信很多都是这样的~(罒ω罒)),但是最近了解了下优化方面的知识,发现Mask还是很占用DrawCall的,所以本着精益求精的 态度,学习了下怎么自己做一个圆形的Image。

 

这里可能先要了解一下Image是怎么渲染出来的,具体的我就不说了,就说个简单的,我们生成一个Cube,我们可以看到他的网格是由很多三角形拼起来的,而其中每一个三角形是由三个顶点组成的,我们要做的其实就是生成多个这样的三角形来组成一个圆形(这里还要说下这样的三角形面片的正反面,在我们设置顶点的时候,顶点输入顺序是应该按照顺时针输入的,这样我们才会看见生成的面,不然会变成透明的样子,不信可以试下~~~)。

 

代码如下

using UnityEngine;
using UnityEngine.Sprites;
using UnityEngine.UI;public class CircleImage : Image {private int segements;//圆形由多少个三角形拼成protected override void OnPopulateMesh(VertexHelper vh){segements = 100;vh.Clear();//图片宽高float width = rectTransform.rect.width;float height = rectTransform.rect.height;Vector4 uv = overrideSprite != null ?       DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;//uv宽高float uvWidth = (uv.z - uv.x) * 0.5f;float uvHeight = (uv.w - uv.y) * 0.5f;//贴图的中心点Vector2 uvCenter = new Vector2(uvWidth, uvHeight);//uv转Pos坐标转换系数(不懂得可以试下让UVで宽高乘以零点几)Vector2 converRatio = new Vector2(uvWidth/width,uvHeight/height);//求每一个三角形的弧度  公式:2π/个数float radian = (2 * Mathf.PI) / segements;//设置半径float radius = width * 0.5f;UIVertex origin = new UIVertex();origin.color = color;origin.position = Vector3.zero;//获取到当前原点的UV坐标origin.uv0 = new Vector2(origin.position.x * converRatio.x+uvCenter.x, origin.position.y * converRatio.y+uvCenter.y);//添加顶点信息vh.AddVert(origin);//顶点数量int vertexCount = segements + 1;//当前弧度float curRadian = 0;for (int i = 0; i < vertexCount; i++){float x = Mathf.Cos(curRadian) * radius;float y = Mathf.Sin(curRadian) * radius;curRadian += radian;//生成顶点UIVertex vertexTemp = new UIVertex();vertexTemp.color = color;vertexTemp.position = new Vector2(x,y);vertexTemp.uv0 = new Vector2(vertexTemp.position.x * converRatio.x+uvCenter.x, vertexTemp.position.y * converRatio.y+uvCenter.y);vh.AddVert(vertexTemp);}//生成面片int id = 1;for (int i = 0; i < segements; i++){//id从1开始递增,设置三角形vh.AddTriangle(id,0,id+1);id++;}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382478.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

圆形图形logo案例2

注意共有3个步骤&#xff0c;按顺序操作下去 1.用矩形绘画两个圆&#xff0c;然后使用路径查找器分割. 2.绘制长方形&#xff0c;把所有长方形使用路径查找器、联集 3.用这些长方形与两个圆相交的部分进行分割&#xff0c;然后取消分组&#xff0c;把多余的地方去掉&#xff0…

html5绘制圆形,Canvas绘制圆形

使用canvas绘制圆形步骤: 1、在页面中创建canvas的节点(相当于创建一个画板)&#xff0c;设置CSS样式。(注意&#xff1a;要在行内样式中设置canvas的宽高。) 2、在JS中获取节点&#xff0c;并获取画板(绘画环境)、设置画笔颜色。 var canvasdocument.getElementById(canvas); …

圆形图形logo案例3

注意共有3个步骤&#xff0c;按顺序操作下去 1.用矩形工具绘制基础图形. 2.绘制LOGO中间的图形&#xff0c;用路径查找器的“减去顶层”功能. 3.绘制圆形路径&#xff0c;用描点工具剪裁路径&#xff0c;然后在路径上写上字母&#xff0c;完成. 这就是我简单快速的方法&#…

java圆形矩形直线文字设计图_如何设计圆形文字logo?怎么让文字按圆形走?圆形文字logo...

美好的周末说过去一下子就过去了呢~今天又迎来了更加美好的周一哇&#xff0c;哈哈哈。好啦废话不多说&#xff0c;还是来看看今天的教程方案吧&#xff01;圆形文字logo是什么意思呢&#xff1f;不知道大家有没有看到过那种圆形的标志&#xff0c;比如小编大学时候&#xff0c…

圆形图形logo案例

注意共有2个步骤&#xff0c;按顺序操作下去 1.先用图形矩形绘制轮廓&#xff0c;最上面画一个椭圆形&#xff0c;ctrlc复制&#xff0c;ctrlf原地粘贴 2&#xff0c;两个描边图层一起进行效果&#xff0c;从上面开始做起&#xff0c;第一个两个图形选中后使用减去后方对使用的…

设计模式之简单工厂模式

一、概述 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。 简单工厂模式&#xff1a;又叫做静态工厂方法模式&#xff0c;是由一个工厂对象决定创建出哪一种产品类的实例。 二、适用性 1.当一个类不知道它所…

【LeetCode 75】第二十六题(394)字符串解码

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们字符串&#xff0c;让我们解码&#xff0c;那么该怎么解码呢&#xff0c;被括号【】包裹起来的字符串需要扩展成括号左边第…

2023最新python学习方法总结!(内部机密)

不要再问我python好不好学了 我之前做过半年少儿编程老师&#xff0c;一个小学四年级的小孩子都能在我的教学下独立完成python游戏&#xff0c;植物大战僵尸简单版&#xff0c;如果要肯花时间&#xff0c;接下来的网络开发也不是问题&#xff0c;人工智能也可以学个调包也没啥问…

【Python机器学习】实验10 支持向量机

文章目录 支持向量机实例1 线性可分的支持向量机1.1 数据读取1.2 准备训练数据1.3 实例化线性支持向量机1.4 可视化分析 实例2 核支持向量机2.1 读取数据集2.2 定义高斯核函数2.3 创建非线性的支持向量机2.4 可视化样本类别 实例3 如何选择最优的C和gamma3.1 读取数据3.2 利用数…

MySQL出现(2003)错误的解决方法(三种思路)

MYSQL的2003错误代码是:"cant connection to mysql server on ‘IP’" 意思为:"无法连接到“IP”上的 mysql 服务器". 我下列描述的问题中,第一种和第三种是以虚拟机连接MYSQL的2003方法; 而第二种是用的typora-setup-x64在本机中使用构建MYSQL服务的方…

Java集合框架面试题总结及解析

文章目录 说出 collection 的常用子接口&#xff1f;说出 3 个以上的常 用方法&#xff1f;都有什么作用&#xff1f;如果向 TreeSet 中加入类对象&#xff0c;需要做什么&#xff1f;Set 里的元素是不能重复的&#xff0c;那么用什么方法来区分重复与否呢? 是用还是 equals()…

【2022最新Java面试宝典】—— Java集合面试题(52道含答案)

目录 一、集合容器概述1. 什么是集合2. 集合的特点3. 集合和数组的区别4. 使用集合框架的好处5. 常用的集合类有哪些&#xff1f;6. List&#xff0c;Set&#xff0c;Map三者的区别&#xff1f;7. 集合框架底层数据结构8. 哪些集合类是线程安全的&#xff1f;9. Java集合的快速…

关于集合的面试题

一、集合与数组 数组&#xff08;可以存储基本数据类型&#xff09;是用来存现对象的一种容器&#xff0c;但是数组的长度固定&#xff0c;不适合在对象数量未知的情况下使用。 集合&#xff08;只能存储对象&#xff0c;对象类型可以不一样&#xff09;的长度可变&#xff0…

Java 集合面试题小结(1)

1. 集合和数组的区别 数组是固定长度的&#xff1b;集合可变长度的。数组可以存储基本数据类型&#xff0c;也可以存储引用数据类型&#xff1b;集合只能存储引用数据类型。数组存储的元素必须是同一个数据类型&#xff1b;集合存储的对象可以是不同数据类型。 2. 使用集合框…

Java 集合 相关面试题

1、说说 List, Set, Queue, Map 四者的区别&#xff1f; ⚫ List(对付顺序的好帮手): 存储的元素是有序的、可重复的。 ⚫ Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。 ⚫ Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序&#xff0c;存储…

Java集合面试题汇总大全

每个集合的出现一定是为了解决某种问题的解决方案。 集合流程图 JAVA中集合和数组的区别Collection和Collections的区别ArrayList和LinkedList 和Vector的区别list/set/map的区别HashSet和TreeSet和LinkedHashSet区别HashMap和Hashtable的比较HashMap和ConcurrentHashMap区别H…

50道Java集合经典面试题(收藏版)

前言 来了来了&#xff0c;50道Java集合面试题也来啦~ 已经上传github: https://github.com/whx123/JavaHome 1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。随机访问的时候…

Java——12个关于Java中集合的面试题

文章目录&#xff1a; 1.请问 ArrayList、HashSet、HashMap 是线程安全的吗&#xff1f;如果不是怎么获取线程安全的集合&#xff1f; 2.ArrayList内部用什么实现的&#xff1f; 2.1 无参构造源码分析 2.2 有参构造源码分析&#xff08;参数为容量&#xff09; 2.3 有参构…

Java面试题总结 - Java集合篇(附答案)

目录 一、Java 容器都有哪些&#xff1f; 二、Collection 和 Collections 有什么区别&#xff1f; 三、list与Set区别 四、HashMap 和 Hashtable 有什么区别&#xff1f; 五、说一下 HashMap 的实现原理&#xff1f; 六、set有哪些实现类&#xff1f; 七、说一下 HashSet…

【面试】Java集合面试题

文章目录 集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些&#xff1f;List&#xff0c;Set&#xff0c;Map三者的区别&#xff1f;集合框架底层数据结构哪些集合类是线程安全的&#xff1f;Java集合的快速失败机制 “fail-fast”&…