unity RectTransform.sizeDelta 不改变大小

Unity RectTransform.sizeDelta doesn't change size

我正在尝试更改具有 TextMeshPro - Text (UI) 组件的游戏对象的大小以适合其父对象。这是代码。

static public Cube CreateCube(Transform parent, Vector2 anchors, Vector2 position)
{
    Cube c = Instantiate(cubePrefab); // prefab has Cube component

    var tr = (RectTransform)c.transform;
    tr.SetParent(parent); // canvas or other 2d object
    tr.anchorMin = tr.anchorMax = anchors;
    tr.anchoredPosition = position;

    var textObj = new GameObject("Text");

    var textTr = textObj.AddComponent<RectTransform>();
    textTr.SetParent(tr);
    textTr.anchorMin = textTr.anchorMax = Vector2.one / 2; // anchors at the center of the parent
    textTr.anchoredPosition = Vector2.zero;

    // tr.sizeDelta is Vector2(60, 60) from prefab;
    print(new Vector2(tr.sizeDelta.x, tr.sizeDelta.y * 2 / 3)); // Vector2(60, 40)
    textTr.sizeDelta = new Vector2(tr.sizeDelta.x, tr.sizeDelta.y * 2 / 3); // width is the same as parent's width
    // height is two thirds of parent's height
    print(textTr.sizeDelta); // also Vector2(60, 40)

    var text = textObj.AddComponent<TextMeshProUGUI>();
    text.text = "Test";
    text.fontSize = 14;
    text.alignment = TextAlignmentOptions.Center;

    return c;
}

第二个 print 显示 sizeDelta 已设置,但在检查器和场景中大小为 (200, 50) 就像没有 textTr.sizeDelta = ... 行一样。

但是如果我添加

private void Start()
{
    ((RectTransform)transform.GetChild(0)).sizeDelta = new Vector2(60, 40);
}

进入Cubeclass,就可以了。为什么我创建文本时它不起作用?

对象层次结构:

-> 一些二维对象

---> 具有 Cube 组件的对象

-----> 文本对象

Canvas 层次结构在您创建并向其中添加新对象时不会立即计算,并且通常可能会导致一些不可预知的结果。推荐的解决方法是在创建对象后至少等待 1 帧,然后才应用对 sizeDelta 等属性的更改。您可以使用 Coroutine 执行此操作并使用 yield return null 跳过 1 帧。作为您特定用例的替代方案,您可以尝试使用 RectTransform.SetSizeWithCurrentAnchors 而不是直接设置 sizeDelta,我会先尝试这种方法。

    textRt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal,  60);
    textRt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical,  40);