在bubbly中制作关卡选择界面需创建grid布局容器并放置20个按level_x命名的按钮,挂载levelunlockmanager脚本管理解锁逻辑,通过playerprefs存储最大解锁序号,统一绑定onclick事件解析关卡名并加载场景,配合color tint提供点击反馈。

在Bubbly中制作关卡选择界面,需基于其UI系统构建可交互的关卡网格,绑定通关状态逻辑,并确保点击后能正确加载对应场景。
创建关卡按钮网格
在Canvas下新建一个Grid Layout Group作为容器,设置Cell Size为120×120、Spacing为20,确保按钮排列整齐不重叠。
拖入20个Button预制体到该Grid中,依次命名为Level_1至Level_20;每个Button的Text组件内容设为对应关卡序号,如“1”“2”……“20”。
这一步必须手动命名,否则后续脚本无法通过名字识别关卡索引——【未按Level_X格式命名会导致LoadScene失败】。
绑定关卡解锁逻辑
新建C#脚本LevelUnlockManager,挂载到空GameObject上。
在Start()中调用PlayerPrefs.HasKey("unlocked_level")判断是否已有通关记录;若无,则默认解锁Level_1,执行PlayerPrefs.SetInt("unlocked_level", 1)并保存。
遍历所有Button子对象:获取其名称中的数字n → 比较n ≤ PlayerPrefs.GetInt("unlocked_level") → 成立则保持交互启用,否则调用button.interactable = false,并将Text.color设为灰色(new Color(0.5f, 0.5f, 0.5f))。
配置按钮点击响应
方法一:直接在Inspector中为每个Button的OnClick事件添加空GameObject上的LevelUnlockManager.LevelSelected函数,并传入对应关卡编号整数参数。
方法二:更可靠的做法是统一绑定——在LevelUnlockManager中编写public void LevelSelected(string levelName),然后所有Button的OnClick都指向它,并传入levelName字符串(如"Level_3")。
LevelSelected内部用int.TryParse(levelName.Replace("Level_", ""), out int levelId)提取数字,再调用SceneManager.LoadScene($"Level_{levelId}")。
注意:场景名必须与Build Settings中登记的完全一致,包括大小写和前缀,否则运行时抛出MissingSceneException。
添加视觉反馈效果
选中任意Button,在Inspector中展开Transition → 改为Color Tint模式。
将Highlighted Color设为浅蓝色(#66CCFF),Pressed Color设为深蓝(#0066CC),Duration设为0.15秒。
这一步能让玩家明确感知点击生效,避免重复猛点。
设置关卡通关触发
第一步:在每一关的胜利判定逻辑末尾(例如敌人全灭且主角存活),插入PlayerPrefs.SetInt("unlocked_level", 当前关卡序号 + 1) → PlayerPrefs.Save()。
第二步:返回选择界面时,重新执行LevelUnlockManager.Start()中的刷新流程,新关卡按钮自动变为可点击状态。
第三步:为防止多设备同步冲突,不使用PlayerPrefs.SetString存储关卡名,只存最大已解锁序号整数——【存字符串易因拼写错误导致后续全部锁死】。











