Загрузите несколько внешних текстур с классом WWW

Я хочу загрузить несколько файлов png во время выполнения, используя Unity. Я использую класс www для загрузки текстур с заданным каталогом. Вот мой код:

    public IEnumerator LoadPNG(string _path)
    {
        string[] filePaths = Directory.GetFiles(_path);
        foreach (string fileDir in filePaths)
        {
            using (WWW www = new WWW("file://" + Path.GetFullPath(fileDir )))
            {
                yield return www;
                Texture2D texture = Texture2D.whiteTexture;
                www.LoadImageIntoTexture(texture);
                this.textureList.Add(texture);
            }
        }
    }

Эта функция называется сопрограммой. Когда программа завершит загрузку всех текстур, в массиве textureList будет правильное количество текстур. Но все они имеют последнюю загруженную текстуру. Любая помощь приветствуется.


person mcelik    schedule 21.09.2016    source источник
comment
с помощью этой строки (Texture2D texture = Texture2D.whiteTexture;) вы всегда устанавливаете ссылку на один и тот же объект. вам нужно инициализировать новую текстуру. Думаю с (новым Texture2D) будет работать   -  person NtFreX    schedule 21.09.2016
comment
Вы не можете напрямую сказать new Texture2D в единстве без ресурса. Я уже переписываю переменную текстуры с помощью текстуры LoadImageIntoTexture. Так что проблем быть не должно, я думаю.   -  person mcelik    schedule 21.09.2016
comment
@mcelik Вы можете использовать ключевое слово new с Texture2D, и я думаю, что это ваша проблема, так как вы обновили свой код. Texture2D texture = new Texture2D(4, 4, TextureFormat.DXT1, false);   -  person Programmer    schedule 21.09.2016
comment
Вы оба правы. Извините, я вскочил в ответ без достаточных знаний. Использование нового Texture2D решило проблему. Но я не мог понять, почему это сработало?   -  person mcelik    schedule 21.09.2016


Ответы (2)


Вы делали небольшую ошибку, используя только один объект:

            using (WWW www = new WWW("file://" + Path.GetFullPath(fileDir )))
            {
                yield return www;
                // Change this...
                //Texture2D texture = Texture2D.whiteTexture;
                // to this:
                Texture2D texture = new Texture2D(0, 0);
                //or us this:
                //Texture2D texture = www.texture;
                www.LoadImageIntoTexture(texture);
                textureList.Add(texture);
            }

Как доктор Фре также заявил в комментариях.

person Jerry Switalski    schedule 21.09.2016
comment
С текущим кодом в его вопросе сейчас это решение. - person Programmer; 21.09.2016
comment
Правильно, это решение. Спасибо вам всем. - person mcelik; 21.09.2016

Простая ошибка здесь: using (WWW www = new WWW("file://" + Path.GetFullPath(_path))).

Предполагается, что вы используете url из цикла foreach, который равен fileDir.

ИЗМЕНИТЬ:

Также переместите textureList = new List<Texture2D>(); за пределы функции. Поместите это в функцию Start() или что-то в этом роде.

    public IEnumerator LoadPNG(string _path)
    {
        string[] filePaths = Directory.GetFiles(_path);
        foreach (string fileDir in filePaths)
        {
            using (WWW www = new WWW("file://" + Path.GetFullPath(fileDir)))
            {
                yield return www;
                Texture2D texture = Texture2D.whiteTexture;
                www.LoadImageIntoTexture(texture);
                textureList.Add(texture);
            }
        }
    }

Примечание. В Unity рекомендуется использовать цикл List с циклом for вместо цикла foreach. Вам не нужно беспокоиться об этом в Unity 5.5.

person Programmer    schedule 21.09.2016
comment
Моя ошибка. Мой рабочий код использует fileDir. Но неправильно написал в вопросе :/ Сейчас редактируется. - person mcelik; 21.09.2016
comment
@mcelik Посмотрите на редактирование. Переместите textureList = new Dictionary<Texture2D>(); за пределы функции LoadPNG. Кроме того, я думаю, что в вашем вопросе есть еще одна опечатка. Разве textureList = new Dictionary<int, Texture2D>(); не должно быть textureList = new List<Texture2D>();? Если нет, то textureList.Add(texture); не должен компилироваться. Пожалуйста, исправьте это в своем вопросе... Всегда старайтесь размещать свой код в том виде, в котором он есть, чтобы предотвратить подобные проблемы в вашем вопросе. - person Programmer; 21.09.2016
comment
Последняя отредактированная версия кода будет более понятной для вопроса. Спасибо. - person mcelik; 21.09.2016