改动之前的源代码:发现组件的位置,与设计的位置不一样,但是如果把这段代码,交给一个按钮按下回调,就不会出现问题。
cs
void Start()
{
//初始化Text 行
//读取配置文件;
StaticDataObj obj = Resources.Load<StaticDataObj>("StaticDataObj");
//初始化Texts行;根据一页的行数;
GameObject gameObject = Resources.Load<GameObject>("ModelText");
for (int i = 0; i < PageLimit; i++)
{
//生成Text行;
GameObject OneLine = Instantiate(gameObject, AllLinesFather.transform);
OneLine.name = "Text_" + i;
RectTransform gameObjrect = OneLine.GetComponent<RectTransform>();
//设置Text 位置和大小;
gameObjrect.position = obj.linesMesList_1[i].pos;
Vector2 size = obj.linesMesList_1[i].size;
SetSize(gameObjrect, size.x, size.y);
Lines.Add(OneLine.GetComponent<Text>());
}
//初始化Text 属性;
foreach (Text text in Lines)
{
text.text = "";
// 修改字体
if (text != null && newFont != null)
{
text.font = newFont;
text.fontStyle = FontStyle.Bold; // 可选:设置字体样式
text.fontSize = 128; // 可选:调整字号
}
}
// 绑定选项改变事件
dropdown.onValueChanged.AddListener(OnDropdownValueChanged);
//初始化行字数限制;
LineLimit = int.Parse(fontNum.text);
}
问题原因
1. UI 布局计算滞后
Unity 的 UI 系统(Canvas、布局组件等)在 Start
阶段可能尚未完成初始化,此时直接设置 RectTransform
的位置/尺寸会被后续的自动布局覆盖。
典型场景 :父对象(AllLinesFather
)使用了 VerticalLayoutGroup
、GridLayoutGroup
等布局组件,这些组件会在 Start
之后自动调整子对象的位置。
2. Canvas 渲染延迟
Canvas 的渲染发生在帧末尾,如果在 Start
中立即修改 UI 元素属性,可能因 Canvas 未准备好导致计算错误。
解决方案:
1. 使用协程延迟初始化
在 Start
中启动协程,等待一帧让布局系统完成计算后再设置位置:
改动后源代码:完美解决!!
cs
IEnumerator InitializeTexts()
{
// 等待一帧,确保布局系统完成计算
yield return null;
//读取配置文件;
StaticDataObj obj = Resources.Load<StaticDataObj>("StaticDataObj");
//初始化Texts行;根据一页的行数;
GameObject gameObject = Resources.Load<GameObject>("ModelText");
for (int i = 0; i < PageLimit; i++)
{
//生成Text行;
GameObject OneLine = Instantiate(gameObject, AllLinesFather.transform);
OneLine.name = "Text_" + i;
RectTransform gameObjrect = OneLine.GetComponent<RectTransform>();
//设置Text 位置和大小;
gameObjrect.position = obj.linesMesList_1[i].pos;
Vector2 size = obj.linesMesList_1[i].size;
SetSize(gameObjrect, size.x, size.y);
Lines.Add(OneLine.GetComponent<Text>());
}
//初始化Text 属性;
foreach (Text text in Lines)
{
text.text = "";
// 修改字体
if (text != null && newFont != null)
{
text.font = newFont;
text.fontStyle = FontStyle.Bold; // 可选:设置字体样式
text.fontSize = 128; // 可选:调整字号
// SetScale(text.GetComponent<RectTransform>(), 0.1f);
// SetSize(text.GetComponent<RectTransform>(), 5947.3f, 284.28f);
}
}
}
void Start()
{
//初始化Text 行
StartCoroutine(InitializeTexts());
// 绑定选项改变事件
dropdown.onValueChanged.AddListener(OnDropdownValueChanged);
//初始化行字数限制;
LineLimit = int.Parse(fontNum.text);
}
总结
核心问题 :UI 布局计算滞后于 Start
方法的执行。
关键解决:
##### 使用协程延迟到下一帧初始化。
##### 禁用自动布局组件或使用 `anchoredPosition` 手动定位。
##### 确保坐标系和锚点设置正确。