예제 #1
0
        public static Rect CalcSizeFromText(XdObjectJson xdObject, float?width)
        {
            var rawText = xdObject.Text.RawText;

            var font      = xdObject.Style.Font;
            var fontAsset = AssetDatabase.FindAssets($"{font.PostscriptName}")
                            .Select(guid => AssetDatabase.GUIDToAssetPath(guid))
                            .Select(path => AssetDatabase.LoadAssetAtPath <Object>(path))
                            .OfType <TMP_FontAsset>()
                            .Select(x =>
            {
                x.HasCharacters(rawText, out var missingCharacters);
                return(missingCharacters.Count, x);
            })
                            .OrderBy(x => x.Count)
                            .FirstOrDefault()
                            .x;

            if (fontAsset == null)
            {
                Debug.LogWarning($"TextMeshPro Asset {font.PostscriptName} is not found");
                var textParser = new TextObjectParser();
                return(textParser.CalcSize(xdObject));
            }

            var position = Vector2.zero;
            var fontSize = font.Size;

            position.y -= fontAsset.faceInfo.ascentLine * (fontSize / fontAsset.faceInfo.pointSize);

            var dummyObject        = new GameObject("Dummy");
            var dummyRectTransform = dummyObject.AddComponent <RectTransform>();

            dummyRectTransform.sizeDelta = new Vector2(width ?? 0f, 0f);

            var textMeshPro = dummyObject.AddComponent <TextMeshProUGUI>();

            textMeshPro.font     = fontAsset;
            textMeshPro.fontSize = fontSize;
            textMeshPro.text     = rawText;
            if (width != null)
            {
                textMeshPro.enableWordWrapping = true;
            }

            var size = new Vector2(LayoutUtility.GetPreferredSize(dummyRectTransform, 0), LayoutUtility.GetPreferredSize(dummyRectTransform, 1));

            DestroyImmediate(dummyObject);

            var lines    = xdObject.Text.Paragraphs.SelectMany(x => x.Lines).ToArray();
            var lineMinX = lines.Min(x => x[0].X); // xは1要素目にだけ入っている
            var lineMinY = lines.SelectMany(l => l).Min(x => x.Y);

            position.x += lineMinX;
            position.y += lineMinY;

            return(new Rect(position, size));
        }
예제 #2
0
        public override Rect CalcSize(XdObjectJson xdObject)
        {
            if (xdObject.Text?.Frame?.Type == "positioned")
            {
                return(CalcSizeFromText(xdObject, null));
            }

            if (xdObject.Text?.Frame?.Type == "autoHeight")
            {
                return(CalcSizeAutoHeight(xdObject));
            }

            var textParser = new TextObjectParser();

            return(textParser.CalcSize(xdObject));
        }
예제 #3
0
        public override (IComponent[], IAsset[]) Render(XdObjectJson xdObject, Obb obb, XdAssetHolder assetHolder)
        {
            var textParser = new TextObjectParser();

            return(textParser.Render(xdObject, obb, assetHolder));
        }
예제 #4
0
        public override bool Is(XdObjectJson xdObject)
        {
            var textParser = new TextObjectParser();

            return(textParser.Is(xdObject));
        }