TestText.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using System.Linq;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. public class LineInfo
  7. {
  8. public int EndIndex;
  9. public int StartIndex;
  10. public LineInfo(int startIndex, int endIndex)
  11. {
  12. EndIndex = endIndex;
  13. StartIndex = startIndex;
  14. }
  15. }
  16. public class RenderInfo
  17. {
  18. public LineInfo LineInfo;
  19. public SpriteInfo SpriteInfo;
  20. public RenderInfo(LineInfo lineInfo, SpriteInfo spriteInfo)
  21. {
  22. LineInfo = lineInfo;
  23. SpriteInfo = spriteInfo;
  24. }
  25. }
  26. public class TestText : Text
  27. {
  28. #region 变量
  29. public int LeftIndex;
  30. public int RightIndex;
  31. public bool Draw;
  32. public float Width;
  33. public float Height;
  34. public string SpriteName;
  35. public SpriteInfo SpriteInfo;
  36. public List<LineInfo> LineInfoList;
  37. public List<UIVertex> VertexImage;
  38. public List<UIVertex> VertexStream;
  39. public List<RenderInfo> RenderInfoList;
  40. public ImagePlus ImagePlus
  41. {
  42. get
  43. {
  44. if (_ImagePlus == null)
  45. {
  46. _ImagePlus = GetComponentInChildren<ImagePlus>();
  47. if (_ImagePlus == null)
  48. {
  49. GameObject go = new GameObject("ImagePlus", typeof(ImagePlus));
  50. RectTransform rectTra = go.GetComponent<RectTransform>();
  51. rectTra.SetParent(rectTransform);
  52. }
  53. }
  54. return _ImagePlus;
  55. }
  56. set { _ImagePlus = value; }
  57. }
  58. private ImagePlus _ImagePlus;
  59. #endregion
  60. protected override void Awake()
  61. {
  62. base.Awake();
  63. verticalOverflow = VerticalWrapMode.Overflow;
  64. horizontalOverflow = HorizontalWrapMode.Wrap;
  65. }
  66. protected override void OnPopulateMesh(VertexHelper toFill)
  67. {
  68. base.OnPopulateMesh(toFill);
  69. if (ImagePlus == null)
  70. {
  71. Debug.LogWarning("There is no ImagePlus");
  72. return;
  73. }
  74. LeftIndex = text.IndexOf("<(");
  75. RightIndex = text.IndexOf(")>");
  76. if (LeftIndex == -1 || RightIndex == -1)
  77. {
  78. Draw = false;
  79. }
  80. else
  81. {
  82. SpriteName = text.Between(LeftIndex + 2, RightIndex - 1);
  83. if (SpriteAsset.SpriteInfoDic.TryGetValue(SpriteName, out SpriteInfo))
  84. {
  85. Draw = true;
  86. }
  87. else
  88. {
  89. Draw = false;
  90. }
  91. }
  92. if (Draw)
  93. {
  94. Draw = false;
  95. VertexImage = new List<UIVertex>();
  96. VertexStream = new List<UIVertex>();
  97. toFill.GetUIVertexStream(VertexStream);
  98. Height = preferredHeight / cachedTextGenerator.lineCount;
  99. Width = (Height / SpriteInfo.Height) * SpriteInfo.Width;
  100. LineInfoList = GetLineInfo();
  101. RenderInfoList = GetRenderInfo();
  102. RenderLine(RenderInfoList[0], VertexImage, VertexStream, toFill);
  103. ImagePlus.UpdateStatus(true, new VertexHelper(), VertexImage);
  104. }
  105. else
  106. {
  107. ImagePlus.UpdateStatus(false, new VertexHelper(), null);
  108. }
  109. }
  110. protected void RenderLine(RenderInfo renderInfo, List<UIVertex> vertexImage, List<UIVertex> vertexStream, VertexHelper toFill)
  111. {
  112. Vector3 centerLeft = new Vector3();
  113. if (LeftIndex == renderInfo.LineInfo.StartIndex)
  114. {
  115. centerLeft = (vertexStream[LeftIndex * 6 + 4].position + vertexStream[LeftIndex * 6 + 5].position) / 2;
  116. }
  117. else
  118. {
  119. centerLeft = (vertexStream[(LeftIndex - 1) * 6 + 1].position + vertexStream[(LeftIndex - 1) * 6 + 2].position) / 2;
  120. }
  121. UIVertex[] vertices = new UIVertex[4];
  122. vertices[0].position = centerLeft + new Vector3(0, -Height / 2, 0);
  123. vertices[1].position = centerLeft + new Vector3(0, Height / 2, 0);
  124. vertices[2].position = centerLeft + new Vector3(Width, Height / 2, 0);
  125. vertices[3].position = centerLeft + new Vector3(Width, -Height / 2, 0);
  126. vertices[0].color = Color.white;
  127. vertices[1].color = Color.white;
  128. vertices[2].color = Color.white;
  129. vertices[3].color = Color.white;
  130. vertices[0].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[0];
  131. vertices[1].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[1];
  132. vertices[2].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[2];
  133. vertices[3].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[3];
  134. UIVertex vertex = new UIVertex();
  135. for (int i = LeftIndex; i < RightIndex + 2; i++)
  136. {
  137. toFill.SetUIVertex(vertex, i * 4);
  138. toFill.SetUIVertex(vertex, i * 4 + 1);
  139. toFill.SetUIVertex(vertex, i * 4 + 2);
  140. toFill.SetUIVertex(vertex, i * 4 + 3);
  141. }
  142. if (LeftIndex == renderInfo.LineInfo.StartIndex)
  143. {
  144. float offsetX1 = VertexStream[(RightIndex + 2) * 6].position.x - vertices[3].position.x;
  145. float offsetX2 = (VertexStream[(BreakIndex - 1) * 6 + 1].position.x + vertices[0].position.x - offsetX1) / 2;
  146. for (int i = RightIndex + 2; i < BreakIndex; i++)
  147. {
  148. vertex = VertexStream[i * 6];
  149. vertex.position.x -= offsetX1 + offsetX2;
  150. toFill.SetUIVertex(vertex, i * 4);
  151. vertex = VertexStream[i * 6 + 1];
  152. vertex.position.x -= offsetX1 + offsetX2;
  153. toFill.SetUIVertex(vertex, i * 4 + 1);
  154. vertex = VertexStream[i * 6 + 2];
  155. vertex.position.x -= offsetX1 + offsetX2;
  156. toFill.SetUIVertex(vertex, i * 4 + 2);
  157. vertex = VertexStream[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. else
  167. {
  168. float offsetX1 = VertexStream[(RightIndex + 2) * 6].position.x - vertices[3].position.x;
  169. float offsetX2 = (VertexStream[(BreakIndex - 1) * 6 + 1].position.x + VertexStream[0].position.x - offsetX1) / 2;
  170. for (int i = 0; i < LeftIndex; i++)
  171. {
  172. vertex = VertexStream[i * 6];
  173. vertex.position.x -= offsetX2;
  174. toFill.SetUIVertex(vertex, i * 4);
  175. vertex = VertexStream[i * 6 + 1];
  176. vertex.position.x -= offsetX2;
  177. toFill.SetUIVertex(vertex, i * 4 + 1);
  178. vertex = VertexStream[i * 6 + 2];
  179. vertex.position.x -= offsetX2;
  180. toFill.SetUIVertex(vertex, i * 4 + 2);
  181. vertex = VertexStream[i * 6 + 4];
  182. vertex.position.x -= offsetX2;
  183. toFill.SetUIVertex(vertex, i * 4 + 3);
  184. }
  185. for (int i = RightIndex + 2; i < BreakIndex; i++)
  186. {
  187. vertex = VertexStream[i * 6];
  188. vertex.position.x -= offsetX1 + offsetX2;
  189. toFill.SetUIVertex(vertex, i * 4);
  190. vertex = VertexStream[i * 6 + 1];
  191. vertex.position.x -= offsetX1 + offsetX2;
  192. toFill.SetUIVertex(vertex, i * 4 + 1);
  193. vertex = VertexStream[i * 6 + 2];
  194. vertex.position.x -= offsetX1 + offsetX2;
  195. toFill.SetUIVertex(vertex, i * 4 + 2);
  196. vertex = VertexStream[i * 6 + 4];
  197. vertex.position.x -= offsetX1 + offsetX2;
  198. toFill.SetUIVertex(vertex, i * 4 + 3);
  199. }
  200. vertices[0].position.x -= offsetX2;
  201. vertices[1].position.x -= offsetX2;
  202. vertices[2].position.x -= offsetX2;
  203. vertices[3].position.x -= offsetX2;
  204. }
  205. }
  206. protected List<LineInfo> GetLineInfo()
  207. {
  208. int startIndex = 0;
  209. List<LineInfo> lineInfoList = new List<LineInfo>();
  210. if (cachedTextGenerator.lineCount > 1)
  211. {
  212. for (int i = 0; i < text.Length; i++)
  213. {
  214. if (text[i] == '\n')
  215. {
  216. if (text[startIndex] != '\n')
  217. {
  218. lineInfoList.Add(new LineInfo(startIndex, i));
  219. }
  220. if (i + 1 == text.Length)
  221. {
  222. return lineInfoList;
  223. }
  224. else
  225. {
  226. startIndex = i + 1;
  227. }
  228. }
  229. }
  230. }
  231. lineInfoList.Add(new LineInfo(startIndex, text.Length - 1));
  232. return lineInfoList;
  233. }
  234. protected List<RenderInfo> GetRenderInfo()
  235. {
  236. List<RenderInfo> renderInfoList = new List<RenderInfo>();
  237. for (int i = 0; i < LineInfoList.Count; i++)
  238. {
  239. if (LeftIndex >= LineInfoList[i].StartIndex && LeftIndex < LineInfoList[i].EndIndex)
  240. {
  241. renderInfoList.Add(new RenderInfo(LineInfoList[i], SpriteInfo));
  242. break;
  243. }
  244. }
  245. return renderInfoList;
  246. }
  247. }