一、圆形图片系列

编程入门 行业动态 更新时间:2024-10-21 19:27:48

一、<a href=https://www.elefans.com/category/jswz/34/1769013.html style=圆形图片系列"/>

一、圆形图片系列

1、为什么要实现圆形图片

实现理由: mask遮罩实现以及shader实现都会打断合批 增加dc

实现思路:继承Image组件重写OnPopulateMesh方法自己控制顶点及面片规则

2、圆形图片的CD功能实现

实现思路:考虑直接在一张圆形图片改变颜色并不符合实际美术需求效果 所以需要两张圆形图片 一张原图 一张灰色遮罩 灰色遮罩顶点及三角形面片数量乘以一个0到1的float值来控制整个灰色圆形图片的顺时针显隐 

3、不规则图片的精准点击

实现理由:alphaHitTestMinimumThreshold的图片必须开读写 增加一倍内存同时不方便打进图集

实现思路:(1)PolygonCollider2D组件 方法PolygonCollider2D.OverlapPoint判断点击范围

                   (2)重写IsRaycastLocationValid多边形碰撞算法实现

   由于寻找及实现一个可靠的检测碰撞算法不是很容易 所以这里用第一张比较方便的方法

附代码:

public class CircleImage : Image
{[HideInInspector]public int segmements = 100;[HideInInspector]public float fillPercent = 1;private PolygonCollider2D polygonCollider2D;public PolygonCollider2D PolygonCollider2D {get {if (polygonCollider2D==null){polygonCollider2D = GetComponent<PolygonCollider2D>();}return polygonCollider2D;}}protected override void OnPopulateMesh(VertexHelper vh){vh.Clear();Vector2[] uvs = overrideSprite.uv; //SpriteUtility.GetSpriteUVs(overrideSprite, false);float minX = 10000, minY = 10000, maxX = -10000, maxY = -10000;for (int i = 0; i < uvs.Length; i++){Vector2 uv = uvs[i];minX = Mathf.Min(minX, uv.x);maxX = Mathf.Max(maxX, uv.x);minY = Mathf.Min(minY, uv.y);maxY = Mathf.Max(maxY, uv.y);}float uvCenterX = (minX + maxX) * 0.5f;float uvCenterY = (minY + maxY) * 0.5f;float uvScaleX = (maxX - minX) / rectTransform.rect.width;float uvScaleY = (maxY - minY) / rectTransform.rect.height;float radian = 2 * Mathf.PI / segmements;float widthRadian = rectTransform.rect.width * 0.5f;float heightRadian = rectTransform.rect.height * 0.5f;UIVertex origin = new UIVertex();origin.color = color;origin.position = Vector2.zero - new Vector2((rectTransform.pivot.x - 0.5f) * rectTransform.rect.width, (rectTransform.pivot.y - 0.5f) * rectTransform.rect.height);origin.uv0 = new Vector2(uvCenterX, uvCenterY);vh.AddVert(origin);int realSegmement = (int)(segmements * fillPercent);int vertexCount = realSegmement + 1;float currRadian = 0;for (int i = 0; i < vertexCount; i++){float x = Mathf.Cos(currRadian) * widthRadian;float y = Mathf.Sin(currRadian) * heightRadian;UIVertex vertexTemp = new UIVertex();vertexTemp.color = color;var uv_x = x * uvScaleX + uvCenterX;var uv_y = y * uvScaleY + uvCenterY;vertexTemp.position = new Vector2(origin.position.x + x, origin.position.y + y);vertexTemp.uv0 = new Vector2(uv_x, uv_y);vh.AddVert(vertexTemp);currRadian += radian;}for (int i = 0; i < vertexCount; i++){vh.AddTriangle(i, 0, i + 1);}}public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera){Vector3 point;RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, screenPoint, eventCamera, out point);return PolygonCollider2D.OverlapPoint(point);}
}

更多推荐

一、圆形图片系列

本文发布于:2023-07-01 05:29:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/971391.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:圆形   系列   图片

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!