当前位置:   article > 正文

Unity利用UGUI绘制多边形实现属性图_unity ugui绘制四边形

unity ugui绘制四边形

游戏开发中,角色具备有多种属性,一般呈现成一个如下图的多边形属性图。

一、效果图

二、展示效果

可以调整边数,调整每个点的数值。

三、实现原理

查看UGUI的代码可以得知,绘制ui图的方法其实是绘制mesh,然后对其进行填充。正常一个Image图片,绘制有四个顶点。

为了实现多边形,继承于MaskableGraphic,重写OnPopulateMesh,重新绘制顶点。

四、放上代码

  1. //多边形绘制
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. public class MyUIPolygon : MaskableGraphic
  5. {
  6. public bool fill = true;
  7. public float thickness = 5;
  8. [Range(3, 360)]
  9. public int sides = 3;
  10. [Range(0, 360)]
  11. public float rotation = 0;
  12. [Range(0, 1)]
  13. public float[] VerticesDistances = new float[3];
  14. private float size = 0;
  15. public void DrawPolygon(int _sides)
  16. {
  17. sides = _sides;
  18. VerticesDistances = new float[_sides + 1];
  19. for (int i = 0; i < _sides; i++) VerticesDistances[i] = 1; ;
  20. rotation = 0;
  21. }
  22. public void DrawPolygon(int _sides, float[] _VerticesDistances)
  23. {
  24. sides = _sides;
  25. VerticesDistances = _VerticesDistances;
  26. rotation = 0;
  27. }
  28. public void DrawPolygon(int _sides, float[] _VerticesDistances, float _rotation)
  29. {
  30. sides = _sides;
  31. VerticesDistances = _VerticesDistances;
  32. rotation = _rotation;
  33. }
  34. void Update()
  35. {
  36. size = rectTransform.rect.width;
  37. if (rectTransform.rect.width > rectTransform.rect.height)
  38. size = rectTransform.rect.height;
  39. else
  40. size = rectTransform.rect.width;
  41. thickness = (float)Mathf.Clamp(thickness, 0, size / 2);
  42. }
  43. protected override void OnPopulateMesh(VertexHelper vh)
  44. {
  45. vh.Clear();
  46. Vector2 prevX = Vector2.zero;
  47. Vector2 prevY = Vector2.zero;
  48. Vector2 uv0 = new Vector2(0, 0);
  49. Vector2 uv1 = new Vector2(0, 1);
  50. Vector2 uv2 = new Vector2(1, 1);
  51. Vector2 uv3 = new Vector2(1, 0);
  52. Vector2 pos0;
  53. Vector2 pos1;
  54. Vector2 pos2;
  55. Vector2 pos3;
  56. float degrees = 360f / sides;
  57. int vertices = sides + 1;
  58. if (VerticesDistances.Length != vertices)
  59. {
  60. VerticesDistances = new float[vertices];
  61. for (int i = 0; i < vertices - 1; i++) VerticesDistances[i] = 1;
  62. }
  63. // last vertex is also the first!
  64. VerticesDistances[vertices - 1] = VerticesDistances[0];
  65. for (int i = 0; i < vertices; i++)
  66. {
  67. float outer = -rectTransform.pivot.x * size * VerticesDistances[i];
  68. float inner = -rectTransform.pivot.x * size * VerticesDistances[i] + thickness;
  69. float rad = Mathf.Deg2Rad * (i * degrees + rotation);
  70. float c = Mathf.Cos(rad);
  71. float s = Mathf.Sin(rad);
  72. uv0 = new Vector2(0, 1);
  73. uv1 = new Vector2(1, 1);
  74. uv2 = new Vector2(1, 0);
  75. uv3 = new Vector2(0, 0);
  76. pos0 = prevX;
  77. pos1 = new Vector2(outer * c, outer * s);
  78. if (fill)
  79. {
  80. pos2 = Vector2.zero;
  81. pos3 = Vector2.zero;
  82. }
  83. else
  84. {
  85. pos2 = new Vector2(inner * c, inner * s);
  86. pos3 = prevY;
  87. }
  88. prevX = pos1;
  89. prevY = pos2;
  90. SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 });
  91. vh.AddUIVertexQuad(vbo);
  92. }
  93. }
  94. private UIVertex[] vbo = new UIVertex[4];
  95. private void SetVbo(Vector2[] vertices, Vector2[] uvs)
  96. {
  97. for (int i = 0; i < vertices.Length; i++)
  98. {
  99. var vert = UIVertex.simpleVert;
  100. vert.color = color;
  101. vert.position = vertices[i];
  102. vert.uv0 = uvs[i];
  103. vbo[i] = vert;
  104. }
  105. }
  106. }

代码来自UnityUIExtensions,做了一些修改,不依赖其他扩展基类脚本,里面还有其他比较实用的UI扩展代码,以后会逐一介绍。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/881865
推荐阅读
相关标签
  

闽ICP备14008679号