unity3d Unity sizeDelta高度返回不正确的值

yhqotfr8  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(278)

我有这个矩形转换:

它是我的悬停GUI的一部分。每次我悬停在某个东西上时,GUI都会充满信息(正因为如此,高度是动态的)并移动到我悬停的对象上。
有时GUI不在屏幕上,要将其移回视图,我需要知道当前高度。
上图是一个示例,当前高度为545.01,但我的脚本记录了一个不同的高度:

RectTransform hoverElementRect = instance.hoverGUI.GetComponent<HoverGUI_Components>().GetHoverElement().GetComponent<RectTransform>();

Debug.Log(hoverElementRect.sizeDelta); // gives (450, 842)

这怎么可能呢?
我现在没有太多的代码,我是一个新手在统一,也许有人已经有了一个想法,but here is the whole GUI postioning and creating code
相关部分在最后。
编辑:

foreach (RectTransform rect in instance.hoverGUI.GetComponent<HoverGUI_Components>().GetHoverElement().GetComponentsInChildren<RectTransform>()) {
    LayoutRebuilder.ForceRebuildLayoutImmediate(rect);
    rect.ForceUpdateRectTransforms();
}

RectTransform hoverElementRect = instance.hoverGUI.GetComponent<HoverGUI_Components>().GetHoverElement().GetComponent<RectTransform>();

LayoutRebuilder.ForceRebuildLayoutImmediate(hoverElementRect);
hoverElementRect.ForceUpdateRectTransforms();

ForceUpdateRectTransforms()不会转换任何东西。我甚至在整个GUI对象中的所有rect上都使用过它。我甚至尝试在我做过的每个操作后使用它。

mzmfm0qo

mzmfm0qo1#

您可以使用LayoutUtility.GetPreferredHeight(rectTransform)修复您的特定问题。不要强制更新任何内容。
这里有一个扩展方法,通常可能会有帮助。您可能需要为您的特定应用程序重新排序检查。

public static class RectTransformExtension
    {
        /// <summary>Sometimes sizeDelta works, sometimes rect works, sometimes neither work and you need to get the layout properties.
        /// This method provides a simple way to get the size of a RectTransform, no matter what's driving it or what the anchor values are.
        /// </summary>
        /// <param name="rectTransform">The rect transform to check.</param>
        /// <returns>The proper size of the RectTransform.</returns>
        public static Vector2 GetProperSize(this RectTransform rectTransform) //, bool attemptToRefreshLayout = false)
        {
            Vector2 size = new Vector2(rectTransform.rect.width, rectTransform.rect.height);

            if (size.x == 0 && size.y == 0)
            {
                size.x = LayoutUtility.GetPreferredWidth(rectTransform);
                size.y = LayoutUtility.GetPreferredHeight(rectTransform);
            }

            if (size.x == 0 && size.y == 0)
            {
                LayoutGroup layoutGroup = rectTransform.GetComponent<LayoutGroup>();

                if (layoutGroup != null)
                {
                    size.x = layoutGroup.preferredWidth;
                    size.y = layoutGroup.preferredHeight;
                }
            }

            return size;
        }
    }
esyap4oy

esyap4oy2#

在awake方法中调用的sizeDelta和在start方法中调用的sizeDelta可能会产生不同的结果。

sigwle7e

sigwle7e3#

是的,总是使用

hoverElementRect.rect.size

代替

hoverElementRect.sizeDelta
nuypyhwy

nuypyhwy4#

我知道这个问题已经过时了,但我还是要分享我的简单解决方案:请确保您已将“using UnityEngine.UI”命名空间添加到脚本中。否则,RectTransform.sizeDelta将返回错误的值。

相关问题