Неверная индексация кнопок в билде 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: [iOS build2

Алсо, я не уверен в правильности подхода поиска объектов по тегу и если у кого-то будет решение лучше - с радостью выслушаю.


Ответы (1 шт):

Автор решения: luvjungle

Если руками лень проставлять массивы, то можно такой workaround. Сделайте поля массивов [SerializeField], запустите сцену, массивы заполнятся, в эдиторе на компоненте правой кнопкой мыши -> copy component. Выключите плей мод, опять правой кнопкой -> paste component values. Все значения массивов проставятся и вы сможете просто сохранить их в сцену. И удалите эти поиски из Awake(), выиграете время загрузки сцены.

→ Ссылка