Пример #1
0
        private static List <LTElement> CollectSpriteAndTextElement <T>(T textElement, string contentText) where T : LTElement, ILayoutableText
        {
            var elementsWithEmoji = new List <LTElement>();

            var textStartIndex = 0;
            var length         = 0;

            for (var i = 0; i < contentText.Length; i++)
            {
                var firstChar = contentText[i];

                // \U0001F971
                var isSurrogate = Char.IsSurrogate(firstChar);
                if (isSurrogate)
                {
                    if (0 < length)
                    {
                        var currentText    = contentText.Substring(textStartIndex, length);
                        var newTextElement = textElement.GenerateGO(currentText).GetComponent <T>();
                        newTextElement.transform.SetParent(textElement.transform, false);
                        elementsWithEmoji.Add(newTextElement);
                    }

                    length = 0;

                    if (i == contentText.Length - 1)
                    {
                        // 続きの文字がないのでサロゲートペアではない。無視する。
                        // 文字の開始インデックスを次の文字へとセットする。
                        textStartIndex = i + 1;
                        continue;
                    }

                    var nextChar        = contentText[i + 1];
                    var isSurrogatePair = Char.IsSurrogatePair(firstChar, nextChar);

                    if (isSurrogatePair)
                    {
                        // サロゲートペア確定。なので、要素として扱い、次の文字を飛ばす処理を行う。
                        var emojiElement = InternalEmojiRect.GO(textElement, new Char[] { firstChar, nextChar }).GetComponent <InternalEmojiRect>();
                        elementsWithEmoji.Add(emojiElement);

                        // 文字は次の次から始まる、、かもしれない。
                        textStartIndex = i + 2;
                        i = i + 1;
                        continue;
                    }

                    // ペアではなかったので、無視して次の文字へと行く。
                    textStartIndex = i + 1;
                    continue;
                }

                // spriteに含まれている文字になる場合
                var codePoint = (uint)char.ConvertToUtf32(contentText, i);
                {
                    var spriteAsset = TMPro.TMP_Settings.GetSpriteAsset();
                    if (-1 < spriteAsset.GetSpriteIndexFromUnicode(codePoint))
                    {
                        if (0 < length)
                        {
                            var currentText    = contentText.Substring(textStartIndex, length);
                            var newTextElement = textElement.GenerateGO(currentText).GetComponent <T>();
                            newTextElement.transform.SetParent(textElement.transform, false);
                            elementsWithEmoji.Add(newTextElement);
                        }

                        length = 0;

                        // Sprite確定。なので、要素として扱い、次の文字を飛ばす処理を行う。
                        var emojiElement = InternalEmojiRect.GO(textElement, new Char[] { firstChar }).GetComponent <InternalEmojiRect>();
                        elementsWithEmoji.Add(emojiElement);

                        // 文字は次から始まる、、かもしれない。
                        textStartIndex = i + 1;
                        continue;
                    }

                    // fallbackに登録されているSpriteAssetsも見る
                    var isFound = false;
                    foreach (var sAsset in spriteAsset.fallbackSpriteAssets)
                    {
                        if (-1 < sAsset.GetSpriteIndexFromUnicode(codePoint))
                        {
                            if (0 < length)
                            {
                                var currentText    = contentText.Substring(textStartIndex, length);
                                var newTextElement = textElement.GenerateGO(currentText).GetComponent <T>();
                                newTextElement.transform.SetParent(textElement.transform, false);
                                elementsWithEmoji.Add(newTextElement);
                            }

                            length = 0;

                            // Sprite確定。なので、要素として扱い、次の文字を飛ばす処理を行う。
                            var emojiElement = InternalEmojiRect.GO(textElement, new Char[] { firstChar }).GetComponent <InternalEmojiRect>();
                            elementsWithEmoji.Add(emojiElement);

                            // 文字は次から始まる、、かもしれない。
                            textStartIndex = i + 1;
                            isFound        = true;
                            break;// foreachを抜ける
                        }
                    }
                    if (isFound)
                    {
                        // 発見できたので消費する
                        continue;
                    }
                }

                // サロゲートやSpriteではないので文字として扱う
                length++;
            }

            // 残りの文字を足す
            if (0 < length)
            {
                var lastText        = contentText.Substring(textStartIndex, length);
                var lastTextElement = textElement.GenerateGO(lastText).GetComponent <T>();
                lastTextElement.transform.SetParent(textElement.transform, false);
                elementsWithEmoji.Add(lastTextElement);
            }

            return(elementsWithEmoji);
        }
