首页 > 解决方案 > 通过脚本设置文本宽度组件

问题描述

我正在实例化图像上的排行榜(https://imgur.com/a/I0aVSaR),问题是,我无法正确对齐中间行的数字。

我认为如果我设置右行数字的宽度,中心行将对齐。现在右行的元素有不同的宽度。

我现在的问题是如何通过脚本设置宽度,我已经尝试过 rectransform.deltaSize、SetSizeWithCurrentAnchors 和其他类似的东西,但没有运气。

我还尝试在布局元素的检查器上设置首选宽度,但被忽略(https://imgur.com/a/O3hDeGN)。

这是创建元素的方式:

   for (int i = 0; i < leaderboardEntries.Count; i++) 
   {
        Transform newEntry = Instantiate(entryPrefab);
        newEntry.SetParent(leaderboardEntriesPanel);

        Text entryName = newEntry.GetChild(0).GetComponent<Text>();
        Text entryScore = newEntry.GetChild(1).GetComponent<Text>();
        Text entryRank = newEntry.GetChild(2).GetComponent<Text>();

        entryName.text = leaderboardEntries[i].getName();
        entryScore.text = leaderboardEntries[i].getScore().ToString();
        entryRank.text = (i+1).ToString();

        entryName.alignment = TextAnchor.UpperLeft;
        entryScore.alignment = TextAnchor.UpperRight;
        entryRank.alignment = TextAnchor.UpperRight;

    }

中间一行是分数,左行是姓名,右行是排名。

谢谢!

标签: c#unity3d

解决方案


如果你想改变 RectTransform 的宽度和高度,你可以试试这个:

rectTransform.sizeDelta = new Vector2( width, height); 

但是修复它们的对齐需要别的东西,首先,所有对齐应该是相同的,例如 UpperLeft 或 MiddleLeft。然后将所有条目的锚点也设置为相同的值。那么这样的事情应该可以正常工作:

// in this example I considered all anchor points are middle left and all 
// alignments are middle left too

float width = leaderboardEntriesPanel.GetComponent<RectTransform>().rect.width;
for (int i = 0; i < leaderboardEntries.Count; i++) 
   {
        Transform newEntry = Instantiate(entryPrefab);
        newEntry.SetParent(leaderboardEntriesPanel);

        Text entryName = newEntry.GetChild(0).GetComponent<Text>();
        Text entryScore = newEntry.GetChild(1).GetComponent<Text>();
        Text entryRank = newEntry.GetChild(2).GetComponent<Text>();

        entryName.text = leaderboardEntries[i].getName();
        entryScore.text = leaderboardEntries[i].getScore().ToString();
        entryRank.text = (i+1).ToString();

        entryName.GetComponent<RectTransform>().anchoredPosition = new Vector2(width / 15, entryName.GetComponent<RectTransform>().anchoredPosition.y);
        entryScore.GetComponent<RectTransform>().anchoredPosition = new Vector2(width / 2, entryScore.GetComponent<RectTransform>().anchoredPosition.y);
        entryRank.GetComponent<RectTransform>().anchoredPosition = new Vector2(width * 4 / 5, entryRank.GetComponent<RectTransform>().anchoredPosition.y);

    }

推荐阅读