Сорри за некропост.
1. Вопрос по распаковке в поток.
Все бы хорошо, но вот можно ли как-то минуя создание временного файла загружать материалы (Material) из архива?
Материал можно создать из шейдера, из другого материала, а также загрузить из файла Resources.Load(путь). Как загрузить из потока я не могу сообразить. И возможно ли это вообще?
2. Можно, конечно, распаковать во временную директорию и уже оттуда грузить, но это имхо ненормально. Ну и ко всему прочему у меня и это не выходит.
Используется csharp
if (ext == ".zip")
_LoadZipMat(file, dir);
else if (ext == ".mat")
_LoadOneMat(dir, name);
...
private static void _LoadOneMat(string dir, string name)
{
string f = dir + "/" + name;
Debug.Log("Loading Mat: " + f);
Material m = (Material)Resources.Load(f, typeof(Material));
m.name = name;;
}
private static void _LoadZipMat(string file, string dir)
{
string path = Path.GetDirectoryName(file);
using (ZipFile zip = ZipFile.Read(file))
{
foreach (ZipEntry e in zip)
{
e.Extract(path);
}
}
string[] ret = Directory.GetFiles(path);
foreach (string fil in ret)
{
string ext = Path.GetExtension(fil);
string name = Path.GetFileNameWithoutExtension(fil);
if(ext == ".zip") continue;
if(ext != ".mat")
Debug.LogWarning("Not supported file in Materials: " + fil);
else
_LoadOneMat(dir, name);
}
}
Материалы в конечном итоге грузятся одним методом - _LoadOneMat. Если они уже лежат в Resources/Materials, то прекрасно грузятся. Если там только архив, то распакованные то там появляются, а вот грузиться не хотят. Вылетает ошибка NullReference на строке m.name = name; Т.е. явно материал не загрузился. Причем распакованные материалы нормальные - их можно спокойно загрузить перезапустив Юнити. Т.е. получается что именно в момент попытки загрузки после распаковки что-то не то. Или их еще нет, или к ним почему-то нет доступа. Я именно поэтому сделал еще один цикл в _LoadZipMat - специально, чтобы распаковка уже точно прошла. Не помогло.
В _LoadOneMat в обоих случаях передаются одинаковые значения. Об этом четко говорит Debug.Log в ней.
В чем может быть дело?
ЗЫ: Полез я уже в
File.GetAccessControl - хотел дать себе все права на файлы. Однако тут другое - Юнити пишет: в File нет такого метода, хотя VS нормально его находит, и он появился еще в DotNet 2.0! Что за фигня сегодня
Нужно отложить все это. Потом с новыми силами браться...