0

我正在使用 Unity3d 开发游戏。

在项目中存在许多纹理。

如何限制整个项目的纹理大小?

4

2 回答 2

1

如果您使用OnPostprocessTexture,您可以读取每个纹理的实际大小并设置最大大小。

当我想降低低端手机版本的纹理分辨率时,我会使用此代码:

    public void OnPostprocessTexture(Texture2D texture)
    {
        if (!TextureResizingEnabled)
            return;

        TextureImporter textureImporter = assetImporter as TextureImporter;
        TextureImporterFormat format;

        TextureImporterSettings textureImporterSettings = new TextureImporterSettings();
        textureImporter.ReadTextureSettings(textureImporterSettings);

        //grabbing the max texture dimension for use in size calculation
        float size = Mathf.Max(texture.width, texture.height);

        Debug.LogError("original size = " + size + "  orig max size = " + textureImporterSettings.maxTextureSize);

        // Getting the smallest texture size between original texture size, to be resized  by TextureResizingFactor, and maxTextureSize set in asset importer settings:
        size = Mathf.Min(Mathf.Pow(2f, Mathf.Floor(Mathf.Log(size, 2f)) - TextureResizingFactor), textureImporterSettings.maxTextureSize);

        Debug.LogError("chosen   size = " + size);

        // we won't make any changes if the calculate size is lesser than the minimum on Unity dropdown box (32):
        if (size >= 32)
        {
            textureImporterSettings.maxTextureSize = (int)size;
            textureImporter.SetTextureSettings(textureImporterSettings);
        }
    }

它基本上将最大纹理大小除以 2,因此如果您有一个最大大小等于 2048 的纹理,它将设置为 1024,而同一项目中的 512 纹理将设置为 256。这对于降低内存非常有用用法。

在这种情况下使用的缺点OnPostprocessTexture是我必须重新导入纹理两次:第一次将更改纹理最大尺寸,第二次(禁用这段代码)将实际应用新的最大尺寸。发生这种情况是因为我们在导入纹理后设置了新大小,但这是唯一的方法,因为无法在OnPreprocessTexture.

于 2015-04-13T03:58:26.733 回答
1

如果您希望在默认情况下限制导入纹理的大小,则没有直接的方法可以做到这一点,除了在导入后编辑最大大小。默认值始终为 1024。

但是,您可以编写一个自定义AssetPostProcessor(尽管它的名称),它也有一个OnPreprocessTexture方法,您可以使用它来设置导入设置。一个非常简单的例子是这样的:

using UnityEngine;
using UnityEditor;

public class DefaultTextureSizer : AssetPostprocessor 
{

    void OnPreprocessTexture ()
    {
        TextureImporter tex_importer = assetImporter as TextureImporter;
        tex_importer.maxTextureSize = 512; //Some other max size than the default
    }

}

这将确保所有导入的纹理的最大尺寸(在本例中)为 512。

于 2013-09-28T17:50:50.567 回答