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

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

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

Сообщение Blizzard_jedi 13 янв 2017, 02:24

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

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

Сообщение DbIMok 13 янв 2017, 02:42

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

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

Сообщение Blizzard_jedi 17 янв 2017, 02:15

Спасибо за наводки. Поизучал это дело. Я правильно понимаю, что абсолютно любому файлу можно выставить расширение .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) возвращает нулевой указатель. Почему? Не хватает какой-то меты внутри самого файла? :-?
Blizzard_jedi
UNITрон
 
Сообщения: 235
Зарегистрирован: 21 июн 2013, 00:50
Откуда: Москва

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

Сообщение Cr0c 17 янв 2017, 07:52

1. После билда не будет файлов в Resources - они запакуются и грузить потом только через Resources.Load
2. Resources.Load загружает файл БЕЗ указания расширения
3. Загрузка в билде не запакованных файлов возможна из папки StreamingAssets - файлы в ней при билде не запаковываются, а остаются как есть.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

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

Сообщение Blizzard_jedi 19 янв 2017, 01:03

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

Всем большое спасибо за ответы!
Blizzard_jedi
UNITрон
 
Сообщения: 235
Зарегистрирован: 21 июн 2013, 00:50
Откуда: Москва

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

Сообщение DbIMok 19 янв 2017, 02:15

Blizzard_jedi писал(а):Я пробовал .bytes и .txt - оба расширения удаётся прочитать

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


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

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 31