有一个可以选择关卡的舞台。按钮的索引(它们的序列号、玩家拥有的星数和关卡锁定)由脚本处理。LevelManager 类的完整代码:
using System;
using Mkey;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace UI
{
public class LevelManager : MonoBehaviour
{
private GameObject[] levelButtons;
private GameObject[] lockLevel;
private GameObject[] starLeft;
private GameObject[] starMiddle;
private GameObject[] starRight;
private void Awake()
{
levelButtons = GameObject.FindGameObjectsWithTag("LevelButtons");
lockLevel = GameObject.FindGameObjectsWithTag("LockLevel");
starLeft = GameObject.FindGameObjectsWithTag("StarLeft");
starMiddle = GameObject.FindGameObjectsWithTag("StarMiddle");
starRight = GameObject.FindGameObjectsWithTag("StarRight");
int levelReached = PlayerPrefs.GetInt("levelReached", 1);
SetLock(levelReached);
GetStars();
}
private void Start()
{
for (int i = 0; i < levelButtons.Length; i++)
{
levelButtons[i].GetComponentInChildren<Text>().text = (i + 1).ToString();
}
}
public void SelectLevel(string levelName)
{
SceneManager.LoadScene(levelName);
}
/// <summary>
/// Set locked levels from PlayerPrefs class.
/// </summary>
/// <param name="levelReached"></param>
private void SetLock(int levelReached)
{
for (int i = 0; i < levelButtons.Length; i++)
{
if (i + 1 > levelReached)
{
lockLevel[i].GetComponent<Image>().enabled = true;
levelButtons[i].GetComponentInChildren<Button>().interactable = false;
}
else
{
lockLevel[i].GetComponent<Image>().enabled = false;
}
}
}
private void GetStars()
{
for (int i = 0; i < levelButtons.Length; i++)
{
var currentLevel = levelButtons[i].GetComponentInChildren<Text>().text;
string identifier = "starsLevel" + currentLevel;
int levelStars = PlayerPrefs.GetInt(identifier, 0);
switch (levelStars)
{
case 3:
starLeft[i].GetComponent<Image>().enabled = true;
starMiddle[i].GetComponent<Image>().enabled = true;
starRight[i].GetComponent<Image>().enabled = true;
break;
case 2:
starLeft[i].GetComponent<Image>().enabled = true;
starMiddle[i].GetComponent<Image>().enabled = false;
starRight[i].GetComponent<Image>().enabled = true;
break;
case 1:
starLeft[i].GetComponent<Image>().enabled = false;
starMiddle[i].GetComponent<Image>().enabled = true;
starRight[i].GetComponent<Image>().enabled = false;
break;
case 0:
starLeft[i].GetComponent<Image>().enabled = false;
starMiddle[i].GetComponent<Image>().enabled = false;
starRight[i].GetComponent<Image>().enabled = false;
break;
}
}
}
public void ResetLevels()
{
PlayerPrefs.SetInt("levelReached", 1);
}
}
}
编辑:
当场景在播放模式下播放时,所有按钮都被正确索引,但是当项目在 iPhone 上构建并在其上启动时,会发生这种情况:
iOS 构建:

我不确定按标签搜索对象的正确方法,如果有人有更好的解决方案,我会很乐意倾听。

如果手懒得放下数组,那么这样的解决方法是可能的。制作数组字段
[SerializeField],运行场景,数组将被填充,在组件上的编辑器中,右键单击 -> 复制组件。关闭播放模块,再次右键单击 -> 粘贴组件值。将输入所有数组值,您可以将它们简单地保存到场景中。并从中删除这些搜索Awake(),您将赢得场景加载时间。