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 } }
public int DoStep(ref TextCotext context, EmojiEvent uievent) { if (uievent == EmojiEvent.PreRender) { int errcode = 0; foreach (var target in context.RebuildTexts) { if (target == null) { continue; } string text = target.text; if (text.Length > 16381) //65535/4-1 { errcode = (int)EmojiErrorCode.TooMuchChars; continue; } ParseTextResult result = new ParseTextResult(); int index = context.AllTexts.IndexOf(target); if (index != -1) { result = context.Results[index].ParseGroup.TextResult; result.Clear(); } if (_sb == null) { _sb = new StringBuilder(); } _sb.Capacity = text.Length; int textstart = -1; int start = 0; int flag = 0; for (int i = 0; i < text.Length; i++) { char subchar = text[i]; if (subchar == ParsetLeft) { if (flag == 0) { start = i; result.GetPoints().Add(_sb.Length); } flag++; } else if (subchar == ParsetRight) { flag--; if (flag == 0) { string substr = text.Substring(start, i - start + 1); result.GetElements().Add(substr); // textstart = -1; } } else if (flag == 0)//正常显示内容 { if (textstart < 0) { textstart = i; } _sb.Append(subchar); } } if (flag > 0) { string substr = text.Substring(start); _sb.Append(substr); } result.FormatString = _sb.ToString(); FillPart(target, result.FormatString, 0, result.FormatString.Length - 1, ref result); _sb.Length = 0; //assign if (index == -1) { TextElementResult elementresult = new TextElementResult(); elementresult.RenderId = target.GetHashCode(); elementresult.ParseGroup.TextResult = result; elementresult.ParseGroup.fillplacemap = new EmojiList <int>(64); context.AllTexts.Add(target); context.Results.Add(elementresult); } else { TextElementResult elementresult = context.Results[index]; elementresult.ParseGroup.TextResult = result; elementresult.ParseGroup.fillplacemap.Clear(); context.Results[index] = elementresult; } } return(errcode); } return(0); }