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

[Unity]发包前遇到的坑之GridLayoutGroup

发包前禁用了UI上面一个调试页面A后,发现无法正确获取某一个用了GridLayoutGroup组件的所有子物体的世界坐标。

一顿研究之后发现,在Start的时候想要正确获取其坐标,需要强制刷新一次布局,方法如下:
 

UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(this.GetComponent<RectTransform>());

至于为什么启用了调试页面A之后就能正确获取子物体的世界坐标,我猜是因为启用调试页面A后,整个预制体的Start时间变长,或者页面计算布局耗时更久,导致可以正确获取坐标。(有待验证)。

以下是在demo里总结的一些经验,非常容易理解,直接贴代码了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestLayoutGroup : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 游戏第一帧无法直接获取GridLayoutGroup组件下子物体的世界坐标
        Debug.Log("LayoutGroup: " + this.transform.position);

        foreach (Transform transform in this.transform)
        {
            // 这里会连续打印多个相同的坐标
            Debug.Log(transform.name + ": " + transform.position);
        }


        // 方法1:获取坐标前强制刷新布局ForceRebuildLayoutImmediate
        // 这是一个静态方法,用于立即重建指定 RectTransform 上的布局,确保所有布局组件
        // (如 HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup)更新它们的子元素。
        /*        UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(this.GetComponent<RectTransform>());

                Debug.Log("LayoutGroup: " + this.transform.position);

                foreach (Transform transform in this.transform)
                {
                    Debug.Log(transform.name + ": " + transform.position);
                }*/


        // 方法2:在当前帧结束后再获取子物体坐标
        //StartCoroutine(IEGetChildPosition());

    }

    IEnumerator IEGetChildPosition()
    {
        Debug.Log("LayoutGroup: " + this.transform.position);
        yield return new WaitForEndOfFrame();
        foreach (Transform transform in this.transform)
        {
            Debug.Log(transform.name + ": " + transform.position);
        }
    }
}

写到这里,发现yield return new WaitForEndOfFrame()未必靠谱,假如帧时间过长,这么处理可能未必可以正确获取到想要的坐标。

所以建议在获取坐标前先使用ForceRebuildLayoutImmediate强制刷新布局。


http://www.kler.cn/a/487773.html

相关文章:

  • STM32的存储结构
  • 远程和本地文件的互相同步
  • Git:Cherry-Pick 的使用场景及使用流程
  • Unity3D使用GaussianSplatting加载高斯泼溅模型
  • [免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】
  • vivado时序约束和优化
  • Nginx不支持HTTP请求头中包含下划线_的解决办法
  • 详解 Docker 启动 Windows 容器第一篇:多种方式及实用配置指南
  • [IoT]详细设计:智能农业监控系统
  • LabVIEW轴承性能测试系统
  • 【HTML+CSS+JS+VUE】web前端教程-27-弹性盒模型(flex box)
  • uniapp小程序中隐藏顶部导航栏和指定某页面去掉顶部导航栏小程序
  • 江科大STM32入门——输入捕获笔记总结
  • Makefile文件/其他文件中出现的“变量/符合”,如何查看定义?
  • verilogHDL仿真详解
  • JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名
  • huggingface上下载数据
  • Python自学 - 类进阶(可调用对象)
  • 《上古重生》V20241127111039官方中文学习版
  • 将光源视角的深度贴图应用于摄像机视角的渲染
  • 系统架构设计师考点—计算机网络
  • 命令模式详解与应用
  • TensorFlow Quantum快速编程(基本篇)
  • CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布
  • 【计算机网络】什么是网关(Gateway)?
  • 国产游戏崛起,燕云十六移动端1.9上线,ToDesk云电脑先开玩