前言

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){//根据路径获得文件夹目录,设置图集的packagingTagstring 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还是RGBif (textureImporter.DoesSourceTextureHaveAlpha())setting_android.format = TextureImporterFormat.ETC2_RGBA8;elsesetting_android.format = TextureImporterFormat.ETC2_RGB4;textureImporter.SetPlatformTextureSettings(setting_android);//IOS端单独设置TextureImporterPlatformSettings setting_iphone = new TextureImporterPlatformSettings();setting_iphone.overridden = true;setting_iphone.name = "iOS";//根据是否有透明度,选择RGBA还是RGBif (textureImporter.DoesSourceTextureHaveAlpha())setting_android.format = TextureImporterFormat.ASTC_RGBA_6x6;elsesetting_android.format = TextureImporterFormat.ASTC_RGB_6x6;textureImporter.SetPlatformTextureSettings(setting_iphone);}
}

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

Unity 如何实现批量修改图片格式相关推荐

  1. 【python】批量按坐标裁剪图片、ImageJ批量修改图片格式

    一.批量按坐标裁剪图片代码 # -- coding: utf-8 -- import cv2 import osdef update(input_img_path, output_img_path): ...

  2. python批量修改图片格式和名称

    在制作数据集的过程中发现找到的图片名称和格式都很混乱,找了别人的发现老是报错. 同时总结了一下我自己这边程序报的错误: 1..jpg已存在** 比如我现在存在2.jpg,通过代码修改也会得到2.jpg ...

  3. Python 批量修改图片格式和尺寸

    公司的一个项目要求把所有4096x4096的图片全部转化成2048x2048的图片,这种批量转换图片大小的软件网上很多,我的同事原来使用的美图看看的批量转换,但是稍微有点麻烦,每次还需要指定要转换的图 ...

  4. 照片如何转格式?怎样批量修改图片格式?

    我们现在都喜欢把图片分享到各种网络平台上去,大部分的网络平台都是JPG格式的,有时候图片是bmp格式或者是其他格式时,导致我们的图片无法上传的时候该怎么办呢?别急,今天小编就为你推荐一款简单实用的BM ...

  5. Python批量修改图片名称,格式,并批量量化

    from PIL import Image import numpy as np import cv2 import matplotlib.pyplot as plt import os####### ...

  6. 在Windows中如何批量修改图片文件格式

    前提 在互联网时代,图片是我们经常使用的信息文件,各种图片也有各自不同的格式,比如常见的存储的格式,"bmp,jpg,tiff,gif,pcx,tga,exif,fpx,svg,psd,cd ...

  7. 新发的日常小实验——使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍数(Unity、PIL、Pillow、压缩)

    文章目录 一.问题:图片导入Unity被调整成2的N次方 二.设置不转换成2的N次方 三.使用ETC压缩格式,图片宽高必须是4的倍数 四.使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍 ...

  8. idea批量修改变量快捷键mac_使用Mac自带功能批量修改图片名称、类型和压缩图片大小...

    Mac电脑自带的聚焦搜索功能已经很强大,可以快速准确的搜索电脑内的文件,但是从网上下载的文件,特别是一些图片文件都是一串数字组成的文件名,很难记忆和搜索,我们可以使用Mac自带的『自动操作』功能给图片 ...

  9. 如何用python批量处理图片大小_python批量修改图片大小的方法

    本文实例为大家分享了python批量修改图片大小的具体代码,供大家参考,具体内容如下 引用的模块 from PIL import Image Image的使用 def resize_image(img ...

  10. php图片大小怎么改,如何批量修改图片大小/尺寸

    小编给大伙分享一个小巧实用的批量修改图片大小工具,可以批量修改图片大小尺寸,限制缩放后的图片文件大小,以满足在线照片打印的要求,或便于上传图片到网店商铺以方便您的照片展示.很是实用! 操作灰常简单的哟 ...

最新文章

  1. 英特尔5G基带发布时间提前半年以上,但2019款iPhone支持5G仍有点悬
  2. 每日一皮:实习生将他的代码交给高级开发人员,高级开发反手一个...
  3. 关于Oracle full outer join 的bug问题分析及处理
  4. 关于卡巴斯基安全免疫区随笔
  5. 关于sendinput() inserted only 0 out of 2 python程序问题的解决
  6. TokuDB在生产环境的应用场景(zabbix也可以)
  7. 公网访问_一文读懂阿里云访问公网的实现方式
  8. mac+免密登陆+linux,mac ssh免密登录Linux
  9. tokengetall php,token_get_all Split given source into PHP tokens php函数分享
  10. Ubuntu-安装MySQL5.7并配置用户名密码
  11. Android数据的几种存储方式---------SharePreferences(轻量的以键值对) 的使用
  12. lisp pline 加点_在cad中如何创建lisp程序?以及大神们所说的lisp解决重复性劳动问题是怎么回事?...
  13. java随机生成测试数据
  14. 布兰迪斯大学计算机科学专业,美国布兰迪斯大学计算机科学博士专业介绍
  15. 对随机数去重并进行排序 java
  16. 完美解决:error: failed to push some refs to 'https://github.com/xxxx.git'
  17. file.getOriginalFilename()
  18. WPS JS宏表格定位实例
  19. CentOS7.6-搭建SFTP服务
  20. 数据分析案例3 海量数据分析---根据Ip地址计算归属地的需求

热门文章

  1. Python源码剖析专栏总览
  2. Latex数学符号输入大全
  3. Hex Editor Crack版,十六进制编辑器使用方案
  4. 奇怪的 Win10 输入法问题
  5. 微软云加速器助edoc2入云腾飞
  6. FPGA学习 Vivado使用篇
  7. Chrome版本下载
  8. 《算法笔记》和《算法笔记上机训练指南》学习笔记汇总
  9. 机器学习:邹博邹伟教学
  10. 【正点原子STM32连载】第一章 本书学习方法 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1