之前那篇文章后,和同事又就这个问题讨论了一下,发现,其实不需要那么死心眼画n个三角形,因为图片本身除了圆以外的地方都是透明的, 画出来也没事。
这样的话, 其实可以把正方形的图片分成4个三角形,这样的话,最多也就画5个三角形就够了。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class TestProgressBar : MonoBehaviour
{   public float radius = 2;[Range(0,360)]//把角度限制在0-360public float startAngleDegree = 0;[Range(0,360)]//把角度限制在0-360public float angleDegree = 100;public int angleDegreePrecision = 1000;public int radiusPrecision = 1000;//与之前的代码相比, 已经不需要分割的三角形数了private MeshFilter meshFilter;private SectorMeshCreator creator = new SectorMeshCreator();[ExecuteInEditMode]private void Awake(){meshFilter = GetComponent<MeshFilter>();}private void Update(){meshFilter.mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision);}//在Scene界面画辅助线void OnDrawGizmos(){Gizmos.color = Color.gray;DrawMesh();}//在Scene界面画辅助线void OnDrawGizmosSelected(){Gizmos.color = Color.green;DrawMesh();}private void DrawMesh(){Mesh mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision);int[] tris = mesh.triangles;for (int i = 0; i < tris.Length; i += 3){Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 1]]));Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 2]]));Gizmos.DrawLine(convert2World(mesh.vertices[tris[i + 1]]), convert2World(mesh.vertices[tris[i + 2]]));}}private Vector3 convert2World(Vector3 src){return transform.TransformPoint(src);}private class SectorMeshCreator{private float radius;private float startAngleDegree;private float angleDegree;private Mesh cacheMesh;/// <summary>  /// 创建一个扇形Mesh  /// </summary>  /// <param name="radius">扇形半径</param>  /// <param name="startAngleDegree">扇形开始角度</param> /// <param name="angleDegree">扇形角度</param>  /// <param name="angleDegreePrecision">扇形角度精度(在满足精度范围内,认为是同个角度)</param>  /// <param name="radiusPrecision">  /// <pre>  /// 扇形半价精度(在满足半价精度范围内,被认为是同个半价)。  /// 比如:半价精度为1000,则:1.001和1.002不被认为是同个半径。因为放大1000倍之后不相等。  /// 如果半价精度设置为100,则1.001和1.002可认为是相等的。  /// </pre>  /// </param>  /// <returns></returns>  public Mesh CreateMesh(float radius, float startAngleDegree, float angleDegree, int angleDegreePrecision, int radiusPrecision){if (checkDiff(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision)){//参数有改变才需要重新画meshMesh newMesh = Create(radius, startAngleDegree, angleDegree);if (newMesh != null){cacheMesh = newMesh;this.radius = radius;this.startAngleDegree = startAngleDegree;this.angleDegree = angleDegree;}}return cacheMesh;}private Vector3 CalcPoint(float angle){//这个函数计算了非特殊角度射线在正方形上的点angle = angle % 360;if (angle == 0) {return new Vector3 (1, 0, 0);} else if (angle == 180) {return new Vector3(-1,0,0);}//这里分别对应这个射线处于上图哪个三角形中, 分别计算if (angle <= 45 || angle > 315) {return new Vector3(1,Mathf.Tan(Mathf.Deg2Rad*angle), 0);} else if (angle <= 135) {return new Vector3(1/Mathf.Tan(Mathf.Deg2Rad*angle), 1, 0);} else if (angle <= 225) {return new Vector3(-1, -Mathf.Tan(Mathf.Deg2Rad*angle), 0);} else {return new Vector3(-1/Mathf.Tan(Mathf.Deg2Rad*angle), -1, 0);}}private Mesh Create(float radius, float startAngleDegree, float angleDegree){if (startAngleDegree == 360) {startAngleDegree = 0;}Mesh mesh = new Mesh();List<Vector3> calcVertices = new List<Vector3> ();calcVertices.Add (Vector3.zero);//第一个点是圆心点calcVertices.Add (CalcPoint (startAngleDegree));//第二个点是起始角度对应的点float [] specialAngle = new float[]{45, 135, 225, 315};//上图正方形4个顶点对应的角度和点Vector3 [] specialPoint = new Vector3[] {new Vector3(1,1,0), new Vector3(-1,1,0), new Vector3(-1,-1,0),new Vector3(1,-1,0)};//计算正方形四个点是不是在要画的扇形范围内, 如果是, 则是要画出来的顶点for (int i = 0; i < specialAngle.Length; ++i) {if(startAngleDegree < specialAngle[i] && specialAngle[i] - startAngleDegree < angleDegree){calcVertices.Add(specialPoint[i]);}}//这里为什么要第二个for循环? 扇形的角度+起始角度就可能超过360, 所以要计算到720for (int i = 0; i < specialAngle.Length; ++i) {if(startAngleDegree < specialAngle[i]+360 && specialAngle[i]+360 - startAngleDegree < angleDegree){calcVertices.Add(specialPoint[i]);}}calcVertices.Add (CalcPoint (startAngleDegree + angleDegree));Vector3[] vertices = new Vector3[calcVertices.Count];//uv是网格上的点对应到纹理上的某个位置的像素, 纹理是一张图片, 所以是二维Vector2[] uvs = new Vector2[vertices.Length];for (int i = 0; i < vertices.Length; ++i) {//之前是按半径为单位长度1计算的顶点, 实际顶点是要算上实际半径vertices[i] = calcVertices[i]*radius;//纹理的半径就是0.5, 圆心在0.5f, 0.5f的位置uvs[i] = new Vector2(calcVertices[i].x*0.5f+0.5f,calcVertices[i].y*0.5f+0.5f);}int[] triangles = new int[(vertices.Length-2)*3];for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++){//每个三角形都是由圆心点+两个相邻弧度上的点构成的triangles[i] = 0;triangles[i + 2] = vi;triangles[i + 1] = vi + 1;}           mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;return mesh;}private bool checkDiff(float radius, float startAngleDegree, float angleDegree, int angleDegreePrecision, int radiusPrecision){return (int)(startAngleDegree - this.startAngleDegree) != 0 || (int)((angleDegree - this.angleDegree) * angleDegreePrecision) != 0 ||(int)((radius - this.radius) * radiusPrecision) != 0;}}
}

