using UnityEngine; using UnityEngine.UI; using System.Linq; using System.Collections; using System.Collections.Generic; public class TextPlus : Text { #region public int LeftIndex; public int RightIndex; public int BreakIndex; public bool Draw; public float Width; public float Height; public string SpriteName; public SpriteInfo SpriteInfo; public ImagePlus ImagePlus { get { if (_ImagePlus == null) { _ImagePlus = GetComponentInChildren(); } return _ImagePlus; } set { _ImagePlus = value; } } private ImagePlus _ImagePlus; #endregion protected override void OnPopulateMesh(VertexHelper toFill) { base.OnPopulateMesh(toFill); if (ImagePlus == null) { Debug.LogWarning("There is no ImagePlus"); return; } LeftIndex = text.IndexOf("<("); RightIndex = text.IndexOf(")>"); if (LeftIndex == -1 || RightIndex == -1) { Draw = false; } else { SpriteName = text.Between(LeftIndex + 2, RightIndex - 1); if (SpriteAsset.SpriteInfoDic.TryGetValue(SpriteName, out SpriteInfo)) { Draw = true; } else { Draw = false; } } if (Draw) { Draw = false; UIVertex[] vertices = new UIVertex[4]; List vertexList = new List(); toFill.GetUIVertexStream(vertexList); int row = text.Split('\n').Length; if (row == 1) { BreakIndex = text.Length; } else { BreakIndex = text.IndexOf('\n'); } Height = preferredHeight/row; Width = (Height / SpriteInfo.Height) * SpriteInfo.Width; Vector3 centerLeft; if (LeftIndex == 0) { centerLeft = (vertexList[LeftIndex * 6 + 4].position + vertexList[LeftIndex * 6 + 5].position) / 2; } else { centerLeft = (vertexList[(LeftIndex -1)* 6 + 1].position + vertexList[(LeftIndex - 1)*6 + 2].position) / 2; } vertices[0].position = centerLeft + new Vector3(0, -Height/2, 0); vertices[1].position = centerLeft + new Vector3(0, Height/2, 0); vertices[2].position = centerLeft + new Vector3(Width, Height/2, 0); vertices[3].position = centerLeft + new Vector3(Width, -Height/2, 0); vertices[0].color = Color.white; vertices[1].color = Color.white; vertices[2].color = Color.white; vertices[3].color = Color.white; vertices[0].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[0]; vertices[1].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[1]; vertices[2].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[2]; vertices[3].uv0 = SpriteAsset.SpriteInfoDic[SpriteName].UvList[3]; UIVertex vertex = new UIVertex(); for (int i = LeftIndex; i < RightIndex + 2; i++) { toFill.SetUIVertex(vertex, i*4); toFill.SetUIVertex(vertex, i*4 + 1); toFill.SetUIVertex(vertex, i*4 + 2); toFill.SetUIVertex(vertex, i*4 + 3); } if (LeftIndex == 0) { float offsetX1 = vertexList[(RightIndex + 2) * 6].position.x - vertices[3].position.x; float offsetX2 = (vertexList[(BreakIndex - 1) * 6 + 1].position.x + vertices[0].position.x - offsetX1) / 2; for (int i = RightIndex + 2; i < BreakIndex; i++) { vertex = vertexList[i * 6]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4); vertex = vertexList[i * 6 + 1]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4 + 1); vertex = vertexList[i * 6 + 2]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4 + 2); vertex = vertexList[i * 6 + 4]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4 + 3); } vertices[0].position.x -= offsetX2; vertices[1].position.x -= offsetX2; vertices[2].position.x -= offsetX2; vertices[3].position.x -= offsetX2; } else { float offsetX1 = vertexList[(RightIndex + 2) * 6].position.x - vertices[3].position.x; float offsetX2 = (vertexList[(BreakIndex - 1) * 6 + 1].position.x + vertexList[0].position.x - offsetX1) / 2; for (int i = 0; i < LeftIndex; i++) { vertex = vertexList[i * 6]; vertex.position.x -= offsetX2; toFill.SetUIVertex(vertex, i * 4); vertex = vertexList[i * 6 + 1]; vertex.position.x -= offsetX2; toFill.SetUIVertex(vertex, i * 4 + 1); vertex = vertexList[i * 6 + 2]; vertex.position.x -= offsetX2; toFill.SetUIVertex(vertex, i * 4 + 2); vertex = vertexList[i * 6 + 4]; vertex.position.x -= offsetX2; toFill.SetUIVertex(vertex, i * 4 + 3); } for (int i = RightIndex + 2; i < BreakIndex; i++) { vertex = vertexList[i * 6]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4); vertex = vertexList[i * 6 + 1]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4 + 1); vertex = vertexList[i * 6 + 2]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4 + 2); vertex = vertexList[i * 6 + 4]; vertex.position.x -= offsetX1 + offsetX2; toFill.SetUIVertex(vertex, i * 4 + 3); } vertices[0].position.x -= offsetX2; vertices[1].position.x -= offsetX2; vertices[2].position.x -= offsetX2; vertices[3].position.x -= offsetX2; } ImagePlus.UpdateStatus(true, new VertexHelper(), vertices.ToList()); } else { ImagePlus.UpdateStatus(false, new VertexHelper(), null); } } }