Unity UGUI学习系列(一)

您所在的位置:网站首页 上面一个桃子头像 Unity UGUI学习系列(一)

Unity UGUI学习系列(一)

2024-07-12 10:02:04| 来源: 网络整理| 查看: 265

本系列文章是学习siki学院UGUI整体解决方案-案例篇笔记 GitHub地址:https://github.com/BlueMonk1107/UGUISolution

本文介绍两种实现圆形图片的方法,效果如下:

17787668-023d2cf37e407c40.png 一.image mask实现

准备好要显示的图片以及一张圆形图片

17787668-64e4f87b8ca04fcc.png 17787668-3d807737dea4c55b.png

创建两个image,结构如下:

17787668-178efa99a4e68f9b.png

上面一个image的sprite图片设置成圆形图片,并加上mask组件 :

17787668-6ff3d94aedf4de6a.png

下面图片的sprite设置为要显示的图片即可

采用这种方式也可以实现其他形状的图片

二.继承image实现

代码如下 :

public class CircleImage : Image { /// /// 圆形由多少块三角形拼成 /// [SerializeField] public int segements = 100; //显示部分占圆形的百分比. [SerializeField] public float showPercent = 1; public readonly Color32 GRAY_COLOR = new Color32(60, 60, 60, 255); public List _vertexList; protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); _vertexList = new List(); AddVertex(vh, segements); AddTriangle(vh, segements); } private void AddVertex(VertexHelper vh, int segements) { float width = rectTransform.rect.width; float heigth = rectTransform.rect.height; int realSegments = (int)(segements * showPercent); Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero; float uvWidth = uv.z - uv.x; float uvHeight = uv.w - uv.y; Vector2 uvCenter = new Vector2(uvWidth * 0.5f, uvHeight * 0.5f); Vector2 convertRatio = new Vector2(uvWidth / width, uvHeight / heigth); float radian = (2 * Mathf.PI) / segements; float radius = width * 0.5f; Vector2 originPos = new Vector2((0.5f - rectTransform.pivot.x) * width, (0.5f - rectTransform.pivot.y) * heigth); Vector2 vertPos = Vector2.zero; Color32 colorTemp = GetOriginColor(); UIVertex origin = GetUIVertex(colorTemp, originPos, vertPos, uvCenter, convertRatio); vh.AddVert(origin); int vertexCount = realSegments + 1; float curRadian = 0; Vector2 posTermp = Vector2.zero; for (int i = 0; i < segements + 1; i++) { float x = Mathf.Cos(curRadian) * radius; float y = Mathf.Sin(curRadian) * radius; curRadian += radian; if (i < vertexCount) { colorTemp = color; } else { colorTemp = GRAY_COLOR; } posTermp = new Vector2(x, y); UIVertex vertexTemp = GetUIVertex(colorTemp, posTermp + originPos, posTermp, uvCenter, convertRatio); vh.AddVert(vertexTemp); _vertexList.Add(posTermp + originPos); } } private Color32 GetOriginColor() { Color32 colorTemp = (Color.white - GRAY_COLOR) * showPercent; return new Color32( (byte) (GRAY_COLOR.r + colorTemp.r), (byte) (GRAY_COLOR.g + colorTemp.g), (byte) (GRAY_COLOR.b + colorTemp.b), 255); } private void AddTriangle(VertexHelper vh, int realSegements) { int id = 1; for (int i = 0; i < realSegements; i++) { vh.AddTriangle(id, 0, id + 1); id++; } } private UIVertex GetUIVertex(Color32 col, Vector3 pos, Vector2 uvPos, Vector2 uvCenter, Vector2 uvScale) { UIVertex vertexTemp = new UIVertex(); vertexTemp.color = col; vertexTemp.position = pos; vertexTemp.uv0 = new Vector2(uvPos.x * uvScale.x + uvCenter.x, uvPos.y * uvScale.y + uvCenter.y); return vertexTemp; } public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) { Vector2 localPoint; RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, eventCamera, out localPoint); return IsValid(localPoint); } private bool IsValid(Vector2 localPoint) { return GetCrossPointNum(localPoint, _vertexList) %2 == 1; } private int GetCrossPointNum(Vector2 localPoint, List vertexList) { int count = 0; Vector3 vert1 = Vector3.zero; Vector3 vert2 = Vector3.zero; int vertCount = vertexList.Count; for (int i = 0; i < vertCount; i++) { vert1 = vertexList[i]; vert2 = vertexList[(i + 1)% vertCount]; if (IsYInRang(localPoint, vert1, vert2)) { if (localPoint.x < GetX(vert1, vert2, localPoint.y)) { count++; } } } return count; } private bool IsYInRang(Vector2 localPoint, Vector3 vert1, Vector3 vert2) { if (vert1.y > vert2.y) { return localPoint.y < vert1.y && localPoint.y > vert2.y; } else { return localPoint.y < vert2.y && localPoint.y > vert1.y; } } private float GetX(Vector3 vert1, Vector3 vert2, float y) { float k = (vert1.y - vert2.y)/(vert1.x - vert2.x); return vert1.x + (y - vert1.y)/k; } }

新建一个image,移除上面的image组件,添加CircleImage脚本即可



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