Пример #1
0
        void GenerateText()
        {
            bool regenText = isTextDirty || lastExtents != rectTransform.rect.size;

            if (isTextDirty)
            {
                isTextDirty = false;
                if (m_hrefText == null)
                {
                    m_hrefText = new HrefText();
                }
                if (info.OriginalText != originalText)
                {
                    m_hrefText.getHrefList.Clear();
                    string m_outText = m_hrefText.getResolveText(originalText);

                    if (m_ImageFont)
                    {
                        info = m_ImageFont.ReplaceText(m_outText, imageSize);
                    }
                    else
                    {
                        return;
                    }
                }
                m_Text = info.ReplacedText;
            }
            if (info.Symbols == null)
            {
                return;
            }
            if (regenText)
            {
                lastExtents = rectTransform.rect.size;
                List <UIVertex> textVertList = null;
                if (!isPureEmoji || IgnoreVertexCache || vertCache == null || !vertCache.TryGetValue(info.Symbols.Length, out textVertList))
                {
                    textVertList = new List <UIVertex>();
                    OnTextFillVBO(textVertList);

                    // 处理超链接包含的点击区域
                    foreach (var hrefInfo in m_hrefText.getHrefList)
                    {
                        hrefInfo.boxes.Clear();
                        if (hrefInfo.startIndex >= textVertList.Count)
                        {
                            continue;
                        }

                        // 将超链接里面的文本顶点索引坐标加入到点击区域内
                        var pos    = textVertList[hrefInfo.startIndex];
                        var bounds = new Bounds(pos.position, Vector3.zero);
                        for (int i = hrefInfo.startIndex, m = hrefInfo.endIndex; i < m; i++)
                        {
                            if (i >= textVertList.Count)
                            {
                                break;
                            }

                            pos = textVertList[i];
                            if (pos.position.x < bounds.min.x) // 换行重新添加点击区域
                            {
                                hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size));
                                bounds = new Bounds(pos.position, Vector3.zero);
                            }
                            else
                            {
                                bounds.Encapsulate(pos.position); //再次扩展范围
                            }
                        }
                        hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size));
                    }

                    if (isPureEmoji && !IgnoreVertexCache)
                    {
                        if (vertCache == null)
                        {
                            vertCache = new Dictionary <int, List <UIVertex> >();
                        }
                        vertCache[info.Symbols.Length] = textVertList;
                    }
                }
                Vector3 offset = new Vector3(0, -fontSize / 4f, 0);
                int     newIdx = 0;
                int     skip   = 0;
#if !UNITY_5_2
                int totalSkip = 0;
#endif
                SymbolSpriteInfo lastSprite = default(SymbolSpriteInfo);
                int  counter    = 0;
                bool isLastSkip = false;
                vertImg.Clear();
                vertTxt.Clear();

                for (int i = 0; i < textVertList.Count; i++)
                {
                    if (skip > 0)
                    {
#if UNITY_5_2
                        if (skip <= 4 && skip > 0)
#else
                        int processed = totalSkip - skip;
                        if (processed < 4)
#endif
                        {
                            UIVertex vert = new UIVertex();
                            UIVertex old  = textVertList[i];
#if UNITY_5_2
                            int idx = 4 - skip;
#else
                            int idx = processed;
#endif
                            vert.position = old.position + offset;
                            vert.uv0      = lastSprite.UV[idx];
                            vert.normal   = old.normal;
                            vert.tangent  = old.tangent;
                            Color32 col = new Color32(255, 255, 255, 255);
                            col.a      = old.color.a;
                            vert.color = col;
                            vertImg.Add(vert);

                            /*m_TempVerts[idx] = vert;
                             * if (idx == 3)
                             * {
                             *  vhImg.AddUIVertexQuad(m_TempVerts);
                             * }*/
                            counter++;
                        }
                        skip--;
                        continue;
                    }
                    if (newIdx < info.Symbols.Length)
                    {
                        int idx = counter / 4;
                        lastSprite = info.Symbols[newIdx];
                        if (idx == lastSprite.Index)
                        {
#if UNITY_5_2
                            skip = info.ReplacedSpriteLength * 4 - 1;
#else
                            totalSkip = info.ReplacedSpriteLength * 4;
                            i--;
                            skip = totalSkip;
#endif
                            newIdx++;
                            continue;
                        }
                    }
                    int tmpIdx = counter % 4;
                    if (tmpIdx == 0)
                    {
                        //filter junk vertices
                        if (textVertList[i].position == textVertList[i + 1].position)
                        {
                            isLastSkip = true;
                        }
                        else
                        {
                            isLastSkip = false;
                        }
                    }
                    if (!isLastSkip)
                    {
                        vertTxt.Add(textVertList[i]);
                    }

                    /*m_TempVerts[tmpIdx] = textVertList[i];
                     * if (tmpIdx == 3)
                     * {
                     *  if (_toFill != null)
                     *  {
                     *      _toFill.AddUIVertexQuad(m_TempVerts);
                     *  }
                     * }*/
                    counter++;
                }
            }
            else
            {
                Color32 col = color;
                for (int i = 0; i < vertImg.size; i++)
                {
                    var vert = vertImg[i];
                    vert.color = new Color32(255, 255, 255, col.a);
                    vertImg[i] = vert;
                }
                for (int i = 0; i < vertTxt.size; i++)
                {
                    var vert = vertTxt[i];
                    vert.color = col;
                    vertTxt[i] = vert;
                }
            }
            if (_toFill != null)
            {
                FillUIQuad(_toFill, vertTxt);
            }
            if (m_CachedInputRenderer)
            {
                m_CachedInputRenderer.ImageVertices = vertImg;
            }
        }
Пример #2
0
        public ReplacementInfo ReplaceText(string text, float imgSize = 0f)
        {
            if (needRebuild || rootNode == null)
            {
                RebuildMapping();
            }

            ReplacementInfo res = new ReplacementInfo();

            res.OriginalText = text;
            List <DirtyWordNode> replacement;

            text.ReplaceDirtWord(rootNode, out replacement);
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            res.Symbols = new SymbolSpriteInfo[replacement.Count];

            int curIdx       = 0;
            int newIdx       = 0;
            int appendLength = 0;
            int idx          = 0;

            foreach (var i in replacement)
            {
                SymbolSpriteInfo info = new SymbolSpriteInfo();

                sb.Append(text.Substring(curIdx, i.Index - curIdx));
                int prefixLength = 0;
                if (imgSize != 0)
                {
                    int b = sb.Length;
                    sb.Append("<size=");
                    sb.Append(imgSize);
                    sb.Append('>');
                    prefixLength = sb.Length - b;
                }
                appendLength += prefixLength;
                newIdx       += i.Index - curIdx + prefixLength;
                info.Index    = newIdx;
                newIdx++;

                Sprite sp = mapping[i.Word];
                info.UV = CalcUV(sp);

                Rect   r     = sp.rect;
                float  ratio = r.width / r.height;
                string rep   = string.Format("<quad width={0:0.00}>", ratio);
                res.ReplacedSpriteLength = rep.Length;
                sb.Append(rep);
                curIdx             = i.Index + i.Word.Length;
                res.Symbols[idx++] = info;
                if (imgSize != 0)
                {
                    sb.Append("</size>");
                    appendLength += 7;
                    newIdx       += 7;
                }
            }
            sb.Append(text.Substring(curIdx));
            res.ReplacedText = sb.ToString();

            return(res);
        }