Страница 1 из 1

Загрузка ресурсов в рантайме

СообщениеДобавлено: 13 янв 2017, 02:24
Blizzard_jedi
Здравствуйте!
Для сохранения/загрузки некоторых данных я использую класс System.Runtime.Serialization.Formatters.Binary.BinaryFormatter. Данные сохраняются в дочернюю директорию директории Resources. В редакторе всё в порядке, потому что вся структура папок и сами файлы лежат в "открытом доступе". Если же я делаю билд, то юнити пакует ресурсы в несколько файлов - моя схема перестаёт работать. Я так понимаю, с этими запакованными файлами умеет работать функция Resources.Load. Но оно умеет читать только то, что порождено от Unity.Object и сериализовано средствами юнити. А у меня там просто некий класс, хранящий данные, который я сохраняю и читаю системными средствами. Собственно вопрос: можно ли как-то читать такие вот файлы с данными при запуске билда?
Спасибо.

Re: Загрузка ресурсов в рантайме

СообщениеДобавлено: 13 янв 2017, 02:42
DbIMok
https://docs.unity3d.com/ScriptReferenc ... bytes.html - сохранить Resources/test.bytes читать Resources.Load<TextAsset>("test").bytes или использовать StreamingAssets https://docs.unity3d.com/Manual/StreamingAssets.html и https://docs.unity3d.com/ScriptReference/WWW-bytes.html

Re: Загрузка ресурсов в рантайме

СообщениеДобавлено: 17 янв 2017, 02:15
Blizzard_jedi
Спасибо за наводки. Поизучал это дело. Я правильно понимаю, что абсолютно любому файлу можно выставить расширение .byte и прочитать в TextAsset просто как текст? У меня класс с данными сохраняется в файл с расширением .asset таким образом:

Синтаксис:
Используется csharp
        public static void SaveToFile(T iData, string iFilepath)
        {
            BinaryFormatter bf = new BinaryFormatter();
            System.IO.FileStream file = System.IO.File.OpenWrite(iFilepath);

            bf.Serialize(file, iData);
            file.Close();
        }
 


Провожу эксперимент. Полученный файл "Filename.asset" я переименовал в "Filename.byte". Читаю:

Синтаксис:
Используется csharp
        public static void LoadFromByteResource(T ioData, string iFilepath)
        {
            if (!iFilepath.EndsWith(".byte"))
                return;

            TextAsset asset = Resources.Load(iFilepath) as TextAsset;
            System.IO.Stream stream = new System.IO.MemoryStream(asset.bytes);
            BinaryFormatter bf = new BinaryFormatter();

            ioData.Assign((T)bf.Deserialize(stream));
        }
 


Здесь вызов Resources.Load(iFilepath) возвращает нулевой указатель. Почему? Не хватает какой-то меты внутри самого файла? :-?

Re: Загрузка ресурсов в рантайме

СообщениеДобавлено: 17 янв 2017, 07:52
Cr0c
1. После билда не будет файлов в Resources - они запакуются и грузить потом только через Resources.Load
2. Resources.Load загружает файл БЕЗ указания расширения
3. Загрузка в билде не запакованных файлов возможна из папки StreamingAssets - файлы в ней при билде не запаковываются, а остаются как есть.

Re: Загрузка ресурсов в рантайме

СообщениеДобавлено: 19 янв 2017, 01:03
Blizzard_jedi
В общем, расширение самого файла оказалось важно. По нему Resources.Load понимает, как ему нужно интерпретировать файл. Я пробовал .bytes и .txt - оба расширения удаётся прочитать как корректный TextAsset и затем, обернув в MemoryStream, скормить BinaryFormatter.
Но Cr0c правильно написал, что при вызове Resources.Load не указывается расширение. Отсюда очевидное следствие: файлы ресурсов в одной и той же папке не могут отличаться только расширением.

Всем большое спасибо за ответы!

Re: Загрузка ресурсов в рантайме

СообщениеДобавлено: 19 янв 2017, 02:15
DbIMok
Blizzard_jedi писал(а):Я пробовал .bytes и .txt - оба расширения удаётся прочитать

а чего их пробовать, это все есть в справке
Изображение