Сделать Texture2D читаемым в Unity с помощью кода

У меня есть несколько AssetBundles, которые я хочу преобразовать в файлы изображений .png.

Это активы Texture2D, но проблема в том, что они не доступны для чтения, когда я пытаюсь преобразовать их в PNG с помощью

var _bytes = _texture2d.EncodeToPNG();

команду, я получаю следующее сообщение об ошибке:

Текстура 'название текстуры' не читается, доступ к памяти текстур из скриптов невозможен. Текстуру можно сделать читаемой в настройках импорта текстуры.

Я действительно не могу получить доступ к настройкам импорта текстур, так как они взяты из пакетов ресурсов, и все сделано с помощью кода.

У кого-нибудь есть обходной путь для этого?

Спасибо


person DavidGuaita    schedule 07.08.2014    source источник
comment
Не могли бы вы сделать его читаемым с помощью этого?   -  person S.C.    schedule 07.08.2014
comment
Спасибо, Алдур, но я так не думаю. Textureimporter работает, когда вы импортируете текстуру в редакторе, но изображения уже были преобразованы в объекты Texture2D и сохранены как AssetBundles, поэтому они больше не проходят через Textureimporter.   -  person DavidGuaita    schedule 07.08.2014


Ответы (2)


Выберите текстуру в проекте, откройте окно инспектора, установите тип текстуры на «Дополнительно», включите «Чтение и запись».

person game development germ    schedule 07.08.2014
comment
Боюсь, что это невозможно, текстур вообще нет в проекте, у меня есть только Assetbundles, которые были созданы из объектов Texture2D, поэтому я не могу сделать никакую редакцию в Редакторе. Утилита, которую я делаю, загружает эти Assetbundles, чтобы снова экспортировать изображения, чтобы мы могли редактировать их в Photoshop. - person DavidGuaita; 07.08.2014
comment
Вы по-прежнему можете визуализировать нечитаемую текстуру в RenderTexture, а затем прочитать ее. - person game development germ; 07.08.2014
comment
Хорошая мысль, зародыш разработки игр. Я попробую этот обходной путь, спасибо. - person DavidGuaita; 10.08.2014
comment
Это недопустимо для текстур, созданных с помощью new Texture2D(...). Как я могу читать такие текстуры, или я должен работать с Color[] перед установкой пикселей? - person Петър Петров; 09.06.2015
comment
Текстуры, созданные во время выполнения, должны быть доступны для чтения/записи. - person game development germ; 09.06.2015
comment
Я тоже борюсь с этим. Как бы вы отрендерили нечитаемую текстуру в RenderTexture? - person Waltari; 16.01.2016
comment
@DavidGuaita Что делать, если текстура загружается с сервера с использованием DownloadHandlerTexture.GetContent - person serge; 27.09.2016
comment
Я думаю, что вопрос заключается в том, чтобы сделать Texture2D читаемым в Unity с помощью кода, а не с помощью Unity Inspector. - person luizcarlosfx; 13.06.2017

Вот рабочее решение:

public static void SetTextureImporterFormat( Texture2D texture, bool isReadable)
{
    if ( null == texture ) return;

    string assetPath = AssetDatabase.GetAssetPath( texture );
    var tImporter = AssetImporter.GetAtPath( assetPath ) as TextureImporter;
    if ( tImporter != null )
    {
        tImporter.textureType = TextureImporterType.Advanced;

        tImporter.isReadable = isReadable;

        AssetDatabase.ImportAsset( assetPath );
        AssetDatabase.Refresh();
    }
}
person Ilya Suzdalnitski    schedule 10.03.2015
comment
Спасибо большое! - person DavidGuaita; 11.03.2015
comment
Поскольку это решение основано на AssetDatabase (находящемся в пространстве имен UnityEditor), его можно использовать только в редакторе. Однако при сборке происходит сбой (не удалось найти имя типа или пространства имен `UnityEditor'). - person Schnodderbalken; 25.08.2015
comment
извините, но это будет работать только в редакторе - person Programmer; 04.11.2017
comment
@Schnodderbalken этот скрипт должен быть помещен в каталог редактора. - person Ilya Suzdalnitski; 04.11.2017
comment
Одна потенциальная проблема: после запуска этого кода ссылка игрового объекта на эту текстуру вызовет исключение nullreferenceException. - person Summer Sun; 24.06.2020