最终效果:

[Unity]利用Mesh在Unity中绘制扇形图片2相关推荐

  1. [Unity]利用Mesh在Unity中绘制扇形图片

    背景 最近碰到个功能, 要画一个扇形图案, 如下图: 美术原图: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同. So, NGUI和UGUI很好用的FilledType是用不 ...

  2. Unity 利用Mesh在Unity中绘制扇形图片

    直接上脚本,挂空物体上就行: using UnityEngine; using System.Collections; using System.Collections.Generic; [Requi ...

  3. 利用VBA将excel中链接转换为图片形式存放在指定的单元格中

    利用VBA将excel中链接转换为图片形式存放在指定的单元格中 VBA代码如下 Private Declare Function URLDownloadToFile Lib "urlmon& ...

  4. caxa齿轮零件图_利用CAXA在CATIA中绘制渐开线齿轮

    渐开线齿轮作为机械传动中的重要零部件,在机械结构中广泛应用,而渐开线齿轮的绘制却是机械制图中的难点.二维软件一般可以通过参数模块进行渐开线绘制,而目前的三维软件却很难进行渐开线的精确绘制.在不要求齿轮 ...

  5. java利用POI在word中绘制折线图

    1.poi的简介 Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD ...

  6. [Unity][UGUI]绘制扇形图形

    绘制扇形图形 的资料 参考资料 1,2 都比较完整 想到一种 使用 UGUI 创建 扇形 的方法 相关资料: 1. [Unity&特效]怎么画圆范围circle range技能指示器skill ...

  7. Qt自定义委托在QTableView中绘制控件、图片、文字

    自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...

  8. 【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布中绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

    文章目录 一.鼠标滚轮缩放的中心点设置为当前鼠标中心点 - 要点分析 1.保存当前鼠标指针指向的位置 2.根据鼠标指针指向的位置以及比例重新计算图片位置 二.绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩 ...

  9. Unity 在代码中利用Mesh实时生成圆环/空心圆柱

    本篇文章主要介绍了利用Unity中的mesh 实时生成圆环的过程以及思想,我会在开头直接放出源码.如若有任何疑问,可向后继续观看详细解说~~~ (PSPSPS:Mesh生成的顺序,方式等有很多,当前代 ...

最新文章

  1. Android自定义View:ViewGroup(三)
  2. css好用吗,比较好用的 CSS 的技巧,总有一个你需要的!
  3. App架构设计经验谈:展示层的设计
  4. python如何输入多组数据_Python 中如何实现多组的输入输出
  5. 【转】为什么博士叫PhD?
  6. eclipse init 配置
  7. 使用git新增分支以及初始化分支等等一些列操作实战
  8. 20200331:每日温度(leetcode739)
  9. Spring Setting
  10. cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
  11. centos安装 mysql_centos下安装MySQL数据库
  12. 初学windows程序设计
  13. R | package基础 | Rstudio + devtools 创建/开发R包(初学者 指南| 简明详细流程)
  14. Mac 生成ico图标
  15. 沧海云帆服务器哪里的,天涯明月刀沧海云帆9月合服_天刀沧海云帆大区9月合服公告_3DM网游...
  16. 北欧计算机专业出国,留学北欧,哪个国家计算机专业比较好?
  17. Unity 2018之ShaderGraph使用基础
  18. https://github.com/Wechat-Group/WxJava 使用记录
  19. Etyma01 ced ceed cess
  20. 【19保研】保研预报名招生信息汇总!

热门文章

  1. 数字PCR简介(一)
  2. 干货!史上最全Java进阶好书清单来了!
  3. 如何从CentOS官网下载我们想要的版本
  4. 【佩服】超萌女娃穿尿裤扭臀热舞
  5. 2020第二届长安杯
  6. 现货黄金有什么需要注意的?
  7. Linux之创建组名和删除组名
  8. 让QQ的文字漂亮起来
  9. qmake 添加额外参数 分开编译
  10. 360 一个让人又爱又恨的公司