Скрипты Unity отлично работают в редакторе, но не в сборке - PullRequest
0 голосов
/ 05 мая 2020

Я новичок ie в Unity. Недавно я создал сценарий, который отключает кнопки в сцене до тех пор, пока не будет выполнено условие (для меню выбора уровня, чтобы отключить все уровни, пока игрок не завершит предыдущие уровни) .

Но проблема is - Мой сценарий отлично работает, когда я запускаю игру в Редакторе , но когда я Строю, а затем Запускаю игру, сценарий не может * Работать правильно *.

Вот этот скрипт -

// Import required Modules

public class ButtonGatherer : MonoBehaviour
{
    public List<Button> buttons;
    public static int OpenLevels;
    void Start()
    {   if (OpenLevels == 0){
        OpenLevels = int.Parse(File.ReadAllText(Application.persistentDataPath + "Data.gokartgo"));} //Reads Data from a file

        GameObject[] btn = GameObject.FindGameObjectsWithTag("button");
        for (int i = 0; i < btn.Length; i++){
            buttons.Add(btn[i].GetComponent<Button>());
        }
        Debug.Log("Variable OpenLevels : "+OpenLevels);
        for(int i = OpenLevels; i < buttons.Count; i++) { 
            buttons[i].interactable = false;
            Debug.Log("Var i : " + i +",     So Locked Level : " + buttons[i]); //Used This To debug and get values for variable i
        }

    }
}

Я также прикрепил снимок экрана с полученным мной отладочным сообщением -
При запуске в редакторе -

Снимок экрана с трассировкой отладки при запуске в редакторе

При запуске после сборки (сборка разработки) -

Скриншот Отладка трассировки при запуске после сборки

Пожалуйста, помогите ....



Редактировать: я искал документы и форумы Unity, но ничего не нашел

Ответы [ 2 ]

4 голосов
/ 05 мая 2020

Вероятно, ваша проблема заключается в строке

OpenLevels = int.Parse(File.ReadAllText(Application.persistentDataPath + "Data.gokartgo"));}

Отсутствует разделитель пути, поэтому путь выглядит, например,

                                     | This is now a file that doesn't even 
                                     | lie within your apps data!
                                     V 
\root\applications\yourapp\persistentDataData.gokartgo

На большинстве устройств такой доступ не разрешено!

Вам понадобится / или \ между ними.


Но не используйте + "/" см. Ниже!

Короче говоря: Никогда используйте + "" или + "/" для путей к системным файлам, поскольку они могут быть неверными в зависимости от целевой платформы (например, Windows \, Unix /).

Вместо этого используйте Path.Combine, который автоматически вставляет правильный разделитель путей в соответствии с вашей платформой:

OpenLevels = int.Parse(File.ReadAllText(Path.Combine(Application.persistentDataPath, "Data.gokartgo"));

Если проблема, о которой вы говорите, - это номера кнопок, которые вы получаете, обратите внимание, что для FindGameObjectsWithTag не может быть гарантировано, что результаты всегда возвращаются в одном и том же порядке.

0 голосов
/ 05 мая 2020

Если ваш сценарий нормально работает в редакторе, то проблема может быть в пути к файлу данных. Попробуйте этот код и посмотрите, сохраняется ли проблема.

public class ButtonGatherer : MonoBehaviour
{
    public List<Button> buttons;
    public static int OpenLevels;
    void Start()
    {
        if (PlayerPrefs.HasKey("OpenLevels"))
        {
            OpenLevels = PlayerPrefs.GetInt("OpenLevels");
        }
        else
        {
            OpenLevels = 0;
            PlayerPrefs.SetInt("OpenLevels", 0)
        }

        GameObject[] btn = GameObject.FindGameObjectsWithTag("button");
        for (int i = 0; i < btn.Length; i++)
        {
            buttons.Add(btn[i].GetComponent<Button>());
        }
        Debug.Log("Variable OpenLevels : " + OpenLevels);

        for (int i = OpenLevels; i < buttons.Count; i++)
        {
            buttons[i].interactable = false;
            Debug.Log("Var i : " + i + ",     So Locked Level : " + buttons[i]);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...