void FillPart(InlineText text, string context, int start, int end, ref ParseTextResult result) { string substr = context.Substring(start, end - start + 1); //生成字符 拿到字符大小 Vector2 extents = text.rectTransform.rect.size; var settings = text.GetGenerationSettings(extents); text.cachedTextGenerator.PopulateWithErrors(substr, settings, text.gameObject); //最后4个点是空行 var charlist = text.cachedTextGenerator.characters; //插入点之后文字所占用的宽度 for (int i = 0; i < text.cachedTextGenerator.characterCountVisible; i++) { var chardata = charlist[i]; result.GetPartSize().Add(chardata.charWidth); } if (text.Manager != null && text.Manager.OpenDebug) { #if UNITY_EDITOR Debug.LogFormat("{0} point ={1}", substr, start); #endif } }
void FillSpriteTag(InlineText text, StringBuilder stringBuilder, Match match, int matchindex, int atlasId, string atlasTag) { if (text.Manager != null && text.Manager.CanRendering(atlasId) && text.Manager.CanRendering(atlasTag)) { SpriteAsset sprAsset; SpriteInfoGroup tagSprites = text.Manager.FindSpriteGroup(atlasTag, out sprAsset); if (tagSprites != null && tagSprites.spritegroups.Count > 0) { if (!text.Manager.isRendering(sprAsset)) { text.Manager.PushRenderAtlas(sprAsset); } if (_SpaceGen == null) { _SpaceGen = new TextGenerator(); } if (cacheframecnt != Time.frameCount || cachetext != text) { cacheframecnt = Time.frameCount; cachetext = text; Vector2 extents = text.rectTransform.rect.size; TextGenerationSettings settings = text.GetGenerationSettings(extents); _SpaceGen.Populate(palceholder, settings); } IList <UIVertex> spaceverts = _SpaceGen.verts; float spacewid = spaceverts[1].position.x - spaceverts[0].position.x; float spaceheight = spaceverts[0].position.y - spaceverts[3].position.y; float autosize = Mathf.Min(tagSprites.size, Mathf.Max(spacewid, spaceheight)); float spacesize = Mathf.Min(spacewid, spaceheight); int fillspacecnt = Mathf.RoundToInt(autosize / spacesize); for (int i = 0; i < fillspacecnt; i++) { stringBuilder.Append(palceholder); } if (fillspacecnt > 0) { SpriteTagInfo tempSpriteTag = new SpriteTagInfo(); tempSpriteTag.ID = atlasId; tempSpriteTag.Tag = atlasTag; tempSpriteTag.Size = new Vector2(autosize, autosize); tempSpriteTag.pos = new Vector3[4]; tempSpriteTag.uv = tagSprites.spritegroups[0].uv; tempSpriteTag.FillIdxAndPlaceHolder(stringBuilder.Length * 4 - 1, matchindex, fillspacecnt); text.AddFillData(tempSpriteTag); } } } }
int FillText(InlineText text, string currenttext, ref TextCotext context, ref TextElementResult result) { int errcode = 0; //text generate Vector2 extents = text.rectTransform.rect.size; var settings = text.GetGenerationSettings(extents); text.cachedTextGenerator.PopulateWithErrors(currenttext, settings, text.gameObject); // Apply the offset to the vertices IList <UIVertex> verts = text.cachedTextGenerator.verts; float unitsPerPixel = 1 / text.pixelsPerUnit; //Last 4 verts are always a new line... (\n) int vertCount = verts.Count - 4; Vector2 roundingOffset = new Vector2(verts[0].position.x, verts[0].position.y) * unitsPerPixel; roundingOffset = text.PixelAdjustPoint(roundingOffset) - roundingOffset; bool rdeq = roundingOffset != Vector2.zero; int emojiindex = 0; _cache.Clear(); for (int vertidx = 0; vertidx < vertCount; ++vertidx) { int tempVertsIndex = vertidx & 3; int textidx = vertidx / 4; int ctype; bool isinvert = GetIsInVert(ref result, emojiindex, textidx, out ctype); bool isvisiable = IsVisiableType(ctype); ; if (context.Settings.DoubleRender || isvisiable || !isinvert) { FillTextVerts(verts, vertidx, unitsPerPixel, roundingOffset, rdeq); if (tempVertsIndex == 3) { for (int m = 0; m < 4; m++) { result.MeshGroup.TextMeshResult.TextVerts.Add(m_TempVerts[m]); } } } if (isinvert) { int nexttype; int lasttype; bool nextisinvert = GetIsInVert(ref result, emojiindex, textidx + 1, out nexttype); bool lastisinvert = GetIsInVert(ref result, emojiindex, textidx - 1, out lasttype); bool next = nextisinvert && nexttype == ctype; bool last = lastisinvert && lasttype == ctype; if (tempVertsIndex == 0) { if (!last)//qi点 { FillEmojiTextVerts(verts, vertidx, unitsPerPixel, roundingOffset, rdeq); } //else //{ // //skip //} } else if (tempVertsIndex == 1) { if (!next) { FillEmojiTextVerts(verts, vertidx, unitsPerPixel, roundingOffset, rdeq); } //else //{ // //skip //} } else if (tempVertsIndex == 2) { if (!next) { FillEmojiTextVerts(verts, vertidx, unitsPerPixel, roundingOffset, rdeq); if (last)//终点 { bool needfix = result.ParseGroup.NeedFix(emojiindex); errcode = Render(ref result, isvisiable, emojiindex, needfix); } } //else //{ // //skip //} } else if (tempVertsIndex == 3) { if (!last) { FillEmojiTextVerts(verts, vertidx, unitsPerPixel, roundingOffset, rdeq); if (!next)//终点 { bool needfix = result.ParseGroup.NeedFix(emojiindex); errcode = Render(ref result, isvisiable, emojiindex, needfix); emojiindex++; } } else if (last && !next) { emojiindex++; } //else //{ // //skip //} } } } return(errcode); }