Unity关卡选择菜单50个关卡仅显示10个图标问题排查求助
关卡选择菜单仅显示10个图标问题修复方案
你的代码逻辑本身是实现分页式关卡展示,每页最多显示amountPerPage个图标,剩余关卡放在其他分页中需要滑动切换查看,仅显示10个是分页滚动功能未正常工作或参数配置错误导致,可按以下步骤排查修复:
核心问题排查与修复
- 首先确认每页数量计算结果:在
Start方法末尾添加调试代码Debug.Log("每页可放图标数量:" + amountPerPage);,运行后查看控制台输出,如果结果为10,说明你当前levelHolder的面板尺寸计算得出的单页容量刚好是10个,属于正常计算结果,问题出在分页滑动功能。 - 修复分页滚动核心逻辑(最可能的问题原因):
你目前仅生成了多页面板,但未配置滚动相关的组件和参数,导致无法滑动查看其他页:- 给
levelHolder对象添加ScrollRect组件,组件的Content字段绑定自身的RectTransform,滚动方向勾选水平、取消垂直。 - 给
levelHolder对象添加Rect Mask 2D组件,隐藏超出面板范围的其他分页内容。 - 在
LoadPanels方法中,所有页面生成完成后修改levelHolder的总宽度,适配所有分页的尺寸,添加代码如下:
// 放在LoadPanels方法的Destroy(panelClone);之前 levelHolder.GetComponent<RectTransform>().sizeDelta = new Vector2(panelDimensions.width * numberOfPanels, panelDimensions.height);- 确认你自定义的
PageSwiper组件是否正确实现了滑动翻页的逻辑,是否正确关联了ScrollRect组件。
- 给
其他问题修复与优化
- 修正每页数量计算误差:你当前计算单页可放图标数量时未扣除
GridLayoutGroup的内边距,会导致实际可放数量和计算结果不符,修改两处代码:- 修改
SetUpGrid方法,添加固定内边距配置:
void SetUpGrid(GameObject panel) { GridLayoutGroup grid = panel.AddComponent<GridLayoutGroup>(); grid.cellSize = new Vector2(iconDimensions.width, iconDimensions.height); grid.childAlignment = TextAnchor.MiddleCenter; grid.spacing = iconSpacing; // 新增内边距配置,数值可根据需求调整 grid.padding = new RectOffset(15, 15, 15, 15); }- 修改
Start方法中的每页数量计算逻辑,扣除内边距:
// 先拿到Grid的内边距参数,也可以直接用你设置的固定值 GridLayoutGroup sampleGrid = levelHolder.AddComponent<GridLayoutGroup>(); int maxInARow = Mathf.FloorToInt((panelDimensions.width - sampleGrid.padding.left - sampleGrid.padding.right + iconSpacing.x) / (iconDimensions.width + iconSpacing.x)); int maxInACol = Mathf.FloorToInt((panelDimensions.height - sampleGrid.padding.top - sampleGrid.padding.bottom + iconSpacing.y) / (iconDimensions.height + iconSpacing.y)); Destroy(sampleGrid); - 修改
- 优化关卡按钮数组赋值逻辑:你当前每次生成分页后都全局查找所有带
LevelButton标签的对象,效率极低且容易出错,改为实例化时直接存入数组:- 在类中初始化数组:
GameObject[] lvlBut;,在Start中拿到总关卡数后初始化容量:lvlBut = new GameObject[numberOfLevels]; - 在
LoadIcons方法实例化图标后添加赋值代码:
icon.name = "Level " + i; icon.GetComponentInChildren<TextMeshProUGUI>().SetText(currentLevelCount.ToString()); // 新增代码 lvlBut[currentLevelCount - 1] = icon;- 删除
LoadIcons方法中lvlBut = GameObject.FindGameObjectsWithTag("LevelButton");这行代码,将按钮可交互状态的设置逻辑移到LoadPanels方法所有页面生成完成之后执行,避免重复设置。
- 在类中初始化数组:
- 移除代码中的重复引用:
using UnityEngine.UI;写了两次,删掉其中一个即可,不影响运行但属于冗余代码。
内容的提问来源于stack exchange,提问作者Deepak Bohra
相关产品推荐
相关产品推荐

