Line.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. namespace LineUI
  5. {
  6. // 定义 ArrowInfo 类
  7. public class ArrowInfo
  8. {
  9. public Vector2 Position { get; set; }
  10. public Vector2 Direction { get; set; }
  11. public ArrowInfo(Vector2 position, Vector2 direction)
  12. {
  13. Position = position;
  14. Direction = direction;
  15. }
  16. }
  17. [RequireComponent(typeof(CanvasRenderer))]
  18. [RequireComponent(typeof(RectTransform))]
  19. public class Line : Graphic
  20. {
  21. [Header("绘制线段")]
  22. [SerializeField] private bool loop = false;
  23. [SerializeField] private float thickness = 1f;
  24. [SerializeField] private int roundCount = 0;
  25. [SerializeField] private List<Vector2> screenPositions = new List<Vector2>();
  26. //获取当前的points
  27. [HideInInspector]
  28. public List<Vector2> ScreenPositions => screenPositions;
  29. [Header("顶点圆形绘制")]
  30. [SerializeField] private bool bDrawVertexCircle = false;
  31. [SerializeField] private float vertexCircleRadius = 20f;
  32. [SerializeField] private Color vertexCircleColor = Color.white;
  33. [SerializeField] private int vertexCircleSegments = 40;
  34. [Header("绘制内四边形")]
  35. //是否绘制内四边形
  36. [SerializeField] bool bDrawQuad = true;
  37. [SerializeField] private Vector2 quadrilateralSize = new Vector2(100, 100);
  38. [SerializeField] private Color quadColor = Color.red;
  39. [Header("绘制外围蒙板")]
  40. //是否绘制外围蒙板
  41. [SerializeField] bool bDrawMask = false;
  42. [SerializeField] private Color maskColor = Color.red;
  43. //控制扇形角绘制
  44. [Header("扇形角绘制")]
  45. [SerializeField] private bool bDrawFan = false;
  46. [SerializeField] private Color fanColor = Color.white;
  47. [SerializeField] private int fanSegments = 20; // 扇形的平滑度
  48. [SerializeField] private float fanOuterRadius = 150f; // 扇形的半径
  49. private float fanInnerRadius = 0f;
  50. [Tooltip("扇形指向箭头")]
  51. [SerializeField] private bool bDrawArrow = false;
  52. [SerializeField] private Color arrowColor = Color.white;
  53. [SerializeField] float arrowLength = 50f;
  54. [SerializeField] float arrowWidth = 50f;
  55. [SerializeField] float arrowHeadHeight = 30f;
  56. [SerializeField] float arrowDis = 100f;
  57. private List<ArrowInfo> arrowInfos = new List<ArrowInfo>();
  58. //获取当前的points
  59. [HideInInspector]
  60. public List<ArrowInfo> ArrowInfos => arrowInfos;
  61. //[SerializeField] private Color quadTextColor = Color.black;
  62. //[SerializeField] private int quadFontSize = 14;
  63. //private List<Vector2> quadsToDraw = new List<Vector2>();
  64. //private List<string> quadTextToDraw = new List<string>();
  65. //private List<GameObject> quadObjects = new List<GameObject>();
  66. //private Stack<GameObject> objectPool = new Stack<GameObject>();
  67. [Tooltip("抗锯齿处理部分")]
  68. [SerializeField, Range(0f, 5f)]
  69. private float antiAliasValue = 2f; // 抗锯齿羽化宽度
  70. private const int ObjectPoolLimit = 4;
  71. public RectTransform RectTr => rectTransform;
  72. public float MyThickness
  73. {
  74. get => thickness;
  75. set
  76. {
  77. if (value >= 1)
  78. {
  79. thickness = value;
  80. }
  81. }
  82. }
  83. public float MyFanWidth
  84. {
  85. get => fanOuterRadius;
  86. set
  87. {
  88. if (value >= 1)
  89. {
  90. fanOuterRadius = value;
  91. }
  92. }
  93. }
  94. public void SetLine(List<Vector2> screenPositions)
  95. {
  96. this.screenPositions = screenPositions;
  97. SetVerticesDirty();
  98. }
  99. public void SetDrawQuad(bool value) {
  100. bDrawQuad = value;
  101. SetVerticesDirty();
  102. }
  103. public void SetDrawMask(bool value)
  104. {
  105. bDrawMask = value;
  106. SetVerticesDirty();
  107. }
  108. public void SetDrawFan(bool value)
  109. {
  110. bDrawFan = value;
  111. SetVerticesDirty();
  112. }
  113. protected override void OnPopulateMesh(VertexHelper vh)
  114. {
  115. vh.Clear();
  116. arrowInfos.Clear();
  117. //quadsToDraw.Clear();
  118. //quadTextToDraw.Clear();
  119. if (screenPositions.Count < 2)
  120. return;
  121. SetLineVertices(vh);
  122. SetLineTriangles(vh);
  123. if(bDrawQuad) SetQuadrilateralVertices(vh);
  124. if(bDrawMask) DrawMask(vh); // 绘制蒙版
  125. if (bDrawFan) DrawFansAtCorners(vh); // 在转折角绘制扇形
  126. if (bDrawVertexCircle) DrawVertexCircles(vh);
  127. }
  128. private void SetLineVertices(VertexHelper vh)
  129. {
  130. UIVertex vert = UIVertex.simpleVert;
  131. vert.color = color;
  132. List<Vector2> _screenPositions = new List<Vector2>(screenPositions);
  133. if (loop)
  134. {
  135. _screenPositions.Add(screenPositions[0]);
  136. _screenPositions.Add(screenPositions[1]);
  137. }
  138. float lastAngle = 0;
  139. for (int i = 1; i < _screenPositions.Count; i++)
  140. {
  141. Vector2 previousPos = _screenPositions[i - 1];
  142. Vector2 currentPos = _screenPositions[i];
  143. Vector2 dif = currentPos - previousPos;
  144. float angle = Vector2.SignedAngle(Vector2.right, dif);
  145. Vector2 offset = Quaternion.Euler(0, 0, angle) * Vector3.up * thickness;
  146. if (i > 1)
  147. {
  148. float anglePerRound = (angle - lastAngle) / roundCount;
  149. for (int j = 0; j <= roundCount; j++)
  150. {
  151. float ang = lastAngle + anglePerRound * j;
  152. Vector2 roundOffset = Quaternion.Euler(0, 0, ang) * Vector2.up * thickness;
  153. vert.position = previousPos - roundOffset;
  154. vh.AddVert(vert);
  155. vert.position = previousPos + roundOffset;
  156. vh.AddVert(vert);
  157. }
  158. }
  159. lastAngle = angle;
  160. vert.position = previousPos - offset;
  161. vh.AddVert(vert);
  162. vert.position = previousPos + offset;
  163. vh.AddVert(vert);
  164. vert.position = currentPos - offset;
  165. vh.AddVert(vert);
  166. vert.position = currentPos + offset;
  167. vh.AddVert(vert);
  168. // 🔹 在每段线条两侧增加抗锯齿羽化
  169. if (antiAliasValue > 0.01f)
  170. {
  171. AddAntiAliasForLine(vh, previousPos, currentPos, offset, antiAliasValue);
  172. }
  173. }
  174. }
  175. private void SetQuadrilateralVertices(VertexHelper vh)
  176. {
  177. UIVertex vert = UIVertex.simpleVert;
  178. vert.color = quadColor;
  179. List<Vector2> _screenPositions = new List<Vector2>(screenPositions);
  180. if (loop)
  181. {
  182. _screenPositions.Add(screenPositions[0]);
  183. _screenPositions.Add(screenPositions[1]);
  184. }
  185. for (int i = 1; i < _screenPositions.Count; i++)
  186. {
  187. Vector2 previousPos = _screenPositions[i - 1];
  188. Vector2 currentPos = _screenPositions[i];
  189. if (i > 1)
  190. {
  191. Vector2 prevDir = (_screenPositions[i - 1] - _screenPositions[i - 2]).normalized;
  192. Vector2 currentDir = (currentPos - previousPos).normalized;
  193. int index = i == 4 ? 4 : i % 4;
  194. if (index == 4 || index == 2)
  195. {
  196. DrawSquareAtCorner(vh, previousPos, prevDir, currentDir, quadrilateralSize.x, quadrilateralSize.y, index);
  197. }
  198. else {
  199. DrawSquareAtCorner(vh, previousPos, prevDir, currentDir, quadrilateralSize.y, quadrilateralSize.x, index);
  200. }
  201. }
  202. }
  203. }
  204. private void DrawSquareAtCorner(VertexHelper vh, Vector2 corner, Vector2 prevDir, Vector2 currentDir, float width, float height, int index)
  205. {
  206. UIVertex vert = UIVertex.simpleVert;
  207. vert.color = quadColor;
  208. Vector2[] corners = new Vector2[4];
  209. corners[0] = corner;
  210. corners[1] = corner + prevDir * -width;
  211. corners[2] = corner + prevDir * -width + currentDir * height;
  212. corners[3] = corner + currentDir * height;
  213. foreach (Vector2 pos in corners)
  214. {
  215. vert.position = pos;
  216. vh.AddVert(vert);
  217. }
  218. int startIndex = vh.currentVertCount - 4;
  219. vh.AddTriangle(startIndex, startIndex + 1, startIndex + 2);
  220. vh.AddTriangle(startIndex + 2, startIndex + 3, startIndex);
  221. // Store the quad's center position and text for later use
  222. //Vector2 quadCenter = corner + (prevDir * -width + currentDir * height) / 2;
  223. //quadsToDraw.Add(quadCenter);
  224. //quadTextToDraw.Add(index.ToString());
  225. }
  226. private void SetLineTriangles(VertexHelper vh)
  227. {
  228. for (int i = 0; i < vh.currentVertCount - 2; i += 2)
  229. {
  230. int index = i;
  231. vh.AddTriangle(index, index + 1, index + 3);
  232. vh.AddTriangle(index + 3, index + 2, index);
  233. }
  234. }
  235. private void DrawVertexCircles(VertexHelper vh)
  236. {
  237. for (int i = 0; i < screenPositions.Count; i++)
  238. {
  239. DrawFilledCircle(vh, screenPositions[i], vertexCircleRadius, vertexCircleSegments, vertexCircleColor);
  240. }
  241. }
  242. private void DrawFilledCircle(VertexHelper vh, Vector2 center, float radius, int segments, Color circleColor)
  243. {
  244. UIVertex vert = UIVertex.simpleVert;
  245. vert.color = circleColor;
  246. int initialVertCount = vh.currentVertCount;
  247. vert.position = center;
  248. vh.AddVert(vert);
  249. for (int i = 0; i <= segments; i++)
  250. {
  251. float angle = i * Mathf.PI * 2f / segments;
  252. vert.position = center + new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)) * radius;
  253. vh.AddVert(vert);
  254. }
  255. for (int i = 1; i <= segments; i++)
  256. {
  257. vh.AddTriangle(initialVertCount, initialVertCount + i, initialVertCount + i + 1);
  258. }
  259. }
  260. private void DrawMask(VertexHelper vh)
  261. {
  262. UIVertex vert = UIVertex.simpleVert;
  263. vert.color = maskColor;
  264. //// 屏幕四个角的坐标
  265. //Vector2[] screenCorners = new Vector2[]
  266. //{
  267. // new Vector2(-Screen.width / 2, -Screen.height / 2), // 左下角
  268. // new Vector2(Screen.width / 2, -Screen.height / 2), // 右下角
  269. // new Vector2(Screen.width / 2, Screen.height / 2), // 右上角
  270. // new Vector2(-Screen.width / 2, Screen.height / 2), // 左上角
  271. //};
  272. // 获取 RectTransform 的实际四个角坐标
  273. Rect rect = rectTransform.rect;
  274. Vector2[] screenCorners = new Vector2[]
  275. {
  276. new Vector2(rect.xMin, rect.yMin), // 左下角
  277. new Vector2(rect.xMax, rect.yMin), // 右下角
  278. new Vector2(rect.xMax, rect.yMax), // 右上角
  279. new Vector2(rect.xMin, rect.yMax), // 左上角
  280. };
  281. // 添加四个点作为内框(中间区域的四个顶点)
  282. Vector2[] innerCorners = screenPositions.ToArray();
  283. // 分别绘制四个蒙版区域
  284. // 1. 左上区域:围绕左上角和内框左上、右上
  285. AddQuad(vh, screenCorners[3], innerCorners[3], innerCorners[2], screenCorners[2]);
  286. // 2. 右上区域:围绕右上角和内框右上、右下
  287. AddQuad(vh, innerCorners[2], screenCorners[2], screenCorners[1], innerCorners[1]);
  288. // 3. 右下区域:围绕右下角和内框右下、左下
  289. AddQuad(vh, innerCorners[0], innerCorners[1], screenCorners[1], screenCorners[0]);
  290. // 4. 左下区域:围绕左下角和内框左下、左上
  291. AddQuad(vh, screenCorners[3], screenCorners[0], innerCorners[0], innerCorners[3]);
  292. }
  293. private void AddQuad(VertexHelper vh, Vector2 corner1, Vector2 corner2, Vector2 corner3, Vector2 corner4)
  294. {
  295. UIVertex vert = UIVertex.simpleVert;
  296. vert.color = maskColor;
  297. vert.position = corner1;
  298. vh.AddVert(vert);
  299. vert.position = corner2;
  300. vh.AddVert(vert);
  301. vert.position = corner3;
  302. vh.AddVert(vert);
  303. vert.position = corner4;
  304. vh.AddVert(vert);
  305. //Debug.Log("vh.currentVertCount:"+ vh.currentVertCount);
  306. int startIndex = vh.currentVertCount - 4;
  307. vh.AddTriangle(startIndex, startIndex + 1, startIndex + 2);
  308. vh.AddTriangle(startIndex + 2, startIndex + 3, startIndex);
  309. }
  310. /// <summary>
  311. /// 1. 计算角度方向:
  312. /// 使用 Vector2.Angle 可以得到两个向量之间的夹角大小,但它不能确定角度的方向。为此,我们需要使用 Mathf.Atan2 来计算相对坐标的角度。Atan2 可以返回一个在 -π 到 π 之间的角度值,并且考虑了顺时针和逆时针的方向。
  313. /// 2. 从 X 轴正方向为 0 计算角度:
  314. /// 将角度计算为相对于 x 轴正方向的角度,并根据 Atan2 结果进行调整。
  315. /// </summary>
  316. /// <param name="vh"></param>
  317. private void DrawFansAtCorners(VertexHelper vh)
  318. {
  319. List<Vector2> _screenPositions = new List<Vector2>(screenPositions);
  320. if (loop)
  321. {
  322. _screenPositions.Add(screenPositions[0]);
  323. _screenPositions.Add(screenPositions[1]);
  324. }
  325. //比如现在是6个点,实际从第二个点开始绘制
  326. for (int i = 1; i < _screenPositions.Count - 1; i++)
  327. {
  328. Vector2 previousPos = _screenPositions[i - 1];
  329. Vector2 currentPos = _screenPositions[i];
  330. Vector2 nextPos = _screenPositions[i + 1];
  331. // 计算当前点到前一点的方向
  332. Vector2 prevDir = (currentPos - previousPos).normalized;
  333. // 计算当前点到下一点的方向
  334. Vector2 currentDir = (nextPos - currentPos).normalized;
  335. // 使用 Atan2 计算方向相对于 x 轴的角度
  336. float prevAngle = Mathf.Atan2(prevDir.y, prevDir.x) * Mathf.Rad2Deg; // 前一个方向相对于 x 轴的角度
  337. float currentAngle = Mathf.Atan2(currentDir.y, currentDir.x) * Mathf.Rad2Deg; // 当前方向相对于 x 轴的角度
  338. // 计算两个方向之间的角度差
  339. float angleBetween = Vector2.Angle(prevDir, currentDir);
  340. // 判断旋转方向
  341. float cross = prevDir.x * currentDir.y - prevDir.y * currentDir.x;
  342. if (cross < 0)
  343. {
  344. // 逆时针旋转
  345. angleBetween = 360f - angleBetween;
  346. }
  347. // 内角的计算(补充180度)
  348. float innerAngle = 180f - angleBetween;
  349. // 计算开始角度,这里用的是 x 轴为起始点来计算
  350. float startAngle = currentAngle;
  351. //Debug.Log($"Index {i}: startAngle = {startAngle}, innerAngle = {innerAngle}");
  352. // 根据当前角的位置调整内角和起始角
  353. DrawFanAtCorner(vh, currentPos, startAngle, innerAngle, fanInnerRadius, fanOuterRadius, fanSegments, fanColor);
  354. // 计算箭头的中心角度,确保角度在 0-360° 范围内
  355. float centerAngle = (startAngle + innerAngle / 2) % 360f;
  356. float radians = Mathf.Deg2Rad * centerAngle;
  357. // 计算箭头位置:在扇形外半径的基础上延长一定距离(箭头偏移量)
  358. float arrowOffset = fanOuterRadius + arrowDis;
  359. Vector2 arrowPosition = currentPos + new Vector2(Mathf.Cos(radians), Mathf.Sin(radians)) * arrowOffset;
  360. // 箭头方向
  361. Vector2 arrowDirection = new Vector2(Mathf.Cos(radians), Mathf.Sin(radians)).normalized;
  362. // 将箭头信息保存到列表中
  363. arrowInfos.Add(new ArrowInfo(arrowPosition, arrowDirection));
  364. // 在所有扇形处绘制箭头
  365. // 在扇形中心绘制箭头
  366. if (bDrawArrow)
  367. {
  368. // 调试信息
  369. //Debug.Log($"Index {i}: arrowPosition = {arrowPosition}, startAngle = {startAngle}, centerAngle = {centerAngle}, direction = {arrowDirection}");
  370. // 绘制箭头
  371. DrawArrow(vh, arrowPosition, arrowDirection, arrowLength, arrowWidth, arrowHeadHeight);
  372. }
  373. }
  374. }
  375. private void DrawFanAtCorner(VertexHelper vh, Vector2 center, float startAngle, float angleDegree, float innerRadius, float outerRadius, int segments ,Color color)
  376. {
  377. UIVertex vert = UIVertex.simpleVert;
  378. vert.color = color;
  379. float angleRad = Mathf.Deg2Rad * angleDegree; // 将绘制角度转换为弧度
  380. float startAngleRad = Mathf.Deg2Rad * startAngle; // 将起始角度转换为弧度
  381. float angleStep = angleRad / segments; // 每个扇形段的角度步长
  382. int initialVertCount = vh.currentVertCount; // 记录当前顶点数量
  383. // 添加中心点顶点
  384. vert.position = center;
  385. vert.uv0 = new Vector2(0.5f, 0.5f); // 中心UV值
  386. vh.AddVert(vert);
  387. // 绘制外圈和内圈的顶点
  388. for (int i = 0; i <= segments; i++)
  389. {
  390. float currentAngle = startAngleRad + i * angleStep;
  391. float cosA = Mathf.Cos(currentAngle);
  392. float sinA = Mathf.Sin(currentAngle);
  393. // 外圈顶点
  394. vert.position = center + new Vector2(cosA * outerRadius, sinA * outerRadius);
  395. vert.uv0 = new Vector2(0.5f + cosA * 0.5f, 0.5f + sinA * 0.5f);
  396. vh.AddVert(vert);
  397. // 内圈顶点
  398. vert.position = center + new Vector2(cosA * innerRadius, sinA * innerRadius);
  399. vert.uv0 = new Vector2(0.5f + cosA * innerRadius / outerRadius * 0.5f, 0.5f + sinA * innerRadius / outerRadius * 0.5f);
  400. vh.AddVert(vert);
  401. }
  402. // 创建三角形索引来绘制扇形
  403. for (int i = 1; i <= segments; i++)
  404. {
  405. int baseIndex = initialVertCount + (i - 1) * 2;
  406. vh.AddTriangle(initialVertCount, baseIndex + 1, baseIndex + 3); // 中心点连接外圈
  407. vh.AddTriangle(baseIndex + 1, baseIndex + 2, baseIndex + 3); // 内圈连接外圈
  408. }
  409. }
  410. // 新增箭头绘制方法
  411. private void DrawArrow(VertexHelper vh, Vector2 position, Vector2 direction, float arrowLength, float arrowWidth, float arrowHeadHeight)
  412. {
  413. // 标准化方向向量
  414. direction.Normalize();
  415. // 反向箭头的方向(箭头指向扇形方向)
  416. Vector2 reversedDirection = -direction;
  417. // 箭头尾部位置
  418. Vector2 basePosition = position - reversedDirection * arrowLength;
  419. // 计算垂直向量用于箭头宽度
  420. Vector2 perpendicular = new Vector2(-reversedDirection.y, reversedDirection.x);
  421. // 让箭头矩形部分的宽度比三角形的底边窄
  422. float adjustedArrowWidth = arrowWidth * 0.6f; // 调整宽度,使矩形比三角形窄
  423. // 箭头矩形部分的四个顶点
  424. Vector2 baseLeft = basePosition + perpendicular * (adjustedArrowWidth / 2);
  425. Vector2 baseRight = basePosition - perpendicular * (adjustedArrowWidth / 2);
  426. Vector2 headLeft = position + perpendicular * (adjustedArrowWidth / 2);
  427. Vector2 headRight = position - perpendicular * (adjustedArrowWidth / 2);
  428. Vector2 triangleHeadLeft = position + perpendicular * (arrowHeadHeight / 2);
  429. Vector2 triangleHeadRight = position - perpendicular * (arrowHeadHeight / 2);
  430. // 顶点颜色
  431. UIVertex vert = UIVertex.simpleVert;
  432. vert.color = arrowColor;
  433. // 先添加矩形部分的顶点
  434. int rectStartIndex = vh.currentVertCount;
  435. vert.position = baseLeft;
  436. vh.AddVert(vert);
  437. vert.position = baseRight;
  438. vh.AddVert(vert);
  439. vert.position = headLeft;
  440. vh.AddVert(vert);
  441. vert.position = headRight;
  442. vh.AddVert(vert);
  443. // 添加矩形部分的两条三角形索引
  444. vh.AddTriangle(rectStartIndex, rectStartIndex + 1, rectStartIndex + 2);
  445. vh.AddTriangle(rectStartIndex + 1, rectStartIndex + 3, rectStartIndex + 2);
  446. // 然后添加三角形头部的顶点
  447. Vector2 headPosition = position + reversedDirection * arrowHeadHeight;
  448. int headStartIndex = vh.currentVertCount;
  449. vert.position = triangleHeadLeft;
  450. vh.AddVert(vert);
  451. vert.position = triangleHeadRight;
  452. vh.AddVert(vert);
  453. vert.position = headPosition; // 添加箭头尖端
  454. vh.AddVert(vert);
  455. // 添加三角形的索引
  456. int triangleStartIndex = vh.currentVertCount - 3; // 三角形部分的开始索引
  457. vh.AddTriangle(triangleStartIndex, triangleStartIndex + 1, triangleStartIndex + 2); // 三角形索引
  458. }
  459. /// <summary>
  460. /// 抗锯齿羽化边缘
  461. /// </summary>
  462. private void AddAntiAliasForLine(VertexHelper vh, Vector2 start, Vector2 end, Vector2 offset, float feather)
  463. {
  464. UIVertex vert = UIVertex.simpleVert;
  465. Color featherColor = color;
  466. featherColor.a = 0; // 透明收尾
  467. // 上边缘
  468. vert.color = color;
  469. vert.position = start + offset;
  470. vh.AddVert(vert);
  471. vert.position = end + offset;
  472. vh.AddVert(vert);
  473. vert.color = featherColor;
  474. vert.position = start + offset + (offset.normalized * feather);
  475. vh.AddVert(vert);
  476. vert.position = end + offset + (offset.normalized * feather);
  477. vh.AddVert(vert);
  478. int idx = vh.currentVertCount - 4;
  479. vh.AddTriangle(idx, idx + 1, idx + 2);
  480. vh.AddTriangle(idx + 1, idx + 3, idx + 2);
  481. // 下边缘
  482. vert.color = color;
  483. vert.position = start - offset;
  484. vh.AddVert(vert);
  485. vert.position = end - offset;
  486. vh.AddVert(vert);
  487. vert.color = featherColor;
  488. vert.position = start - offset - (offset.normalized * feather);
  489. vh.AddVert(vert);
  490. vert.position = end - offset - (offset.normalized * feather);
  491. vh.AddVert(vert);
  492. idx = vh.currentVertCount - 4;
  493. vh.AddTriangle(idx, idx + 1, idx + 2);
  494. vh.AddTriangle(idx + 1, idx + 3, idx + 2);
  495. }
  496. //private void LateUpdate()
  497. //{
  498. // foreach (var quadObj in quadObjects)
  499. // {
  500. // if (quadObj != null)
  501. // {
  502. // objectPool.Push(quadObj);
  503. // }
  504. // }
  505. // quadObjects.Clear();
  506. // for (int i = 0; i < quadsToDraw.Count; i++)
  507. // {
  508. // GameObject quadGO = GetQuadObject();
  509. // if (quadGO != null)
  510. // {
  511. // quadGO.SetActive(true);
  512. // quadGO.GetComponent<RectTransform>().anchoredPosition = quadsToDraw[i];
  513. // Text quadTextComponent = quadGO.GetComponent<Text>();
  514. // quadTextComponent.text = quadTextToDraw[i];
  515. // quadTextComponent.fontSize = quadFontSize;
  516. // quadTextComponent.color = quadTextColor;
  517. // quadTextComponent.alignment = TextAnchor.MiddleCenter;
  518. // }
  519. // }
  520. // quadsToDraw.Clear();
  521. // quadTextToDraw.Clear();
  522. //}
  523. //private GameObject GetQuadObject()
  524. //{
  525. // if (objectPool.Count > 0)
  526. // {
  527. // GameObject quadGO = objectPool.Pop();
  528. // if (quadGO != null)
  529. // {
  530. // quadObjects.Add(quadGO);
  531. // return quadGO;
  532. // }
  533. // }
  534. // if (quadObjects.Count < ObjectPoolLimit)
  535. // {
  536. // GameObject newQuadGO = new GameObject("QuadText", typeof(RectTransform), typeof(Text));
  537. // newQuadGO.transform.SetParent(this.transform);
  538. // Text quadTextComponent = newQuadGO.GetComponent<Text>();
  539. // quadTextComponent.alignment = TextAnchor.MiddleCenter;
  540. // quadTextComponent.rectTransform.sizeDelta = new Vector2(quadrilateralSize.x, quadrilateralSize.y);
  541. // quadObjects.Add(newQuadGO);
  542. // return newQuadGO;
  543. // }
  544. // return null;
  545. //}
  546. }
  547. }