Unity 如何实现批量修改图片格式

前言

unity开发游戏过程中,经常会批量修改部分图片格式,比如ios端,我们会修改为astc6x6,android端我们会修改为ETC2。又或者我们需要把图片打包图集,需要批量设置SpriteTag。但是当我们导入大量图片时,如果一个文件夹一个文件夹的修改,再加上android和ios不同平台的修改,这就需要大量的操作,而且最要命的时修改完后,如果团队里有人再添加新的图片,上线打包时,还需要重新整理标记图片格式。

那么就需要我们写一个小工具来自动处理这个过程。常用的有两种方式

第一种方式:

使用unity自带的AssetPostprocessor的生命周期,这种方式是在图片导入时或者导入前,介入编辑器的导入回调方法,然后自动设置所有导入图片的格式属性等,这种方法在每次导入都会自动调用,很方便,但是缺点就是,强制性,后续无法手动再调整图片格式了,所以就不太灵活了,因为我们不能保证所有图片都是用一种尺寸和格式。

基本结构如下:

using System.Collections;
using UnityEditor;
public class MyEditor : AssetPostprocessor {
 
	//模型导入之前调用
	public void OnPreprocessModel()
	{
		Debug.Log ("OnPreprocessModel="+this.assetPath);
	}
	//模型导入之前调用
	public void OnPostprocessModel(GameObject go)
	{
		Debug.Log ("OnPostprocessModel="+go.name);
	}
	//纹理导入之前调用,针对入到的纹理进行设置
	public void OnPreprocessTexture()
	{
		Debug.Log ("OnPreProcessTexture="+this.assetPath);
		TextureImporter impor = this.assetImporter as TextureImporter;
		impor.textureFormat = TextureImporterFormat.ARGB32;
		impor.maxTextureSize = 512;
		impor.textureType = TextureImporterType.Advanced;
		impor.mipmapEnabled = false;
	}
 	//声音文件导入前调用
	public void OnPreprocessAudio()
	{
		AudioImporter audio = this.assetImporter as AudioImporter;
		audio.format = AudioImporterFormat.Compressed;
	}

	//所有的资源的导入,删除,移动,都会调用此方法,注意,这个方法是static的
	public static void OnPostprocessAllAssets(string[]importedAsset,string[] deletedAssets,string[] movedAssets,string[]movedFromAssetPaths)
	{
		Debug.Log ("OnPostprocessAllAssets");
		foreach (string str in importedAsset) {
			Debug.Log("importedAsset = "+str);
		}
		foreach (string str in deletedAssets) {
			Debug.Log("deletedAssets = "+str);
		}
		foreach (string str in movedAssets) {
			Debug.Log("movedAssets = "+str);
		}
		foreach (string str in movedFromAssetPaths) {
			Debug.Log("movedFromAssetPaths = "+str);
		}
	}
}

这种方式虽然不灵活,但是我们也可以针对我们自己的项目进行深度定制,比如我们可以对不同文件夹和不同文件名进行不同格式设置。但是代码量会比较多,如果有兴趣可以访问:https://zhuanlan.zhihu.com/p/88568714

第二种方式

使用自定义编辑器按钮,比如:选中图片文件夹时,对选中的文件夹下所有图片进行处理,比较灵活,速度也快。我们可以设置完毕后,再手动微调下特殊的图片格式。
在这里插入图片描述

using System;
using System.IO;
using UnityEngine;
using UnityEditor;

/// <summary>
/// 资源文件导入自动设置程序
/// </summary>
public class AssetProcessor : AssetPostprocessor
{
    [MenuItem("Assets/Custom Reimport Images")]
    public static void SetAllTextureType()
    {
        //获取鼠标点击图片目录
        var arr = Selection.GetFiltered(typeof(DefaultAsset), SelectionMode.Assets);
        string folder = AssetDatabase.GetAssetPath(arr[0]);
        Debug.Log("Reimport Path:" + folder);
    
        //针对目录下的所有文件进行遍历 取出.png和.jpg文件进行处理 可自行拓展
        DirectoryInfo direction = new DirectoryInfo(folder);
        FileInfo[] pngFiles = direction.GetFiles("*.png", SearchOption.AllDirectories);
        FileInfo[] jpgfiles = direction.GetFiles("*.jpg", SearchOption.AllDirectories);
        
        try
        {
            SetTexture(pngFiles);
            SetTexture(jpgfiles);
        }
        catch (Exception e)
        {
            Debug.LogError(e);
        }
        finally
        {
            EditorUtility.ClearProgressBar();
            AssetDatabase.Refresh();
        }
    }
    
    static void SetTexture(FileInfo[] fileInfo)
    {
        for (int i = 0; i < fileInfo.Length; i++)
        {
            //这里第一次写时有一个接口可直接调用,但是第二次写时找不到了 所以用了切割字符
            string fullpath = fileInfo[i].FullName.Replace("\\","/");
            string path = fullpath.Replace(Application.dataPath, "Assets");
            TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;

            EditorUtility.DisplayProgressBar("批量处理图片",fileInfo[i].Name,i/(float)fileInfo.Length);
            SetTextureFormat(textureImporter);
        }
    }

    //设置图片格式
    static void SetTextureFormat(TextureImporter textureImporter)
    {
        //根据路径获得文件夹目录,设置图集的packagingTag
        string AtlasName = new DirectoryInfo(Path.GetDirectoryName(textureImporter.assetPath)).Name;
        textureImporter.mipmapEnabled = false;
        textureImporter.isReadable = false;
        textureImporter.textureType = TextureImporterType.Sprite;
        textureImporter.spritePackingTag = AtlasName;
        textureImporter.wrapMode = TextureWrapMode.Clamp;
        textureImporter.npotScale = TextureImporterNPOTScale.None;
        textureImporter.textureFormat = TextureImporterFormat.Automatic;
        textureImporter.textureCompression = TextureImporterCompression.Compressed;
            
        //Android端单独设置
        TextureImporterPlatformSettings setting_android = new TextureImporterPlatformSettings();
        setting_android.overridden = true;
        setting_android.name = "Android";
        //根据是否有透明度,选择RGBA还是RGB
        if (textureImporter.DoesSourceTextureHaveAlpha())
            setting_android.format = TextureImporterFormat.ETC2_RGBA8;
        else
            setting_android.format = TextureImporterFormat.ETC2_RGB4;
            
        textureImporter.SetPlatformTextureSettings(setting_android);
        
        //IOS端单独设置
        TextureImporterPlatformSettings setting_iphone = new TextureImporterPlatformSettings();
        setting_iphone.overridden = true;
        setting_iphone.name = "iOS";
        //根据是否有透明度,选择RGBA还是RGB
        if (textureImporter.DoesSourceTextureHaveAlpha())
            setting_android.format = TextureImporterFormat.ASTC_RGBA_6x6;
        else
            setting_android.format = TextureImporterFormat.ASTC_RGB_6x6;
        textureImporter.SetPlatformTextureSettings(setting_iphone);
    }
}    

期望这篇文章对你有所帮助。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值