Неверная индексация кнопок в билде iOS
Имеется сцена с выбором уровней. Индексация кнопок (Их порядковый номер, количество звезд у игрока и блокировка уровня) обрабатывается скриптом. Полный код класса 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);
}
}
}
Сцена в редакторе:
Когда сцена проигрывается в режиме плэй - то все кнопки верно индексируются, но когда проект билдится на айфон и на нем же запускается то происходит такое:
iOS build:
[
Алсо, я не уверен в правильности подхода поиска объектов по тегу и если у кого-то будет решение лучше - с радостью выслушаю.
Ответы (1 шт):
Если руками лень проставлять массивы, то можно такой workaround. Сделайте поля массивов
[SerializeField], запустите сцену, массивы заполнятся, в эдиторе на компоненте правой кнопкой мыши -> copy component. Выключите плей мод, опять правой кнопкой -> paste component values. Все значения массивов проставятся и вы сможете просто сохранить их в сцену. И удалите эти поиски из Awake(), выиграете время загрузки сцены.