一般我们在Unity中使用图片的时候,导入图片的时候都会采取默认设置,如果我们使用Atlas(图集)功能的话,会将好多张图片按照一定大小放到一张图集中去,如果图片多了,有可能图集大小就会过大,然而当当当,在图片的导入设置中有这么一项,MaxSize,这个参数决定了当前图集允许的最大大小,现在碰到这么一个需求,需要修改所有项目中图片的这个设置为固定大小,如果一个个图片去设置,那真的是一个庞大的工作量,这时候强大的度娘就派上用场了,在大量API文档和各种例子中取其精华去其糟粕,获得了一个这样的工具,根据文件夹路径修改所有图片的导入设置为可选配置的值,具体内容就让我们一起来看看吧,啊哈哈。
首先看看导入设置是个什么鬼,见下图
这时候我们需要修改的参数就是Default中的MaxSize,
滴滴滴 注意长代码来袭,精华所在。
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
public class AtlasSetting : EditorWindow
{
/// <summary>
/// 纹理最大大小
/// </summary>
int m_nTexMaxSize = 1024;
/// <summary>
/// 是否重写其他设置(PC,安卓,IOS)
/// </summary>
bool m_bIsOverride = true;
/// <summary>
/// 默认纹理导入格式
/// </summary>
TextureImporterFormat m_nDefaultPlatformImporterFormat=TextureImporterFormat.Automatic;
/// <summary>
/// 安卓平台纹理导入格式
/// </summary>
TextureImporterFormat m_nAndroidPlatformImporterFormat=TextureImporterFormat.Automatic;
/// <summary>
/// PC纹理导入格式
/// </summary>
TextureImporterFormat m_nPCPlatformImporterFormat=TextureImporterFormat.Automatic;
/// <summary>
/// 苹果纹理导入格式
/// </summary>
TextureImporterFormat m_nIphonePlatformImporterFormat=TextureImporterFormat.Automatic;
/// <summary>
/// 纹理压缩质量
/// </summary>
TextureImporterCompression m_nImporterCompression = TextureImporterCompression.Compressed;
[MenuItem("Tools/AtlasSetting")]
static void ChangeTextureSetting()
{
//创建窗口
Rect window = new Rect(500, 500, 500, 500);
AtlasSetting setting = (AtlasSetting)EditorWindow.GetWindowWithRect(typeof(AtlasSetting), window, false, "AtlasSetting");
setting.Show();
}
private void OnGUI()
{
EditorGUILayout.Space();//空一行
EditorGUILayout.LabelField("修改纹理的设置",new GUIStyle() { alignment=TextAnchor.MiddleCenter, fontSize=16},GUILayout.Height(30));
EditorGUILayout.Space();//空一行
m_nTexMaxSize = int.Parse(EditorGUILayout.TextField("Sprite Max Size","1024"));
EditorGUILayout.Space();//空一行
m_bIsOverride = EditorGUILayout.Toggle("Is Override Other Device",true);
EditorGUILayout.Space();//空一行
m_nDefaultPlatformImporterFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup("Default", m_nDefaultPlatformImporterFormat);
EditorGUILayout.Space();//空一行
m_nPCPlatformImporterFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup(" PC", m_nPCPlatformImporterFormat);
EditorGUILayout.Space();//空一行
m_nAndroidPlatformImporterFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup("Android", m_nAndroidPlatformImporterFormat);
EditorGUILayout.Space();//空一行
m_nIphonePlatformImporterFormat = (TextureImporterFormat)EditorGUILayout.EnumPopup("Iphone", m_nIphonePlatformImporterFormat);
EditorGUILayout.Space();//空一行
if (GUILayout.Button("开始设置", GUILayout.ExpandWidth(true),GUILayout.Height(50)))
{
EditorUtility.DisplayProgressBar("Loading", "in progress", m_fSliderValue);
ChangeAllFileSetting();
}
}
bool m_bIsShowProgressBar = false;
float m_fSliderValue = 0;
/// <summary>
/// 此方法弃用
/// </summary>
static void StartSetting()
{
//var a = Packer.atlasNames;
//var b = Packer.GetTexturesForAtlas(a[0]);
//SpriteAtlas atlas = AssetDatabase.LoadAssetAtPath<SpriteAtlas>(path);
//var c = Packer.GetAlphaTexturesForAtlas(a[1]);
//var d =Packer.
//SpriteAtlasExtensions.GetTextureSettings()
//Debug.Log(a.Length.ToString());
}
/// <summary>
/// 按钮点击的时候开始改变文件设置
/// </summary>
void ChangeAllFileSetting()
{
imageCount = 0;
string filePath = GetSpritePath();
DirectoryInfo dirInfo = new DirectoryInfo(filePath);
CheckDirectory(dirInfo);
var flag = EditorUtility.DisplayDialog("修改完成", $"共修改了{imageCount}个图片", "完成");
EditorUtility.ClearProgressBar();
}
int imageCount = 0;
/// <summary>
/// 这里使用一个迭代函数来处理所有文件夹里面嵌套的文件夹内容
/// </summary>
/// <param name="directoryInfo"></param>
void CheckDirectory(DirectoryInfo directoryInfo)
{
DirectoryInfo[] infos = directoryInfo.GetDirectories();
for (int i = 0,length=infos.Length; i < length; i++)
{
CheckDirectory(infos[i]);
//break;
}
FileInfo[] files = directoryInfo.GetFiles();
ChangeSettingByFolder(files);
}
/// <summary>
/// 改变文件数组中所有文件的设置
/// </summary>
/// <param name="files"></param>
void ChangeSettingByFolder(FileInfo[] files)
{
for (int i = 0, length = files.Length; i < length; i++)
{
if (!files[i].Name.Contains("meta"))
{
string onePath = GetImageProjectPath(files[i].FullName);
TextureImporter m_pImporter = AssetImporter.GetAtPath(onePath) as TextureImporter;
if (m_pImporter == null)
continue;
ChangeTextureSetting(m_pImporter);
imageCount++;
m_fSliderValue = imageCount * 1.0f / 3000;
EditorUtility.DisplayProgressBar("Loading", "in progress", m_fSliderValue);
}
}
}
/// <summary>
/// 根据固定字符串得到资源路径
/// </summary>
/// <param name="fullName"></param>
/// <returns></returns>
string GetImageProjectPath(string fullName)
{
string result = "";
int index = fullName.LastIndexOf("Assets");
result = fullName.Substring(index, fullName.Length- index);
return result;
}
/// <summary>
/// 改变纹理设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeTextureSetting(TextureImporter textureImporter)
{
if (textureImporter == null)
{
Debug.LogError("获取设置失败");
return;
}
ChangeDefaultSetting(textureImporter);
ChangePCSetting(textureImporter);
ChangeIphoneSetting(textureImporter);
ChangeAndroidSetting(textureImporter);
textureImporter.SaveAndReimport();
}
/// <summary>
/// 修改默认设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeDefaultSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings defaultSetting = textureImporter.GetDefaultPlatformTextureSettings();
defaultSetting.maxTextureSize = m_nTexMaxSize;
//defaultSetting.compressionQuality = defaultSetting.compressionQuality;
defaultSetting.crunchedCompression = false;
defaultSetting.textureCompression = m_nImporterCompression;
defaultSetting.format = m_nDefaultPlatformImporterFormat;
textureImporter.SetPlatformTextureSettings(defaultSetting);
}
/// <summary>
/// 设置所有的设备
/// </summary>
/// <param name="platformSettings"></param>
void SetTextureValue(TextureImporterPlatformSettings platformSettings)
{
platformSettings.maxTextureSize = m_nTexMaxSize;
platformSettings.overridden = m_bIsOverride;
}
/// <summary>
/// 修改PC设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangePCSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings pcSetting = textureImporter.GetPlatformTextureSettings("Standalone");
SetTextureValue(pcSetting);
pcSetting.format = m_nPCPlatformImporterFormat;
textureImporter.SetPlatformTextureSettings(pcSetting);
}
/// <summary>
/// 修改安卓设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeAndroidSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings androidSetting = textureImporter.GetPlatformTextureSettings("Android");
SetTextureValue(androidSetting);
androidSetting.format = m_nAndroidPlatformImporterFormat;
textureImporter.SetPlatformTextureSettings(androidSetting);
}
/// <summary>
/// 修改ios设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeIphoneSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings iphoneSetting = textureImporter.GetPlatformTextureSettings("Iphone");
SetTextureValue(iphoneSetting);
iphoneSetting.format = m_nIphonePlatformImporterFormat;
textureImporter.SetPlatformTextureSettings(iphoneSetting);
}
static string GetSpritePath()
{
string streamPath = Application.streamingAssetsPath;
string parentPath=streamPath.Substring(0, streamPath.LastIndexOf('/'));
string resultPath = Path.Combine(parentPath, "自己的文件路径");
return resultPath;
}
}
这里有几点需要注意:
1. GetPlatformTextureSettings通过这个接口获取的不同平台的设置对应图片中所示的内容设置
2. 在修改设置值之后需要调用TextureImporter.SaveAndReimport()这个方法来使修改的设置生效,并重新导入。
OK大功告成,需要修改其他参数可以参考官方文档的关于TextureImporter这个类的说明。官方说明
这个导入设置还有上半部分的设置也可以通过脚本修改,但是没有试过,有需要的小伙伴可以自己去摸索摸索,这里提示可以通过TextureImporter.ReadTextureSettings()获取纹理设置,之后修改对应参数,在通过TextureImporter.SetTextureSettings()去使设置生效。具体能否成功,各位看官自行验证吧!!!
在导入时设置图片,Unity为我们提供了一个API(AssetPostprocessor),这里面有我们要用的东西。见代码:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class TextureImporterSetting : AssetPostprocessor
{
//----------------导入设置----------
/// <summary>
/// 纹理最大大小
/// </summary>
int m_nTexMaxSize = 1024;
/// <summary>
/// 是否重写其他设置(PC,安卓,IOS)
/// </summary>
bool m_bIsOverride = true;
/// <summary>
/// 格式
/// </summary>
TextureImporterFormat formatSetting = TextureImporterFormat.Automatic;
/// <summary>
/// 压缩质量
/// </summary>
TextureImporterCompression qualitySetting = TextureImporterCompression.Compressed;
/// <summary>
/// 当一个texture2D在Unity压缩它之前完成导入时,会调用这个函数
/// </summary>
void OnPreprocessTexture()
{
TextureImporter textureImporter=assetImporter as TextureImporter;
if (textureImporter != null)
{
ChangeSpriteSetting(textureImporter);
}
}
void ChangeSpriteSetting(TextureImporter textureImporter)
{
ChangeDefaultSetting(textureImporter);
ChangePCSetting(textureImporter);
ChangeIphoneSetting(textureImporter);
ChangeAndroidSetting(textureImporter);
}
/// <summary>
/// 修改默认设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeDefaultSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings defaultSetting = textureImporter.GetDefaultPlatformTextureSettings();
defaultSetting.maxTextureSize = m_nTexMaxSize;
//defaultSetting.compressionQuality = defaultSetting.compressionQuality;
defaultSetting.crunchedCompression = false;
defaultSetting.textureCompression = qualitySetting;
defaultSetting.format = formatSetting;
textureImporter.SetPlatformTextureSettings(defaultSetting);
}
/// <summary>
/// 设置所有的设备
/// </summary>
/// <param name="platformSettings"></param>
void SetTextureValue(TextureImporterPlatformSettings platformSettings)
{
platformSettings.maxTextureSize = m_nTexMaxSize;
platformSettings.overridden = m_bIsOverride;
}
/// <summary>
/// 修改PC设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangePCSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings pcSetting = textureImporter.GetPlatformTextureSettings("Standalone");
SetTextureValue(pcSetting);
pcSetting.format = formatSetting;
textureImporter.SetPlatformTextureSettings(pcSetting);
}
/// <summary>
/// 修改安卓设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeAndroidSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings androidSetting = textureImporter.GetPlatformTextureSettings("Android");
SetTextureValue(androidSetting);
androidSetting.format = formatSetting;
textureImporter.SetPlatformTextureSettings(androidSetting);
}
/// <summary>
/// 修改ios设置
/// </summary>
/// <param name="textureImporter"></param>
void ChangeIphoneSetting(TextureImporter textureImporter)
{
TextureImporterPlatformSettings iphoneSetting = textureImporter.GetPlatformTextureSettings("Iphone");
SetTextureValue(iphoneSetting);
iphoneSetting.format = formatSetting;
textureImporter.SetPlatformTextureSettings(iphoneSetting);
}
}
以上修改了图片的设置,但是在项目中我们往往还会碰到修改图集的需求,尤其在后期项目做优化的时候,对图集的管理就更加至关重要了,后来发现雨松的一篇文章对此进行实现,在这里也分享一下,同时自己也记录一下,后面用到方便。o(* ̄▽ ̄*)ブ
using System;
using System.Linq;
using UnityEngine;
using UnityEditor;
using UnityEditor.Sprites;
using System.Collections.Generic;
// DefaultPackerPolicy will pack rectangles no matter what Sprite mesh type is unless their packing tag contains "[TIGHT]".
class CustomAtlasPolicy : UnityEditor.Sprites.IPackerPolicy
{
protected class Entry
{
public Sprite sprite;
public AtlasSettings settings;
public string atlasName;
public SpritePackingMode packingMode;
}
public virtual int GetVersion() { return 1; }
protected virtual string TagPrefix { get { return "[TIGHT]"; } }
protected virtual bool AllowTightWhenTagged { get { return true; } }
public bool AllowSequentialPacking => true;
public void OnGroupAtlases(BuildTarget target, PackerJob job, int[] textureImporterInstanceIDs)
{
List<Entry> entries = new List<Entry>();
foreach (int instanceID in textureImporterInstanceIDs)
{
TextureImporter ti = EditorUtility.InstanceIDToObject(instanceID) as TextureImporter;
TextureFormat desiredFormat;
ColorSpace colorSpace;
int compressionQuality;
ti.ReadTextureImportInstructions(target, out desiredFormat, out colorSpace, out compressionQuality);
TextureImporterSettings tis = new TextureImporterSettings();
ti.ReadTextureSettings(tis);
Sprite[] sprites = AssetDatabase.LoadAllAssetRepresentationsAtPath(ti.assetPath).Select(x => x as Sprite).Where(x => x != null).ToArray();
foreach (Sprite sprite in sprites)
{
//在这里设置每个图集的参数
Entry entry = new Entry();
entry.sprite = sprite;
entry.settings.format = desiredFormat;
//entry.settings.usageMode = ins.usageMode;
entry.settings.colorSpace = colorSpace;
entry.settings.compressionQuality = compressionQuality;
entry.settings.filterMode = Enum.IsDefined(typeof(FilterMode), ti.filterMode) ? ti.filterMode : FilterMode.Bilinear;
entry.settings.maxWidth = 1024;
entry.settings.maxHeight = 1024;
entry.atlasName = ParseAtlasName(ti.spritePackingTag);
entry.packingMode = GetPackingMode(ti.spritePackingTag, tis.spriteMeshType);
entries.Add(entry);
}
Resources.UnloadAsset(ti);
}
// First split sprites into groups based on atlas name
var atlasGroups =
from e in entries
group e by e.atlasName;
foreach (var atlasGroup in atlasGroups)
{
int page = 0;
// Then split those groups into smaller groups based on texture settings
var settingsGroups =
from t in atlasGroup
group t by t.settings;
foreach (var settingsGroup in settingsGroups)
{
string atlasName = atlasGroup.Key;
if (settingsGroups.Count() > 1)
atlasName += string.Format(" (Group {0})", page);
job.AddAtlas(atlasName, settingsGroup.Key);
foreach (Entry entry in settingsGroup)
{
job.AssignToAtlas(atlasName, entry.sprite, entry.packingMode, SpritePackingRotation.None);
}
++page;
}
}
}
protected bool IsTagPrefixed(string packingTag)
{
packingTag = packingTag.Trim();
if (packingTag.Length < TagPrefix.Length)
return false;
return (packingTag.Substring(0, TagPrefix.Length) == TagPrefix);
}
private string ParseAtlasName(string packingTag)
{
string name = packingTag.Trim();
if (IsTagPrefixed(name))
name = name.Substring(TagPrefix.Length).Trim();
return (name.Length == 0) ? "(unnamed)" : name;
}
private SpritePackingMode GetPackingMode(string packingTag, SpriteMeshType meshType)
{
if (meshType == SpriteMeshType.Tight)
if (IsTagPrefixed(packingTag) == AllowTightWhenTagged)
return SpritePackingMode.Tight;
return SpritePackingMode.Rectangle;
}
}
此脚本转载于雨松博客,地址:雨松博客
文章浏览阅读10w+次,点赞125次,收藏651次。一、HBuilder IDE的下载HBuilder下载官网地址:在地址栏中直接输入https://www.dcloud.io或者直接点击下面的链接DCloud - HBuilder、HBuilderX、uni-app、uniapp、5+、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架进入官网,免费下载最新版的HBuilder。HBuilder目前有两个版本,一个是windows版,一个是mac版。下载的时候根据自己的电脑选择适合自己的版本。_hbuilder官网
文章浏览阅读9k次,点赞2次,收藏10次。在使用Centos7系统时,一般都需要管理大量的文件(文件夹),这样就要需要用到一些文件管理命令。本文以第一、文件(文件夹)复制命令命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)cp [option] source1 source2 source3 … directory-adfilprsu参数说明:-a:是指archive的意思,也说是指复制..._centos7删除文件夹
文章浏览阅读2.9k次。在H5场景动画时,常常会用到着一样一个效果,箭头持续上下跳动来引导用户上下滑动整个页面<!DOCTYPE html ><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <tit_h5 箭头抖动
文章浏览阅读6k次,点赞13次,收藏86次。1.防御流程图 1 检测中心分析防护网络的分光或者镜像流量 2 检测中心发现流量异常,上报受攻击IP地址到管理中心 3 管理中心向清洗中心下发引流策略 4 通过BGP路由通告,清洗中心将被攻击IP的流量重定向到自身,实现流量牵引 5 清洗中心通过多层过滤的防御技术,丢弃攻击流量,转发正常流量 ._攻击特征库
文章浏览阅读795次。简而言之:软链接相当于windows中的快捷方式硬链接相当于一个灾备系统,数据存放在两处,与复制不同的是两处之间存在同步机制,一处数据的改变会实时同步到另一处,另外一处数据如果被删除了,不会影响到另一处的数据.下面是详细的介绍:存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)软链接文件软链接又叫符号链接,这个文件包含了另一个文..._java处理linux软连接文件
文章浏览阅读344次。目录介绍01.项目介绍02.项目运行03.项目部分介绍04.项目组件化结构05.项目版本更新06.项目第三方库07.项目遇到bug08.项目截图展示09.项目优化处理10.组件化博客11.其他介绍01.项目介绍1.1 项目简介项目整体架构模式采用:组件化+MVP+Rx+Retrofit+design+Dagger2+阿里VLayout+腾讯X5+腾讯bugly包...
文章浏览阅读3.1w次,点赞135次,收藏145次。国产化系统中遇到的视频花屏、卡顿以及延迟问题的记录与总结。_国产化服务器 存在问题
文章浏览阅读409次。点击蓝色“有关SQL”关注我哟加个“星标”,天天与10000人一起快乐成长我曾问过身边的年轻朋友们,你们平时写日记吗?猜猜这些工作2,3年的程序员们,怎么回答。答案自然是五花八门,其中最令..._年度总结写不好会怎样
文章浏览阅读300次。0x01 漏洞原理Windows系统通过解析 .LNK 后缀文件时,是使用二进制来解析的,而当恶意的二进制代码被系统识别执行的时候就可以实现远程代码执行,由于是在explorer.exe进程中运行的,所以load进内存的时候与当前用户具有相同的权限。于是攻击者利用这一解析过程的漏洞,将包含恶意二进制的代码被附带进可移动驱动器(或远程共享过程中),受害者使用powershell解析 ...._能够使用xshell完成cve复现的近两年的cve有哪些
文章浏览阅读132次。java swing如何实现文本域双击变为可编辑呢?给文本域添加鼠标事件监听程序即可:resultTA1=new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new ..._web文本框 双击编辑
文章浏览阅读547次,点赞25次,收藏15次。即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
文章浏览阅读1.6k次。选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>中山大学是广东省一所知名高校,位于广东省广州市,是我国著名的“211大学”、“985工程”之一,现已入选“双一流”建设高校。本期,小编将为大家介绍中山大学在教育部全国第四轮学科评估中的相关学科情况,可供参考。一、中山大学A类学科名单(14个学科)A+:生态学、工商管理A:马克思主义理论、公共管理A-:哲..._中山大学计算机是a类吗