制作圆形Image

思路

  1. 绘制圆 ,使用多个三角形组合在一起近似一个圆
  2. 单位圆上的点使用(Cosx,Sinx)表示
  3. sprite的uv映射到单位圆上

点到UV的映射规律

Sprite的外部uv 为 (x y z w ) 原点为 (x,y) 宽度为z-x 高度为w-y
单位圆上的点为(CosA,SinA)
uv坐标 = (x,y) + (CosA*(z-x)/2+(z-x)/2 ,SinA*(w-y)/2+(w-y)/2);
例如 圆上的点为(1,0) uv为(0,0.1,1)
对应的uv为 (0,0) + (1*(1-0)/2+(1-0)/2 ,0*(1-0)/2+(1-0)/2)=(1,0.5)

代码示例

using UnityEngine;
using UnityEngine.Sprites;
using UnityEngine.UI;
public class ImageCircle : Image
{protected override void OnPopulateMesh(VertexHelper toFill){toFill.Clear();//清除顶点Vector4 SpriteUV = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;Vector2 UVSize = new Vector2(SpriteUV.z - SpriteUV.x, SpriteUV.w - SpriteUV.y);//获取精灵uv 宽高Vector2 UVOrigion = new Vector2(SpriteUV.x, SpriteUV.y);//uv原点Vector2 UVHalfSize = UVSize / 2;Vector2 CenterUV = UVOrigion + UVHalfSize;Vector2 roundPoint = rectTransform.rect.center;//圆心toFill.AddVert(roundPoint, color, CenterUV);float width = rectTransform.rect.width;//image 矩形框的宽度float height = rectTransform.rect.height;float radius = width > height ? height / 2 : width / 2;//半径 取较小值int triangleCount = 100;//组成圆的三角形数量float singleAngle = 2 * Mathf.PI / triangleCount;//单个三角形顶点角度Vector2 pointInCircle;Vector2 pointToUV;float currentAngle;for (int i = 0; i < triangleCount + 1; i++)//获取圆上的点 圆上的点比三角形数量多1{currentAngle = i * singleAngle;//当前角度pointInCircle = new Vector2(Mathf.Cos(currentAngle), Mathf.Sin(currentAngle));//单位圆上的点pointToUV = UVOrigion +new Vector2(pointInCircle.x * UVHalfSize.x + UVHalfSize.x,pointInCircle.y * UVHalfSize.y + UVHalfSize.y);//点对应的uvtoFill.AddVert(roundPoint + pointInCircle * radius, color, pointToUV);}for (int i = 0; i < triangleCount; i++)//绘制三角形{toFill.AddTriangle(i + 1, 0, i + 2);}}private void OnDrawGizmos(){Gizmos.DrawCube(rectTransform.localPosition, Vector3.one);}
}

参考

Unity用OnPopulateMesh绘制自定义圆形遮罩超详解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile实践

文章目录 1、多阶段构建2、ADD 与 COPY 指令示例 3、CMD指令示例 4、ENTRYPOINT指令示例 5、build-arg6、target与cache-from7、onbuild 1、多阶段构建 制作docker镜像时&#xff0c;遵循越小越好&#xff0c;尽量剔除不需要的内容。比如编译环境&#xff0c;程序编译完成之后…

Docker—入门及Centos7安装

1、Docker入门 1.1、Docker是什么&#xff1f; Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship&#xff0c;and Run Any App,Anywhere”&#xff0c;也就是通过对应组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&…

docker环境搭建及其安装常用软件

centos安装docker Install Docker Engine on CentOS | Docker Docs 下载docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io…

JS如何上传视频后从视频截图到一张封面Cover?

文章目录 概要获取上传视频文件截图小结 概要 从上传视频文件中获取一张图片 获取上传视频文件截图 html片段&#xff0c;两个都是隐藏的 <!--自定义的上传视频标签--><input type"file" style"display: none" id"file" ref"uplo…

MongoDB本地部署并结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 4. 结语 前言 MongoDB是一个基于分布式文件…

TCP 三次握手 四次挥手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…

【前端基础--6】

对象 object // 定义一个obj来接收对象let obj {name: 咪咪,type: 布偶猫,like: [小鱼干, 猫条]}console.log(obj);// 取到obj里面name属性的值console.log(obj.name);// 使用大括号取值 括号内若不带引号&#xff0c;优先识别为变量console.log(obj[type]);// 通过等号进行…

【c语言】详解操作符(下)

前言&#xff1a; 在上文中&#xff0c;我们已经学习了 原码、反码、补码、移位 操作符、移位操作符、位操作符、逗号表达式、下标访问[ ]、函数调用&#xff08; &#xff09;&#xff0c;接下来我们将继续学习剩下的操作符。 1. 结构成员访问操作符 1.1 结构体成员的直接访…

台式电脑的ip地址在哪里找

在网络连接方面&#xff0c;IP地址是非常重要的信息&#xff0c;它是用于标识网络设备的唯一地址。对于台式电脑用户来说&#xff0c;了解自己设备的IP地址是非常有必要的&#xff0c;因为它可以帮助解决网络连接问题&#xff0c;进行远程访问和共享文件等功能。本文将指导读者…

深度学习知识

context阶段和generation阶段的不同 context阶段&#xff08;又称 Encoder&#xff09;主要对输入编码&#xff0c;产生 CacheKV(CacheKV 实际上记录的是 Transformer 中 Attention 模块中 Key 和 Value 的值&#xff09;&#xff0c;在计算完 logits 之后会接一个Sampling 采…

python脚本加密

在Python中&#xff0c;可以使用一些工具对脚本进行加密&#xff0c;以增加其安全性。以下是几种常用的加密方法&#xff1a; 使用PyInstaller或Py2exe将Python脚本转换为可执行文件&#xff1a; PyInstaller和Py2exe可以将Python脚本打包成一个独立的可执行文件。这样&#…

幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?

4核16G服务器是幻兽帕鲁Palworld推荐的配置&#xff0c;阿里云和腾讯云均推出针对幻兽帕鲁的4核16G服务器&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。云服务器吧yunfuwuqiba.com分享…

7.OpenResty系列之LuaRestyRedisLibrary

1. 连接需授权的redis server {location /redis1 {content_by_lua_block {local redis require "resty.redis"local red redis:new()-- 1秒red:set_timeout(1000) local ok, err red:connect("127.0.0.1", 6379)if not ok thenngx.say("failed to…

vue笔记(一):部署

首 文档 安装 1、安装nodejs&#xff08;链接&#xff09;&#xff0c;18.0以上版本。 2、在想要创建项目的目录下执行命令 npm create vuelatest 按提示创建项目&#xff0c;其中vue router是实现路由功能&#xff0c;pinia实现组件之间共享数据。如果项目需要两个功能建…

前端大厂面试题探索编辑部——第一期

目录 简介 题目 单选题 题解 A选项的Content-Security-Policy http-equiv属性 content属性 B选项的CSRF 使用CSRF Token 验证Referer和Origin头 C选项的HTTP Only D选项的防止SQL注入 输入验证和转义 简介 这个是一个长系列&#xff0c;我会以题目为导向&#xff…

LeetCode-题目整理【12】:N皇后问题--回溯算法

注意点&#xff0c;语法&#xff1a; 一定要记得初始化内层数组的长度&#xff1a;board[i] make([]rune, n)&#xff0c;否则就会报出现越界的错 // 第1步&#xff0c;初始化二维数组&#xff0c;内层数组长度为0&#xff0c;外层为nboard :make([][]rune,n)for i:0;i<n;i…

使用virtualenv管理python环境

Windows配置virtualenv 安装 pip install virtualenv virtualenvwrapper virtualenvwrapper-win设置WORK_HOME环境变量 在系统path变量中添加虚拟环境目录&#xff1a;键WORKON_HOMEC:dev\Envs 修改windows环境下mkvirtualenv.bat文件&#xff0c;配置虚拟环境根目录地址 配…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python进⾏网络监控?

如何使⽤Python进⾏⽹络监控&#xff1f; 使⽤Python进⾏⽹络监控可以帮助实时监视⽹络设备、流量和服务的状态&#xff0c;以便及时识别和解决问题。 以下是⼀般步骤&#xff0c;说明如何使⽤Python进⾏⽹络监控&#xff1a; 选择监控⼯具和库&#xff1a;选择适合⽹络监控需…

蓝桥杯省赛无忧 课件49 DFS-剪枝

01 数字王国之军训排队 02 特殊的三角形 03 特殊的多边形

优雅的python(二)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…