Unity中实现自动适配尺寸的UI网格布局方案咨询
Unity UI 自定义网格布局实现方案
完全可行,不管是用Grid Layout Group配合脚本,还是纯手写脚本都能实现你的需求,下面是具体步骤:
一、标题文本的适配
- 给标题文本的
RectTransform设置锚点为(0.5, 1)、Pivot为(0.5, 1),让它固定在屏幕顶部居中位置。 - 动态设置标题高度:在脚本里获取屏幕高度,把标题的高度设为屏幕高度的10%,代码示例:
RectTransform titleRect = GetComponent<RectTransform>(); titleRect.sizeDelta = new Vector2(Screen.width, Screen.height * 0.1f); - 字体大小适配:给标题文本加
Content Size Fitter组件,把Vertical Fit设为Preferred Size;如果用TextMeshPro,还可以通过脚本根据标题区域高度动态调整字体大小,确保文本不会溢出且占满合理空间,比如:TMP_Text titleText = GetComponent<TMP_Text>(); titleText.fontSize = titleRect.rect.height * 0.8f; // 取高度的80%作为字体大小,避免贴边
二、网格布局实现(Grid Layout Group + 脚本)
- 先创建一个网格父容器,设置它的
RectTransform锚点为(0, 0)到(1, 0),Pivot为(0.5, 0.5),高度设为屏幕高度的90%,宽度铺满屏幕,确保它在标题下方且占满剩余区域。 - 给父容器添加
Grid Layout Group组件:- 设置
Constraint为Fixed Column Count,值设为3(每行3个对象) - 设置
Spacing为你需要的s值(水平和垂直间距可以分别设置) - 把
Alignment设为Middle Center,确保网格整体居中
- 设置
- 写脚本动态计算单元格尺寸:
把这个脚本挂在网格父容器上,关联好using UnityEngine; using UnityEngine.UI; public class GridAutoSize : MonoBehaviour { public GridLayoutGroup gridLayout; public float spacing = 20f; // 这里设置你要的s值 void Start() { UpdateGridSize(); } void OnRectTransformDimensionsChange() { UpdateGridSize(); // 屏幕尺寸变化时重新计算 } void UpdateGridSize() { float H = Screen.height * 0.9f; // 按你的公式计算单元格高度 float cellHeight = (H - 3 * spacing) / 2; // 计算单元格宽度,确保水平方向铺满且间距正确 float cellWidth = (Screen.width - 2 * spacing) / 3; gridLayout.cellSize = new Vector2(cellWidth, cellHeight); gridLayout.spacing = new Vector2(spacing, spacing); } }GridLayoutGroup组件即可。
三、纯脚本实现思路(不用Grid Layout Group)
如果不想用内置布局组件,也可以纯手写脚本控制每个Cat对象的位置和尺寸:
- 先计算每个Cat的尺寸:
cellHeight = (Screen.height*0.9f - 3*spacing)/2,cellWidth = (Screen.width - 2*spacing)/3 - 计算每行三个对象的X坐标:以屏幕中心为基准,向左偏移总宽度的一半,依次加上单元格宽度和间距
- 计算两行的Y坐标:先算出上下边距
margin = (H - (cellHeight*2 + spacing))/2,第一行Y中心为H - margin - cellHeight/2,第二行Y中心为margin + cellHeight/2 - 遍历所有Cat对象,逐个设置它们的
RectTransform的anchoredPosition和sizeDelta
注意事项
- 要监听屏幕尺寸变化事件(比如
OnRectTransformDimensionsChange或者Screen.onResize),确保布局在窗口缩放时能实时更新 - 如果Cat对象有固定宽高比,计算宽度时要按比例调整,避免拉伸变形
内容的提问来源于stack exchange,提问作者soleil
相关产品推荐
相关产品推荐

