首先提一下 AssetPostprocessor 这个类
是一个编辑器类,一个资源导入的一个管理器,在资源导入之前和之后可以根据导入的资源做一些设置和一些数据的修改,比如网格,纹理的压缩,模型添加组件等。当资源导入之前和之后都会发送通知,可以根据不同的资源类型,在导入之前和之后做不同的处理Unity3d_AssetPostprocessor简单用法 - yhy2218的专栏 - CSDN博客blog.csdn.netUnity3d资源处理器AssetPostprocessor简单用法 - linxinfa的专栏 - CSDN博客blog.csdn.netUnity 之 自动设置导入资源属性选项(模型、图片、声音)yq.aliyun.com
上面文章介绍的都比较详细了,都是我写的时候翻到的。
后面主要讲一下我项目用到的东西。
public class AutoImportSetting : AssetPostprocessor
{
void OnPreprocessAudio()
{
AudioImporter importer = (AudioImporter)assetImporter;
if (importer.assetPath.Contains("Music"))
{
AudioImporterSampleSettings setting = new AudioImporterSampleSettings();
setting.loadType = AudioClipLoadType.Streaming;
setting.compressionFormat = AudioCompressionFormat.Vorbis;
setting.quality = 100;
importer.defaultSampleSettings = setting;
importer.preloadAudioData = false;
importer.loadInBackground = true;
importer.forceToMono = false;
}
else if (importer.assetPath.Contains("Sfx") ||
importer.assetPath.Contains("Se") ||
importer.assetPath.Contains("Vox") ||
importer.assetPath.Contains("UI"))
{
AudioImporterSampleSettings setting = new AudioImporterSampleSettings();
setting.loadType = AudioClipLoadType.DecompressOnLoad;
setting.compressionFormat = AudioCompressionFormat.ADPCM;
importer.defaultSampleSettings = setting;
importer.preloadAudioData = false;
importer.loadInBackground = false;
importer.forceToMono = false;
}
importer.ClearSampleSettingOverride("Android");
importer.ClearSampleSettingOverride("iOS");
}
void OnPreprocessTexture()
{
//自动设置类型;
TextureImporter textureImporter = (TextureImporter)assetImporter;
var path = AssetDatabase.GetAssetPath(textureImporter);
if (!path.Contains(@"Assets/Resources"))//主要是针对是否导入项目某个文件夹下进行判断
{
return;
}
textureImporter.textureType = TextureImporterType.Sprite;
textureImporter.spriteImportMode = SpriteImportMode.Single;
SetTextureFormat(textureImporter);
//TextureImporterPlatformSettings importPlatformAndroid = textureImporter.GetPlatformTextureSettings("Android");
//importPlatformAndroid.overridden = true;
//是否存在透明通道 例如虽是png格式 但是不存在透明通道可根据需求对图形单独做处理
//if (textureImporter.DoesSourceTextureHaveAlpha())
//{
// importPlatformAndroid.format = TextureImporterFormat.ASTC_RGBA_4x4;
//}
//else
//{
// importPlatformAndroid.format = TextureImporterFormat.ASTC_RGBA_4x4;
//}
//textureImporter.SetPlatformTextureSettings(importPlatformAndroid);
//TextureImporterPlatformSettings importPlatformIos = textureImporter.GetPlatformTextureSettings("iPhone");
//importPlatformIos.overridden = true;
//importPlatformIos.format = TextureImporterFormat.ASTC_RGBA_4x4;
//textureImporter.SetPlatformTextureSettings(importPlatformIos);
}
另外 上述这种方法对texture进行的是强制处理,也可手动进行修改,相对而言,代码手动修改比编译器进行全部处理要快得多。
[MenuItem("美术工具/修改Picture所有参数")]
public static void SetAllTextureType()
{
//针对目录下的所有文件进行遍历 取出.png和.jpg文件进行处理 可自行拓展
DirectoryInfo direction = new DirectoryInfo(Application.dataPath + @"\Resources\Picture");
FileInfo[] pngFiles = direction.GetFiles("*.png", SearchOption.AllDirectories);
FileInfo[] jpgfiles = direction.GetFiles("*.jpg", SearchOption.AllDirectories);
SetTexture(pngFiles);
SetTexture(jpgfiles);
}
static void SetTexture(FileInfo[] fileInfo)
{
for (int i = 0; i < fileInfo.Length; i++)
{
//这里第一次写时有一个接口可直接调用,但是第二次写时找不到了 所以用了切割字符
string str = fileInfo[i].FullName;
string resultA = str.Replace("Assets", "|");
string[] splitStr = resultA.Split('|');
string path = "Assets" + splitStr[1];
TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
AutoImportSetting.SetTextureFormat(textureImporter);
}
}
通过上面这种方法可以对项目内所有图片资源进行处理,其他例如音频 模型也是同样道理。