// at Unity version 4.6 - 5.1, don't write [u] out of <color=...> (eg. [u]<color=#00507C>Falcon[/u]</color>), // because underline calculate include rich text(like "<color") vertex and char info. void fillUnderline(VertexHelper toFill) { if (null == mCharTextGenerator) { mCharTextGenerator = new TextGenerator(1); } m_DisableFontTextureRebuiltCallback = true; Vector2 extents = rectTransform.rect.size; TextGenerationSettings settings = GetGenerationSettings(extents); mCharTextGenerator.Populate("_", settings); IList <UIVertex> verts = mCharTextGenerator.verts; if (verts.Count < 4) { return; } Vector2 topUV = (verts[0].uv0 + verts[1].uv0) / 2; Vector2 bottomUV = (verts[2].uv0 + verts[3].uv0) / 2; UIVertex[] temp = new UIVertex[4]; for (int i = 0; i < 4; i++) { temp[i] = verts[i]; if (i < 2) { temp[i].uv0 = topUV; } else { temp[i].uv0 = bottomUV; } } if (mCharTextGenerator.lineCount <= 0) { return; } float underLineTopY = mCharTextGenerator.lines[0].topY; float offsetTop = verts[0].position.y - underLineTopY; float offsetBottom = verts[3].position.y - underLineTopY; IList <UILineInfo> lines = cachedTextGenerator.lines; TextSegmentFlag segment; int segmentIdx = 0, segmentStartIdx = -1, segmentEndIdx = -1, endIdx = lines.Count - 1; bool start = false; if (null == mUnderlineEdgeCfg) { mUnderlineEdgeCfg = new UnderlineEdgeConfig(); } mUnderlineEdgeCfg.init(toFill, temp, cachedTextGenerator, offsetTop, offsetBottom); for (int i = 0, max = lines.Count; i < max; ++i) { if (segmentIdx == mUnderlineIndexList.Count) { break; } segment = mUnderlineIndexList[segmentIdx]; if (!start && (lines[i].startCharIdx > segment.start || i == endIdx)) { if (!mUnderlineEdgeCfg.setUnderLineStartPos(segment.start, ref segmentStartIdx, i)) { break; } start = true; } if (start && (lines[i].startCharIdx > segment.end || i == endIdx)) { segmentEndIdx = i - (lines[i].startCharIdx > segment.end ? 1 : 0); if (segmentStartIdx == segmentEndIdx) { if (!mUnderlineEdgeCfg.setUnderLineEndPos(segment.end)) { break; } segmentIdx++; start = false; --i; continue; } //start -> start line end int startLineEndCharIdx = lines[segmentStartIdx + 1].startCharIdx - 1; if ('\n' == text[startLineEndCharIdx]) { --startLineEndCharIdx; } if (!mUnderlineEdgeCfg.setUnderLineEndPos(startLineEndCharIdx)) { break; } //for(line start + 1 --> line end - 1) for (int k = segmentStartIdx + 1; k < segmentEndIdx; ++k) { int lineStartCharIdx = lines[k].startCharIdx; //ignore line feed if ('\n' == text[lineStartCharIdx]) { continue; } if (!mUnderlineEdgeCfg.setUnderLineStartPos(lineStartCharIdx, ref k, k)) { break; } int lineEndCharIdx = lines[k + 1].startCharIdx - 1; if ('\n' == text[lineEndCharIdx]) { --lineEndCharIdx; } if (!mUnderlineEdgeCfg.setUnderLineEndPos(lineEndCharIdx)) { break; } } //end line start -> end int endLineStartCharIdx = lines[segmentEndIdx].startCharIdx; if (!mUnderlineEdgeCfg.setUnderLineStartPos(endLineStartCharIdx, ref segmentEndIdx, segmentEndIdx)) { break; } if (!mUnderlineEdgeCfg.setUnderLineEndPos(segment.end)) { break; } segmentIdx++; start = false; --i; continue; } } m_DisableFontTextureRebuiltCallback = false; }
protected override void OnDestroy() { if (this.txtTool != null) { this.txtTool.ClearAll(); } if (this.mOriginIndexList != null) { this.mOriginIndexList.Clear(); } if (this.mVertexHelper != null) { this.mVertexHelper.Clear(); } if (this._icons != null) { this._icons.Clear(); } if (this._heights != null) { this._heights.Clear(); } if (this._widths != null) { this._widths.Clear(); } if (this._heightDeltas != null) { this._heightDeltas.Clear(); } if (this._iconsPool != null) { this._iconsPool.Clear(); } if (this._indexes != null) { this._indexes.Clear(); } if (this._names != null) { this._names.Clear(); } if (this._positions != null) { this._positions.Clear(); } if (this.mUnderlineIndexList != null) { this.mUnderlineIndexList.Clear(); } this.mGo = null; this.mTrans = null; this._icons = null; this._iconsPool = null; this._heights = null; this._widths = null; this._indexes = null; this._names = null; this._positions = null; this._heightDeltas = null; this.root = null; this.mOriginIndexList = null; this.txtTool = null; this.mVertexHelper = null; this.mCharTextGenerator = null; this.mUnderlineEdgeCfg = null; base.OnDestroy(); }