AssetPostprocessor
AssetPostprocessor类用于在Unity中对导入的资源进行自动化处理,比如修改纹理设置、调整模型导入选项等。通过重写其方法,可以在资源导入前后进行自定义操作,从而提高工作效率和资源管理的灵活性。
纹理示例
在纹理处理方面,AssetPostprocessor
提供了OnPreprocessTexture
和OnPostprocessTexture
两个主要方法。OnPreprocessTexture
允许你在纹理导入前设置属性,比如调整压缩格式、最大尺寸或设置为高级导入选项。而OnPostprocessTexture
则可以在纹理导入后进行修改,如进一步处理纹理或应用自定义滤镜。
using UnityEngine;
using UnityEditor;
public class TexturePostProcessor : AssetPostprocessor
{
// 在纹理导入前调用
void OnPreprocessTexture()
{
TextureImporter importer = (TextureImporter)assetImporter;
// 设置纹理的最大尺寸
importer.maxTextureSize = 1024;
// 设置纹理的类型为默认(可以根据需要更改)
importer.textureType = TextureImporterType.Default;
// 设置纹理的压缩格式
importer.textureCompression = TextureImporterCompression.Compressed;
// 其他设置...
}
// 在纹理导入后调用
void OnPostprocessTexture(Texture2D texture)
{
// 这里可以进一步处理导入后的纹理
Debug.Log("Texture imported: " + texture.name);
// 例如,可以在这里应用一些自定义滤镜或效果
//灰度滤镜
ApplyGrayscale(texture);
}
private void ApplyGrayscale(Texture2D texture)
{
// 获取纹理的像素数据
Color[] pixels = texture.GetPixels();
// 遍历每个像素并转换为灰度
for (int i = 0; i < pixels.Length; i++)
{
float grayValue = pixels[i].grayscale;
pixels[i] = new Color(grayValue, grayValue, grayValue, pixels[i].a);
}
// 将修改后的像素数据重新设置回纹理
texture.SetPixels(pixels);
texture.Apply(); // 应用更改
}
}
模型示例
在模型处理方面,AssetPostprocessor
提供了OnPreprocessModel
和OnPostprocessModel
方法。通过这两个方法,你可以在导入3D模型时自动设置各种选项,比如调整网格的缩放、改变法线计算方式或设置材质等。
using UnityEngine;
using UnityEditor;
public class ModelPostProcessor : AssetPostprocessor
{
void OnPreprocessModel()
{
ModelImporter importer = (ModelImporter)assetImporter;
// 设置模型的法线计算方式
importerNormals = ModelImporterNormals.Calculate;
// 设置切线计算方式
importer.tangentImportMode = ModelImporterTangents.Calculate;
// 可选择设置缩放因子
importer.globalScale = 1.0f; // 修改为需要的缩放因子
}
void OnPostprocessModel(GameObject model)
{
// 获取模型的所有子对象
foreach (Transform child in model.transform)
{
// 自动应用指定的材质(假设材质在Resources文件夹中)
var renderer = child.GetComponent<Renderer>();
if (renderer != null)
{
Material material = Resources.Load<Material>("Materials/MyMaterial"); // 修改为你的材质路径
if (material != null)
{
renderer.material = material;
}
}
}
Debug.Log("Processed model: " + model.name);
}
}
实际使用示例
using UnityEditor;
using UnityEngine;
public class TextureImporterSettings : AssetPostprocessor
{
private const int MaxTextureSize = 8192;
//这是主要的回调函数,当导入纹理时被调用。
private void OnPreprocessTexture()
{
//首先检查 assetImporter 是否为 TextureImporter,并排除在 Packages 文件夹中的纹理。
if (assetImporter is TextureImporter importer)
{
if (IsInPackagesFolder(assetImporter.assetPath))
{
return;
}
//如果导入设置缺失,设置纹理为不可读,过滤模式为双线性,禁用 mipmap。
//第一次导入
if (importer.importSettingsMissing)
{
importer.isReadable = false;
importer.filterMode = FilterMode.Bilinear;
importer.mipmapEnabled = false;
}
Debug.Log($"Before Compression == AssetName:{importer.name}, AssetPath:{importer.assetPath}, TextureSize:{importer.maxTextureSize}, TextureFormat:{importer.GetAutomaticFormat("Default")}");
var defaultSettings = importer.GetDefaultPlatformTextureSettings();
var platform = "DefaultTexturePlatform";
//根据当前平台(Android 或 iOS)获取默认纹理设置,并计算最大纹理尺寸。
#if UseUASEditor || UNITY_ANDROID
var textureImporterSettings = importer.GetPlatformTextureSettings("Android");
platform = "Android";
#elif UNITY_IOS
var textureImporterSettings = importer.GetPlatformTextureSettings("iPhone");
platform = "iPhone";
#endif
var textureImporterMaxSize = Mathf.Min(textureImporterSettings.maxTextureSize, MaxTextureSize, defaultSettings.maxTextureSize);
//根据纹理类型(法线贴图或默认类型)设置不同的纹理格式(ASTC 4x4 或 ASTC 6x6)。
if (importer.textureType == TextureImporterType.NormalMap)
{
SetPlatformSettings(importer, platform, TextureImporterFormat.ASTC_4x4, textureImporterMaxSize);
}
else if (importer.textureType == TextureImporterType.Default)
{
SetPlatformSettings(importer, platform, TextureImporterFormat.ASTC_6x6, textureImporterMaxSize);
}
//使用 AssetDatabase.ImportAsset 强制更新纹理设置。
AssetDatabase.ImportAsset(assetImporter.assetPath, ImportAssetOptions.ForceUpdate);
Debug.Log($"After Compression == AssetName:{importer.name}, AssetPath:{importer.assetPath}, TextureSize:{importer.maxTextureSize}, TextureFormat:{importer.GetAutomaticFormat(platform)}");
}
}
//创建 TextureImporterPlatformSettings 对象,并配置纹理格式、最大尺寸和压缩类型。
private void SetPlatformSettings(TextureImporter importer, string platformName, TextureImporterFormat format, int maxTextureSize)
{
var platformSettings = new TextureImporterPlatformSettings
{
name = platformName,
overridden = true, //表示将使用此设置覆盖默认设置。
format = format,
maxTextureSize = maxTextureSize,
//指定纹理的压缩类型,比如 TextureImporterCompression.Compressed(压缩)或 TextureImporterCompression.Uncompressed(未压缩)。
//选择压缩类型会影响纹理的加载速度、内存使用和视觉效果。
textureCompression = TextureImporterCompression.Compressed
};
importer.SetPlatformTextureSettings(platformSettings);
}
private bool IsInPackagesFolder(string assetPath)
{
// 检查路径是否包含 "Packages" 或者 ThirdParty
return assetPath.Contains("Packages/") || assetPath.Contains("/ThirdParty/");
}
}