예제 #1
0
        public static GameObject GO <T>(T parentTextElement, Char[] chars) where T : LTElement, ILayoutableText
        {
            var emojiOrMarkStr = new string(chars);

            var go = parentTextElement.GenerateGO(emojiOrMarkStr);

            // TMProのレイアウトをするためには、ここでCanvasに乗っている親要素の上に載せるしかない。
            go.transform.SetParent(parentTextElement.transform, false);


            var emojiRect = go.AddComponent <InternalEmojiRect>();

            // 文字をセットする場所としてRectTransformを取得、レイアウトのために高さに無限値をセット
            var rectTrans = go.GetComponent <RectTransform>();
            // フォント情報を取得するためにT型をセットし、そこからTMProのcomponentを取り出す。そこに絵文字をセットし、絵文字画像を得る。
            var textComponent = go.GetComponent <TextMeshProUGUI>();

            textComponent.enableWordWrapping = true;
            textComponent.text  = emojiOrMarkStr;
            rectTrans.sizeDelta = Vector2.positiveInfinity;
            var textInfos = textComponent.GetTextInfo(emojiOrMarkStr);

            textComponent.enableWordWrapping = false;

            var lines = textInfos.lineCount;

            if (lines != 1)
            {
                throw new Exception("unsupported emoji/mark pattern.");
            }

            var lineInfo   = textInfos.lineInfo[0];
            var lineWidth  = lineInfo.length;
            var lineHeight = lineInfo.lineHeight;

            // サイズの更新
            var size = new Vector2(lineWidth, lineHeight);

            // 絵文字/記号部分を左上アンカーにすると、高さがNanにならずに絵文字/記号スプライトが表示される。
            if (0 < rectTrans.childCount)
            {
                var emojiRectTrans = rectTrans.GetChild(0).GetComponent <RectTransform>();
                emojiRectTrans.pivot            = new Vector2(0, 1);
                emojiRectTrans.anchorMin        = new Vector2(0, 1);
                emojiRectTrans.anchorMax        = new Vector2(0, 1);
                emojiRectTrans.anchoredPosition = Vector2.zero;
            }
            else
            {
                // target mark or emoji is missing,
                LayouTaro._OnMissingCharacter(chars);
            }

            // この文字オブジェクト自体の位置、サイズを規定する
            rectTrans.anchoredPosition = Vector2.zero;
            rectTrans.sizeDelta        = size;

            // 後ほど取得できるサイズを決定する
            emojiRect.Size = size;
            return(go);
        }