当前位置: 首页 > ai >正文

在 Unity 中,Start 方法直接设置 RectTransform 的位置,时出现问题,与预计位置不匹配。

         改动之前的源代码:发现组件的位置,与设计的位置不一样,但是如果把这段代码,交给一个按钮按下回调,就不会出现问题

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)使用了 VerticalLayoutGroupGridLayoutGroup 等布局组件,这些组件会在 Start 之后自动调整子对象的位置。
2. Canvas 渲染延迟
  • Canvas 的渲染发生在帧末尾,如果在 Start 中立即修改 UI 元素属性,可能因 Canvas 未准备好导致计算错误。

 

解决方案:

1. 使用协程延迟初始化
在 Start 中启动协程,等待一帧让布局系统完成计算后再设置位置:

改动后源代码:完美解决!!

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 方法的执行。
  • 关键解决
    1. 使用协程延迟到下一帧初始化。
    2. 禁用自动布局组件或使用 anchoredPosition 手动定位。
    3. 确保坐标系和锚点设置正确。
http://www.xdnf.cn/news/9153.html

相关文章:

  • Vue 3.0 中provide常见使用场景
  • 一个开源的多播放源自动采集在线影视网站
  • GitCode镜像仓库批量下载开发实录
  • 【Redis】过期键删除策略,LRU和LFU在redis中的实现,缓存与数据库双写一致性问题,go案例
  • 第12次08: 省市县区三级联动收货地址
  • 沉石鱼惊旋
  • CVE-2021-44228源码分析与漏洞复现
  • Redis学习打卡-Day7-高可用(下)
  • 学习心得(19)如何验证Form表单里的数据是对的?
  • 并发基础|进程与线程
  • 使用NSIS 和 VNISEdit 打包 electron 程序为 exe 向导式安装包
  • 制药行业数字化转型:从挑战到智能化落地的实践路径
  • 嵌入式学习Day28
  • FreeRTOS——事件标志组
  • Java 权威方案:彻底修复 OPTIONS 方法安全漏洞(附企业级案例与测试指南)
  • 今日行情明日机会——20250526
  • 固态硬盘不识别或掉盘如何解决?——以Kingston FURY Renegade G5为例
  • Qwen-Agent的使用示例-天气查询(function calling)
  • 电子电路原理第十七章(线性运算放大器电路的应用)
  • 【登录优化】redis删除旧token
  • AI测试进入智能体时代:AutoGen 、 Coze、CrewAI 谁主沉浮?
  • C++ STL map multimap 查找操作详解
  • 2025-5-26Vue3快速上手
  • Nginx location匹配模式详解
  • 解锁 MCP 中的 JSON-RPC:跨平台通信的奥秘
  • nfs下载镜像报错File lookup fail,TTTTTTTTTTTTTTT,内核 6.11.0降到5.15.0
  • JAVA面试复习知识点
  • 【沉浸式解决问题】基于泛型递归,Java中实体类基类开启MybatisPlus的ActiveRecord模式
  • PID控制学习(位置式,增量式,算法优化,多环串级PID)
  • LitCTF 2025 Robbie Wanna Revenge