Не работает сохранение в билде

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Не работает сохранение в билде

Сообщение Norman 17 июл 2017, 18:00

Товарищи, помогите.
Делал сохранение по уроку: https://www.youtube.com/watch?v=5YXGtXwxaIM&t=2s
Вот скрипт
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class GameInstance : MonoBehaviour {

        private void Awake()
        {
                Load();
        }

        public int _result;
       

        [System.Serializable]
        public class Saver
        {
                public int _currentResult;
        }

        public void Save()
        {
                Saver _saver = new Saver();
                _saver._currentResult = _result;

                if (!Directory.Exists(Application.dataPath + "/saves"))
                {
                        Directory.CreateDirectory(Application.dataPath + "/saves");
                }
                FileStream fs = new FileStream(Application.dataPath + "/saves/save.gs", FileMode.Create);
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, _saver);
                fs.Close();
        }

        public void Load()
        {
                if (File.Exists(Application.dataPath + "/saves/save.gs"))
                {
                        FileStream fs = new FileStream(Application.dataPath + "/saves/save.gs", FileMode.Open);
                        BinaryFormatter formatter = new BinaryFormatter();
                        try
                        {
                                Saver _saver = (Saver)formatter.Deserialize(fs);
                                _result = _saver._currentResult;
                        }
                        catch (System.Exception e)
                        {
                                Debug.Log(e.Message);
                        }
                        finally
                        {
                                fs.Close();
                        }

                }
                else
                {
                        Debug.Log("Save doesn't exist");
                }
        }
}


В редакторе сохранение работает, в билде (под Виндоус 32 и 64) - не работает.
Norman
UNIт
 
Сообщения: 111
Зарегистрирован: 31 мар 2017, 18:38

Re: Не работает сохранение в билде

Сообщение Anonymyx 17 июл 2017, 18:08

Попробуйте dataPath заменить на streamingAssetsPath.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Не работает сохранение в билде

Сообщение Norman 17 июл 2017, 18:24

Anonymyx писал(а):Попробуйте dataPath заменить на streamingAssetsPath.

К сожалению, не помогло...
Norman
UNIт
 
Сообщения: 111
Зарегистрирован: 31 мар 2017, 18:38

Re: Не работает сохранение в билде

Сообщение DbIMok 17 июл 2017, 18:48

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Не работает сохранение в билде

Сообщение Anonymyx 17 июл 2017, 18:49

У меня все работает.
Проверил с dataPath.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Не работает сохранение в билде

Сообщение Norman 17 июл 2017, 19:18

DbIMok писал(а):https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html

persistentDataPath тож не фурычит (или я что-то неправильно делаю).
Anonymyx писал(а):У меня все работает.
Проверил с dataPath.

