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);
}
进入Cube
class,就可以了。为什么我创建文本时它不起作用?
对象层次结构:
-> 一些二维对象
---> 具有 Cube
组件的对象
-----> 文本对象
Canvas 层次结构在您创建并向其中添加新对象时不会立即计算,并且通常可能会导致一些不可预知的结果。推荐的解决方法是在创建对象后至少等待 1 帧,然后才应用对 sizeDelta 等属性的更改。您可以使用 Coroutine 执行此操作并使用 yield return null
跳过 1 帧。作为您特定用例的替代方案,您可以尝试使用 RectTransform.SetSizeWithCurrentAnchors 而不是直接设置 sizeDelta,我会先尝试这种方法。
textRt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 60);
textRt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 40);
我正在尝试更改具有 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);
}
进入Cube
class,就可以了。为什么我创建文本时它不起作用?
对象层次结构:
-> 一些二维对象
---> 具有 Cube
组件的对象
-----> 文本对象
Canvas 层次结构在您创建并向其中添加新对象时不会立即计算,并且通常可能会导致一些不可预知的结果。推荐的解决方法是在创建对象后至少等待 1 帧,然后才应用对 sizeDelta 等属性的更改。您可以使用 Coroutine 执行此操作并使用 yield return null
跳过 1 帧。作为您特定用例的替代方案,您可以尝试使用 RectTransform.SetSizeWithCurrentAnchors 而不是直接设置 sizeDelta,我会先尝试这种方法。
textRt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 60);
textRt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 40);