Пример #2
0
        // TODO: Spriteにrenameする。
        private static void EmojiRectLayout(InternalEmojiRect rectElement, RectTransform transform, float viewWidth, ref float originX, ref float originY, ref float restWidth, ref float currentLineMaxHeight, ref List <RectTransform> lineContents, ref Vector2 wrappedSize)
        {
            var rectSize = rectElement.RectSize();

            RectLayout(rectElement, transform, rectSize, viewWidth, ref originX, ref originY, ref restWidth, ref currentLineMaxHeight, ref lineContents, ref wrappedSize);
        }
Пример #3
0
        private static List <LTElement> CollectEmojiAndMarkAndTextElement <T>(T textElement, string contentText) where T : LTElement, ILayoutableText
        {
            var elementsWithEmoji = new List <LTElement>();

            var textStartIndex = 0;
            var length         = 0;

            for (var i = 0; i < contentText.Length; i++)
            {
                var firstChar = contentText[i];

                // \u26A1
                var isSymbol = Char.IsSymbol(firstChar);
                if (isSymbol)
                {
                    if (0 < length)
                    {
                        var currentText    = contentText.Substring(textStartIndex, length);
                        var newTextElement = textElement.GenerateGO(currentText).GetComponent <T>();
                        newTextElement.transform.SetParent(textElement.transform, false);
                        elementsWithEmoji.Add(newTextElement);
                    }

                    length = 0;

                    // 記号確定。なので、要素として扱い、次の文字を飛ばす処理を行う。
                    var emojiElement = InternalEmojiRect.GO(textElement, new Char[] { firstChar }).GetComponent <InternalEmojiRect>();
                    elementsWithEmoji.Add(emojiElement);

                    // 文字は次から始まる、、かもしれない。
                    textStartIndex = i + 1;
                    continue;
                }

                // \U0001F971
                var isSurrogate = Char.IsSurrogate(firstChar);
                if (isSurrogate)
                {
                    if (0 < length)
                    {
                        var currentText    = contentText.Substring(textStartIndex, length);
                        var newTextElement = textElement.GenerateGO(currentText).GetComponent <T>();
                        newTextElement.transform.SetParent(textElement.transform, false);
                        elementsWithEmoji.Add(newTextElement);
                    }

                    length = 0;

                    if (i == contentText.Length - 1)
                    {
                        // 続きの文字がないのでサロゲートペアではない。無視する。
                        // 文字の開始インデックスを次の文字へとセットする。
                        textStartIndex = i + 1;
                        continue;
                    }

                    var nextChar        = contentText[i + 1];
                    var isSurrogatePair = Char.IsSurrogatePair(firstChar, nextChar);

                    if (isSurrogatePair)
                    {
                        // サロゲートペア確定。なので、要素として扱い、次の文字を飛ばす処理を行う。
                        var emojiElement = InternalEmojiRect.GO(textElement, new Char[] { firstChar, nextChar }).GetComponent <InternalEmojiRect>();
                        elementsWithEmoji.Add(emojiElement);

                        // 文字は次の次から始まる、、かもしれない。
                        textStartIndex = i + 2;
                        i = i + 1;
                        continue;
                    }

                    // ペアではなかったので、無視して次の文字へと行く。
                    textStartIndex = i + 1;
                    continue;
                }

                // サロゲートではないので文字として扱う
                length++;
            }

            // 残りの文字を足す
            if (0 < length)
            {
                var lastText        = contentText.Substring(textStartIndex, length);
                var lastTextElement = textElement.GenerateGO(lastText).GetComponent <T>();
                lastTextElement.transform.SetParent(textElement.transform, false);
                elementsWithEmoji.Add(lastTextElement);
            }

            return(elementsWithEmoji);
        }