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); }
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); }