コード例 #1
0
        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
            }
        }
コード例 #2
0
        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);
                    }
                }
            }
        }
コード例 #3
0
        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);
        }