当前位置:   article > 正文

转载-UGUI中RawImage显示多边形或者圆形

rowimage生成圆
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class UICircle : RawImage
  6. {
  7. const int FILL_PERCENT = 100;
  8. float thickness = 5;
  9. [SerializeField][Range(4,360)]
  10. int _segments = 36;
  11. public int segments
  12. {
  13. get
  14. {
  15. return _segments;
  16. }
  17. set
  18. {
  19. if (_segments != value)
  20. {
  21. _segments = value;
  22. SetVerticesDirty();
  23. #if UNITY_EDITOR
  24. UnityEditor.EditorUtility.SetDirty(transform);
  25. #endif
  26. }
  27. }
  28. }
  29. protected override void OnRectTransformDimensionsChange()
  30. {
  31. base.OnRectTransformDimensionsChange();
  32. this.thickness = (float)Mathf.Clamp(this.thickness, 0, rectTransform.rect.width / 2);
  33. }
  34. protected override void OnPopulateMesh(VertexHelper vh)
  35. {
  36. float outer = -rectTransform.pivot.x * rectTransform.rect.width;
  37. float inner = -rectTransform.pivot.x * rectTransform.rect.width + this.thickness;
  38. vh.Clear();
  39. Vector2 prevX = Vector2.zero;
  40. Vector2 prevY = Vector2.zero;
  41. Vector2 uv0 = new Vector2(0, 0);
  42. Vector2 uv1 = new Vector2(0, 1);
  43. Vector2 uv2 = new Vector2(1, 1);
  44. Vector2 uv3 = new Vector2(1, 0);
  45. Vector2 pos0;
  46. Vector2 pos1;
  47. Vector2 pos2;
  48. Vector2 pos3;
  49. float tw = rectTransform.rect.width;
  50. float th = rectTransform.rect.height;
  51. float angleByStep = (FILL_PERCENT / 100f * (Mathf.PI * 2f)) / segments;
  52. float currentAngle = 0f;
  53. for (int i = 0; i < segments + 1; i++)
  54. {
  55. float c = Mathf.Cos(currentAngle);
  56. float s = Mathf.Sin(currentAngle);
  57. StepThroughPointsAndFill(outer, inner, ref prevX, ref prevY, out pos0, out pos1, out pos2, out pos3, c, s);
  58. uv0 = new Vector2(pos0.x / tw + 0.5f, pos0.y / th + 0.5f);
  59. uv1 = new Vector2(pos1.x / tw + 0.5f, pos1.y / th + 0.5f);
  60. uv2 = new Vector2(pos2.x / tw + 0.5f, pos2.y / th + 0.5f);
  61. uv3 = new Vector2(pos3.x / tw + 0.5f, pos3.y / th + 0.5f);
  62. vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
  63. currentAngle += angleByStep;
  64. }
  65. }
  66. private void StepThroughPointsAndFill(float outer, float inner, ref Vector2 prevX, ref Vector2 prevY, out Vector2 pos0, out Vector2 pos1, out Vector2 pos2, out Vector2 pos3, float c, float s)
  67. {
  68. pos0 = prevX;
  69. pos1 = new Vector2(outer * c, outer * s);
  70. pos2 = Vector2.zero;
  71. pos3 = Vector2.zero;
  72. prevX = pos1;
  73. prevY = pos2;
  74. }
  75. protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)
  76. {
  77. UIVertex[] vbo = new UIVertex[4];
  78. for (int i = 0; i < vertices.Length; i++)
  79. {
  80. var vert = UIVertex.simpleVert;
  81. vert.color = color;
  82. vert.position = vertices[i];
  83. vert.uv0 = uvs[i];
  84. vbo[i] = vert;
  85. }
  86. return vbo;
  87. }
  88. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using UnityEditor.UI;
  6. [CustomEditor(typeof(UICircle), true)]
  7. [CanEditMultipleObjects]
  8. public class UICircleInspector : RawImageEditor
  9. {
  10. public override void OnInspectorGUI()
  11. {
  12. base.OnInspectorGUI();
  13. UICircle circle = target as UICircle;
  14. circle.segments = Mathf.Clamp(EditorGUILayout.IntField("UICircle多边形", circle.segments), 4, 360);
  15. }
  16. }

 

转载于:https://my.oschina.net/u/3184885/blog/1975978

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

闽ICP备14008679号