Скрипт редактора Unity импортированного изображения с неправильным соотношением сторон

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

public class PostprocessImages : AssetPostprocessor
{
    void OnPostprocessTexture(Texture2D texture)
    {
        TextureImporter textureImporter = (TextureImporter)assetImporter;
        textureImporter.npotScale = TextureImporterNPOTScale.None;
        textureImporter.mipmapEnabled = false;
    }
}

скрипт находится в папке Editor в Assets. Но когда я импортирую изображение, я получаю следующий результат:

введите здесь описание изображения

это определенно не то, что я ищу.
Это должно выглядеть так:

введите здесь описание изображения

Но когда я просто захожу в инспектор импортированного изображения, меняю случайную настройку и нажимаю «Применить», текстура возвращает правильное соотношение сторон. И настройки, которые я изменил в коде. Верны, когда я проверяю изображение. Но у изображения неправильное соотношение сторон..
См. изображение ниже:

введите здесь описание изображения

как мне сделать так, чтобы изображение имело правильное соотношение сторон с самого начала (когда я его импортирую). Потому что я не хочу делать это вручную, так как мне нужно импортировать сотни изображений.

Дайте мне знать, если что-то неясно, чтобы я мог уточнить.


person FutureCake    schedule 22.08.2018    source источник
comment
Необычный. Что произойдет, если вы сделаете Assets->ReimportAll?   -  person Hexodus    schedule 22.08.2018
comment
да, это решает проблему, все еще немного странно   -  person FutureCake    schedule 22.08.2018


Ответы (1)


У меня нет этой проблемы, но я могу подумать о возможных исправлениях.

Первое, что нужно сделать, это использовать функцию OnPreprocessTexture вместо OnPostprocessTexture. Это изменит текстуру перед ее импортом.

public class PostprocessImages : AssetPostprocessor
{
    void OnPreprocessTexture()
    {
        TextureImporter textureImporter = (TextureImporter)assetImporter;
        textureImporter.npotScale = TextureImporterNPOTScale.None;
        textureImporter.mipmapEnabled = false;
    }
}

Если это не сработает, вызовите TextureImporter.SaveAndReimport() после внесения изменений в Texture, чтобы Unity повторно импортировала его после внесения изменений. Вероятно, это решит проблему. Стоит отметить, что вам нужен способ убедиться, что TextureImporter.SaveAndReimport() вызывается один раз, потому что вызов TextureImporter.SaveAndReimport() вызовет OnPreprocessTexture(). Без реализации способа определить это вы войдете в бесконечный цикл бесконечного импорта текстур. В приведенном ниже примере я использовал static List для реализации этого:

static List<TextureImporter> importedTex = new List<TextureImporter>();

void OnPostprocessTexture(Texture2D texture)
{
    TextureImporter textureImporter = (TextureImporter)assetImporter;

    /*Make sure that SaveAndReimport is called once ONLY foe each TextureImporter
     There would be infinite loop if this is not done
     */
    if (!importedTex.Contains(textureImporter))
    {
        textureImporter.npotScale = TextureImporterNPOTScale.None;
        importedTex.Add(textureImporter);
        textureImporter.SaveAndReimport();
    }
}
person Programmer    schedule 22.08.2018
comment
Вы когда-нибудь пробовали это? - person Programmer; 24.08.2018