Я вроде понял причину. Но не понял причину причины ~x(
Я на пробу удалил папку saves в ассет браузере редактора - сохранение перестало работать и в редакторе. Пишет сообщение из дебаг лога "Save doesn't exist". Хотя по логике, написанной в скрипте, он должен создавать директорию ежели её нету. И раньше создавал. Я вернулся к бэкапу двухдневной давности - работает. И в билде, сделанном из этого бэкапа, тоже работает.
Т.е. почему-то перестало работать сохранение, перестала создаваться нужная директория. При этом в скрипте я ничего не менял и ошибок консоль никаких при вызове ф-ии Save() не выдаёт.
Не понимаю.
Norman
UNIт
 
Сообщения: 111
Зарегистрирован: 31 мар 2017, 18:38

Re: Не работает сохранение в билде

Сообщение Norman 17 июл 2017, 20:31

Очередная глупая тема. [curved_hands] Прошу прощения у тех, у кого отнял время.
Всё работает. Просто функция Save() не вызывалась из-за логической ошибки в другом скрипте, в котором я случайно зацепил public переменную и не заметил.
Вот только почему я начал искать решение проблемы через задницу - до сих пор не понимаю.
Norman
UNIт
 
Сообщения: 111
Зарегистрирован: 31 мар 2017, 18:38

Re: Не работает сохранение в билде

Сообщение accauntUnity3d 12 июл 2020, 11:45

Похожая ошибка, пытаюсь прочитать XML

Синтаксис:
Используется csharp
using UnityEngine;
using System.IO;
using System.Xml.Serialization;
public class loadingLib : MonoBehaviour
{
    private XmlSerializer XmlSerializerShips;
    private ShipXML thisShipXML;
    private FileStream fileStreamShips;
    private ShipXML[] shipsInXML;
    public Transform debugText;

    void Awake()
    {
        LoadShips();
    }

    public void LoadShips()//загрузить корабли из XML
    {
        XmlSerializerShips = new XmlSerializer(typeof(ShipXML[]));
        fileStreamShips = new FileStream(Application.dataPath + "/Resources/XML/Ship.xml", FileMode.OpenOrCreate);
        using (fileStreamShips)
        {
            shipsInXML = (ShipXML[])XmlSerializerShips.Deserialize(fileStreamShips);
        }
        Library.shipsXML = shipsInXML;
    }
}

 


Запускаю в редакторе юнити, работает, получаю shipsInXML и работаю дальше.
Делаю билд, запускаю, проверяю: строка fileStreamShips =... не отрабатывает. Подскажите пожалуйста, в чем может быть дело?
accauntUnity3d
UNец
 
Сообщения: 12
Зарегистрирован: 12 июл 2020, 11:35

Re: Не работает сохранение в билде

Сообщение seaman 12 июл 2020, 13:50

Смотрели в документации куда указывает Application.dataPath на Вашей платформе?
Например на Андроиде он указывает на сам apk. Естественно там ничего читаться не будет.
На винде файл надо переносить в папку рядом с exe.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не работает сохранение в билде

Сообщение accauntUnity3d 13 июл 2020, 13:14

Платформа windows 10
Вывел адрес в строку,
в редакторе:
C:/Unity/Projects/Cosmo Steam/Assets/Resources/XML/Ship.xml
в билде
C:/Unity/Projects/Cosmo Steam/Bild/1_Data/Resources/XML/Ship.xml

Реально в билде в /Resources/ нет папки XML и файла Ship.xml, вместо них файлы "unity_builtin_extra" и "unity default resources", но также и должно быть?
Еще момент, в папке /Resources/Sprite - у меня лежат текстуры, и к ним я тоже обращаюсь через Application.dataPath + "/Resources/Sprite/..."; и они подгружаются, т.е. вероятно дело не в пути Application.dataPath !?
accauntUnity3d
UNец
 
Сообщения: 12
Зарегистрирован: 12 июл 2020, 11:35

Re: Не работает сохранение в билде

Сообщение accauntUnity3d 13 июл 2020, 14:34

seaman писал(а):Смотрели в документации куда указывает Application.dataPath на Вашей платформе?
Например на Андроиде он указывает на сам apk. Естественно там ничего читаться не будет.
На винде файл надо переносить в папку рядом с exe.

Попробовал еще вариант с Application.persistentDataPath, вручную закинул Resources\XML\Ship.xml в документы: C:\Users\Иван\AppData\LocalLow\DefaultCompany\Cosmo Steam\
В редакторе опять запустилось, в билде нет.
accauntUnity3d
UNец
 
Сообщения: 12
Зарегистрирован: 12 июл 2020, 11:35

Re: Не работает сохранение в билде

Сообщение accauntUnity3d 13 июл 2020, 20:46

Ищу решение уже 3й день...
Посмотрел материалы, решил отказаться от XML в пользу JSON, но все равно:
Синтаксис:
Используется csharp
    public void LoadShips()
    {
        CompartmentJSON save = new CompartmentJSON();
        if (Application.isEditor)//Работает!
        {
            CompartmentJSON comp = new CompartmentJSON("123", "456", "dock", "ID12");
            string path = Path.Combine(Application.dataPath, "Resources/JSON/CompartmentJSON");
            File.WriteAllText(path, JsonUtility.ToJson(comp));
            save = JsonUtility.FromJson<CompartmentJSON>(File.ReadAllText(path));
        }
        else {//создаю билд после того как файл "CompartmentJSON уже создан в "Resources/JSON/" - НЕ работает!!
            TextAsset textAsset = Resources.Load<TextAsset>("JSON/CompartmentJSON");
            save = JsonUtility.FromJson<CompartmentJSON>(textAsset.text);// - эта строка не отрабатывает
        }
        debugText.GetComponent<Text>().text = save.tip;
    }

[Serializable]
public class CompartmentJSON
{
    public string x;//координата x
    public string y;//координата y
    public string tip;//тип
    public string id;//ID
    public CompartmentJSON()
    {
    }
    public CompartmentJSON(string x, string y, string tip, string id)
    {
        this.x = x;
        this.y = y;
        this.tip = tip;
        this.id = id;
    }
}
 


Запускаю билд в windows 10. Подскажите пожалуйста где косяк!?
accauntUnity3d
UNец
 
Сообщения: 12
Зарегистрирован: 12 июл 2020, 11:35

Re: Не работает сохранение в билде

Сообщение Tolking 13 июл 2020, 21:34

Я думаю что "JSON/CompartmentJSON" - находится в билде, внутри архива, туда нельзя ничего записывать после билда, но из редактора можно, а Path.Combine(Application.dataPath, "Resources/JSON/CompartmentJSON"); находится где угодно, но не в билде и Resources.Load не имеет к нему доступа.

Application.dataPath - выдает разный путь, который зависит от контекста(платформы). В редакторе - один путь, в билде вин - может быть другой, в андроиде третий...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Не работает сохранение в билде

Сообщение accauntUnity3d 13 июл 2020, 22:30

Tolking писал(а):Я думаю что "JSON/CompartmentJSON" - находится в билде, внутри архива, туда нельзя ничего записывать после билда, но из редактора можно, а Path.Combine(Application.dataPath, "Resources/JSON/CompartmentJSON"); находится где угодно, но не в билде и Resources.Load не имеет к нему доступа.

Application.dataPath - выдает разный путь, который зависит от контекста(платформы). В редакторе - один путь, в билде вин - может быть другой, в андроиде третий...


Спасибо за подсказку! Теперь понял. Если кому пригодится, рабочая версия:

Синтаксис:
Используется csharp
using UnityEngine;
using System;
using System.IO;

public class TestResources : MonoBehaviour
{
    private TextAsset textAsset;
    private Rect rectLabel = new Rect(10f, 10f, 200f, 30f);
    private CompartmentJSON save;
    private CompartmentJSON comp;
    private string path;
    void Start()//запись
    {
        if (Application.isEditor) {//создать внутреннюю JSON библиотеку можно только запуская проект в редакторе
            comp = new CompartmentJSON("123", "456", "dock", "ID16");
            path = Path.Combine(Application.dataPath, "Resources/JSON/CompartmentJSON.json");
            File.WriteAllText(path, JsonUtility.ToJson(comp));
        }
    }
    void Load()//чтение JSON одинаково работает и в редакторе и в билде, но! если запустить Load() сразу после Start() - ничего не получится, потому что, как выяснилось, на создание файла тоже нужно время, и Load() начинает читать у меня JSON спустя несколько секунд после того как отработал Start() и создался файл.
    {
        textAsset = Resources.Load("JSON/CompartmentJSON") as TextAsset;
        save = JsonUtility.FromJson<CompartmentJSON>(textAsset.text);  
    }
    void OnGUI()
    {
        if (textAsset)
        {
            GUI.Label(rectLabel, save.id);
        }
    }
}
[Serializable]
public class CompartmentJSON
{
    public string x;
    public string y;
    public string tip;
    public string id;
    public CompartmentJSON()
    {
    }
    public CompartmentJSON(string x, string y, string tip, string id)
    {
        this.x = x;
        this.y = y;
        this.tip = tip;
        this.id = id;
    }
}
 
accauntUnity3d
UNец
 
Сообщения: 12
Зарегистрирован: 12 июл 2020, 11:35


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 27