123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- 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<ImagePlus>();
- }
- 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<UIVertex> vertexList = new List<UIVertex>();
- 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);
- }
- }
- }
|