我正在使用 Unity3d 开发游戏。
在项目中存在许多纹理。
如何限制整个项目的纹理大小?
如果您使用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
.
如果您希望在默认情况下限制导入纹理的大小,则没有直接的方法可以做到这一点,除了在导入后编辑最大大小。默认值始终为 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。