选关界面,就像这样:
1、在Canvas中创建一个选关界面,同时添加Grid Layout Group组件;
通过调节组件中的属性可以管理子物体的大小与间距(这里指关卡按钮)
创建关卡按钮在Content下;
2、创建LevelItem脚本,挂载到每个Button上;
添加引用:
代码:
public class LevelItem : MonoBehaviour
{
/// <summary>
/// 关卡ID
/// </summary>
private int LevelId;
/// <summary>
/// 创建按钮
/// </summary>
private Button btn;
// Start is called before the first frame update
void Awake()
{
btn = GetComponent<Button>();
btn.onClick.AddListener(OnClick);
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="id">关卡ID</param>
/// <param name="isLock">是否锁住关卡</param>
public void Init(int id, bool isLock)
{
LevelId = id;
if (isLock)
{
btn.interactable = false;
}
else
{
btn.interactable = true;
}
}
/// <summary>
/// 点击监听
/// </summary>
private void OnClick()
{
//场景加载,进入关卡
//确保BuildSetting中的场景编号没有问题
SceneManager.LoadScene(LevelId);
}
}
3、创建LevelManager脚本,挂载到Content上;
添加引用:
代码:
public class LevelManager : MonoBehaviour
{
void Start()
{
LoadLevel();
}
private void LoadLevel()
{
//上次退出游戏时保存的游戏关卡ID,如果第一次进入默认为1
int levelId = PlayerPrefs.GetInt("level", 1);
//向所有子物体上的LevelItem脚本中的Init方法传值
for (int i = 0; i < transform.childCount; i++)
{
if (i + 1 > levelId)
{
//没通关的关卡
transform.GetChild(i).GetComponent<LevelItem>().Init(i + 1, true);
}
else
{
//通关的关卡
transform.GetChild(i).GetComponent<LevelItem>().Init(i + 1, false);
}
}
}
}
4、运行Unity。
如果你想要的选关是这样的:
那就在每个按钮下创建三个Image,根据获取到的星星个数gameobject.SetActive(true)相应的图片就好了。
(还需要一个新的 PlayerPrefs,比如:PlayerPrefs.GetInt(“Star”, 0);)