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

news/2025/1/11 19:32:29/

发包前禁用了UI上面一个调试页面A后,发现无法正确获取某一个用了LayoutGroup>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 updatevoid Start(){// 游戏第一帧无法直接获取LayoutGroup>GridLayoutGroup组件下子物体的世界坐标Debug.Log("LayoutGroup: " + this.transform.position);foreach (Transform transform in this.transform){// 这里会连续打印多个相同的坐标Debug.Log(transform.name + ": " + transform.position);}// 方法1:获取坐标前强制刷新布局ForceRebuildLayoutImmediate// 这是一个静态方法,用于立即重建指定 RectTransform 上的布局,确保所有布局组件// (如 HorizontalLayoutGroup、VerticalLayoutGroupLayoutGroup>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.ppmy.cn/news/1562313.html

相关文章

培训机构Day27

今天看老师给我们实现了登录功能前后端实现&#xff0c;在不借助成熟框架来实现对于初学者来说难度确实很大。需要大量时间练习。 知识点&#xff1a; 设计模式&#xff1a;面向对象的语言。对某个特定领域特定场景问题的最佳解决方案。 1.单例模式。singleton。单个实例&…

分享几个高清无水印国外视频素材网站

在数字内容创作日益盛行的今天&#xff0c;高质量的视频素材成为了视频制作、广告创意和多媒体项目中不可或缺的元素。对于追求专业水准的创作者而言&#xff0c;高清、无水印的视频素材是确保作品质量的基石。以下将分享几个优质的视频素材网站&#xff0c;为您的创作之路提供…

k8s里面etcd的作用

etcd 是 Kubernetes 集群中一个至关重要的组件,它是一个开源的分布式键值存储系统,主要用于存储和管理 Kubernetes 集群的配置和状态信息。以下是 etcd 在 Kubernetes 中的具体作用和功能: ### 1. **集群状态存储** etcd 是 Kubernetes 集群的持久化存储后端,负责存储和管…

VUE3 VITE项目在 npm 中,关于 Vue 的常用命令有一些基础命令

如果你正在使用 Vite 构建的 Vue 3 项目&#xff0c;并且想要使用相关的 Vue 和 Vite 工具&#xff0c;下面是一些常用的命令和步骤来创建和管理 Vue 项目。 1. 使用 npm create 创建 Vue 3 项目&#xff08;Vite&#xff09; 如果你还没有创建项目&#xff0c;可以使用以下命…

AI多模态技术介绍:视觉语言模型(VLMs)指南

本文作者&#xff1a;AIGCmagic社区 刘一手 AI多模态全栈学习路线 在本文中&#xff0c;我们将探讨用于开发视觉语言模型&#xff08;Vision Language Models&#xff0c;以下简称VLMs&#xff09;的架构、评估策略和主流数据集&#xff0c;以及该领域的关键挑战和未来趋势。通…

[Qt] 多元素控件 | 容器类控件 | 布局管理器layout

目录 一.多元素控件 1、List Widget 【使用 ListWidget】 2、Table Widget 【使用 QTableWidget】 3、Tree Widget 【使用 QTreeWidget】 二、容器类控件 1、Group Box 【给麦当劳案例加上分组框】 2、Tab Widget 【使用标签页管理多组控件】 三、布局管理器 1、…

容器技术思想 Docker K8S

容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前&#xff0c;程序直接部署在物理服务器上&#xff0c;依赖管理复杂&#xff0c;包括各类运行依赖&#xff0c;且易变&#xff0c;多程序混合部署时还可能产生依赖冲突&#xff0c;给程序…

Golang HTML 模板使用指南

Golang HTML 模板使用指南 1. 基础模板示例 1.1 简单页面模板 <!-- templates/layout.html --> <!DOCTYPE html> <html> <head><title>{{.Title}}</title><meta charset"utf-8"><meta name"viewport" con…