TextPlus.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using System.Linq;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. public class TextPlus : Text
  7. {
  8. #region
  9. public int LeftIndex;
  10. public int RightIndex;
  11. public int BreakIndex;
  12. public bool Draw;
  13. public float Width;
  14. public float Height;
  15. public string SpriteName;
  16. public SpriteInfo SpriteInfo;
  17. public ImagePlus ImagePlus
  18. {
  19. get
  20. {
  21. if (_ImagePlus == null)
  22. {
  23. _ImagePlus = GetComponentInChildren<ImagePlus>();
  24. }
  25. return _ImagePlus;
  26. }
  27. set { _ImagePlus = value; }
  28. }
  29. private ImagePlus _ImagePlus;
  30. #endregion
  31. protected override void OnPopulateMesh(VertexHelper toFill)
  32. {
  33. base.OnPopulateMesh(toFill);
  34. if (ImagePlus == null)
  35. {
  36. Debug.LogWarning("There is no ImagePlus");
  37. return;
  38. }
  39. LeftIndex = text.IndexOf("<(");
  40. RightIndex = text.IndexOf(")>");
  41. if (LeftIndex == -1 || RightIndex == -1)
  42. {
  43. Draw = false;
  44. }
  45. else
  46. {
  47. SpriteName = text.Between(LeftIndex + 2, RightIndex - 1);
  48. if (SpriteAsset.SpriteInfoDic.TryGetValue(SpriteName, out SpriteInfo))
  49. {
  50. Draw = true;
  51. }
  52. else
  53. {
  54. Draw = false;
  55. }
  56. }
  57. if (Draw)
  58. {
  59. Draw = false;
  60. UIVertex[] vertices = new UIVertex[4];
  61. List<UIVertex> vertexList = new List<UIVertex>();
  62. toFill.GetUIVertexStream(vertexList);
  63. int row = text.Split('\n').Length;
  64. if (row == 1)
  65. {
  66. BreakIndex = text.Length;
  67. }
  68. else
  69. {
  70. BreakIndex = text.IndexOf('\n');
  71. }
  72. Height = preferredHeight/row;
  73. Width = (Height / SpriteInfo.Height) * SpriteInfo.Width;
  74. Vector3 centerLeft;
  75. if (LeftIndex == 0)
  76. {
  77. centerLeft = (vertexList[LeftIndex * 6 + 4].position + vertexList[LeftIndex * 6 + 5].position) / 2;
  78. }
  79. else
  80. {
  81. centerLeft = (vertexList[(LeftIndex -1)* 6 + 1].position + vertexList[(LeftIndex - 1)*6 + 2].position) / 2;
  82. }
  83. vertices[0].position = centerLeft + new Vector3(0, -Height/2, 0);
  84. vertices[1].position = centerLeft + new Vector3(0, Height/2, 0);
  85. vertices[2].position = centerLeft + new Vector3(Width, Height/2, 0);
  86. vertices[3].position = centerLeft + new Vector3(Width, -Height/2, 0);
  87. vertices[0].color = Color.white;
  88. vertices[1].color = Color.white;
  89. vertices[2].color = Color.white;
  90. vertices[3].color = Color.white;
  91. vertices[0].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[0];
  92. vertices[1].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[1];
  93. vertices[2].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[2];
  94. vertices[3].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[3];
  95. UIVertex vertex = new UIVertex();
  96. for (int i = LeftIndex; i < RightIndex + 2; i++)
  97. {
  98. toFill.SetUIVertex(vertex, i*4);
  99. toFill.SetUIVertex(vertex, i*4 + 1);
  100. toFill.SetUIVertex(vertex, i*4 + 2);
  101. toFill.SetUIVertex(vertex, i*4 + 3);
  102. }
  103. if (LeftIndex == 0)
  104. {
  105. float offsetX1 = vertexList[(RightIndex + 2) * 6].position.x - vertices[3].position.x;
  106. float offsetX2 = (vertexList[(BreakIndex - 1) * 6 + 1].position.x + vertices[0].position.x - offsetX1) / 2;
  107. for (int i = RightIndex + 2; i < BreakIndex; i++)
  108. {
  109. vertex = vertexList[i * 6];
  110. vertex.position.x -= offsetX1 + offsetX2;
  111. toFill.SetUIVertex(vertex, i * 4);
  112. vertex = vertexList[i * 6 + 1];
  113. vertex.position.x -= offsetX1 + offsetX2;
  114. toFill.SetUIVertex(vertex, i * 4 + 1);
  115. vertex = vertexList[i * 6 + 2];
  116. vertex.position.x -= offsetX1 + offsetX2;
  117. toFill.SetUIVertex(vertex, i * 4 + 2);
  118. vertex = vertexList[i * 6 + 4];
  119. vertex.position.x -= offsetX1 + offsetX2;
  120. toFill.SetUIVertex(vertex, i * 4 + 3);
  121. }
  122. vertices[0].position.x -= offsetX2;
  123. vertices[1].position.x -= offsetX2;
  124. vertices[2].position.x -= offsetX2;
  125. vertices[3].position.x -= offsetX2;
  126. }
  127. else
  128. {
  129. float offsetX1 = vertexList[(RightIndex + 2) * 6].position.x - vertices[3].position.x;
  130. float offsetX2 = (vertexList[(BreakIndex - 1) * 6 + 1].position.x + vertexList[0].position.x - offsetX1) / 2;
  131. for (int i = 0; i < LeftIndex; i++)
  132. {
  133. vertex = vertexList[i * 6];
  134. vertex.position.x -= offsetX2;
  135. toFill.SetUIVertex(vertex, i * 4);
  136. vertex = vertexList[i * 6 + 1];
  137. vertex.position.x -= offsetX2;
  138. toFill.SetUIVertex(vertex, i * 4 + 1);
  139. vertex = vertexList[i * 6 + 2];
  140. vertex.position.x -= offsetX2;
  141. toFill.SetUIVertex(vertex, i * 4 + 2);
  142. vertex = vertexList[i * 6 + 4];
  143. vertex.position.x -= offsetX2;
  144. toFill.SetUIVertex(vertex, i * 4 + 3);
  145. }
  146. for (int i = RightIndex + 2; i < BreakIndex; i++)
  147. {
  148. vertex = vertexList[i * 6];
  149. vertex.position.x -= offsetX1 + offsetX2;
  150. toFill.SetUIVertex(vertex, i * 4);
  151. vertex = vertexList[i * 6 + 1];
  152. vertex.position.x -= offsetX1 + offsetX2;
  153. toFill.SetUIVertex(vertex, i * 4 + 1);
  154. vertex = vertexList[i * 6 + 2];
  155. vertex.position.x -= offsetX1 + offsetX2;
  156. toFill.SetUIVertex(vertex, i * 4 + 2);
  157. vertex = vertexList[i * 6 + 4];
  158. vertex.position.x -= offsetX1 + offsetX2;
  159. toFill.SetUIVertex(vertex, i * 4 + 3);
  160. }
  161. vertices[0].position.x -= offsetX2;
  162. vertices[1].position.x -= offsetX2;
  163. vertices[2].position.x -= offsetX2;
  164. vertices[3].position.x -= offsetX2;
  165. }
  166. ImagePlus.UpdateStatus(true, new VertexHelper(), vertices.ToList());
  167. }
  168. else
  169. {
  170. ImagePlus.UpdateStatus(false, new VertexHelper(), null);
  171. }
  172. }
  173. }