宽高比不正确导入的图像统一编辑器脚本

时间:2018-08-22 16:06:16

标签: c# image unity3d textures aspect-ratio

我编写了一个脚本,当我将其导入为单位时,应该确保图像的宽高比保持不变。
这是脚本:

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

该脚本位于Assets中的Editor文件夹中。 但是,当我导入图像时,我得到以下结果:

enter image description here

这绝对不是我想要的。
它应该看起来像这样:

enter image description here

但是当我只是去检查导入图像的检查器并更改随机设置并点击应用纹理时,它的确获得了正确的宽高比。以及我在代码中修改的设置。当我检查图像时是正确的。但是图像的纵横比不正确。
参见下图:

enter image description here

如何从getgo(当我导入图像时)开始使图像具有正确的宽高比。因为我不想手动执行此操作,因为我必须导入杂乱无章的图像。

让我知道是否有不清楚的地方,以便我澄清。

1 个答案:

答案 0 :(得分: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();
    }
}