Unity【AssetPostprocessor】- 资源导入处理:TexturePreprocessor

举报
CoderZ1010 发表于 2022/09/25 05:05:05 2022/09/25
【摘要】 AssetPostprocessor允许我们在导入资源时做一些预处理或后处理,以下是官方文档给出的说明: 例如导入Texture贴图资源,我们可以通过在AssetPostprocessor的子类中添加OnPreprocessTexture函数来添加预处理逻辑,添加OnPostprocessTexture函数来实现后处理逻辑,可以理...

AssetPostprocessor允许我们在导入资源时做一些预处理或后处理,以下是官方文档给出的说明:

例如导入Texture贴图资源,我们可以通过在AssetPostprocessor的子类中添加OnPreprocessTexture函数来添加预处理逻辑,添加OnPostprocessTexture函数来实现后处理逻辑,可以理解为导入贴图资源前和完成时的事件、回调。

本文以OnPreprocessTexture为例,首先来看Texture Importer的主要属性:

我们通过继承ScriptableObject类来实现一个以上属性的配置表:

代码如下:


  
  1. using System.IO;
  2. using UnityEditor;
  3. using UnityEngine;
  4. namespace SK.Framework
  5. {
  6. [CreateAssetMenu]
  7. public class TexturePreprocessorConfig : ScriptableObject
  8. {
  9. [SerializeField] private bool isEnabled = false;
  10. [SerializeField] private TextureImporterType textureType = TextureImporterType.Default;
  11. [SerializeField] private TextureImporterShape textureShape = TextureImporterShape.Texture2D;
  12. [SerializeField] private bool sRGBTexture = true;
  13. [SerializeField] private TextureImporterAlphaSource alphaSource = TextureImporterAlphaSource.FromInput;
  14. [SerializeField] private bool alphaIsTransparency;
  15. [SerializeField] private bool ignorePNGFileGamma;
  16. [Header("Advanced")]
  17. [SerializeField] private TextureImporterNPOTScale nonPowerOf2 = TextureImporterNPOTScale.ToNearest;
  18. [SerializeField] private bool readWriteEnabled;
  19. [SerializeField] private bool streamingMipmaps;
  20. [SerializeField] private bool vitrualTextureOnly;
  21. [SerializeField] private bool generateMipMaps = true;
  22. [SerializeField] private bool borderMipMaps;
  23. [SerializeField] private TextureImporterMipFilter mipmapFilter = TextureImporterMipFilter.BoxFilter;
  24. [SerializeField] private bool mipMapsPreserveCoverage;
  25. [SerializeField] private bool fadeoutMipMaps;
  26. [SerializeField] private TextureWrapMode wrapMode = TextureWrapMode.Repeat;
  27. [SerializeField] private FilterMode filterMode = FilterMode.Bilinear;
  28. [SerializeField, Range(0, 16)] private int anisoLevel = 1;
  29. [SerializeField] private int maxSize = 2048;
  30. [SerializeField] private TextureImporterFormat format = TextureImporterFormat.Automatic;
  31. [SerializeField] private TextureImporterCompression compression = TextureImporterCompression.Compressed;
  32. [SerializeField] private bool useCrunchCompression;
  33. private static TexturePreprocessorConfig config;
  34. private static TexturePreprocessorConfig Config
  35. {
  36. get
  37. {
  38. if (config == null)
  39. {
  40. var path = "Assets/Profile/Texture Postprocessor Config.asset";
  41. config = AssetDatabase.LoadAssetAtPath<TexturePreprocessorConfig>(path);
  42. if (config == null)
  43. {
  44. config = CreateInstance<TexturePreprocessorConfig>();
  45. var directory = Application.dataPath + "/Profile";
  46. if (!Directory.Exists(directory))
  47. {
  48. Directory.CreateDirectory(Application.dataPath + "/Profile");
  49. }
  50. AssetDatabase.CreateAsset(config, path);
  51. AssetDatabase.Refresh();
  52. }
  53. }
  54. return config;
  55. }
  56. }
  57. public static bool IsEnabled { get { return Config.isEnabled; } }
  58. public static TextureImporterType TextureType { get { return Config.textureType; } }
  59. public static TextureImporterShape TextureShape { get { return Config.textureShape; } }
  60. public static bool SRGBTexture { get { return Config.sRGBTexture; } }
  61. public static TextureImporterAlphaSource AlphaSource { get { return Config.alphaSource; } }
  62. public static bool AlphaIsTransparency { get { return Config.alphaIsTransparency ; } }
  63. public static bool IgnorePNGFileGamma { get { return Config.ignorePNGFileGamma; } }
  64. public static TextureImporterNPOTScale NonPowerOf2 { get { return Config.nonPowerOf2; } }
  65. public static bool ReadWriteEnabled { get { return Config.readWriteEnabled; } }
  66. public static bool StreamingMipmaps { get { return Config.streamingMipmaps; } }
  67. public static bool VitrualTextureOnly { get { return Config.vitrualTextureOnly; } }
  68. public static bool GenerateMipMaps { get { return Config.generateMipMaps; } }
  69. public static bool BorderMipMaps { get { return Config.borderMipMaps; } }
  70. public static TextureImporterMipFilter MipmapFilter { get { return Config.mipmapFilter; } }
  71. public static bool MipMapsPreserveCoverage { get { return Config.mipMapsPreserveCoverage; } }
  72. public static bool FadeoutMipMaps { get { return Config.fadeoutMipMaps; } }
  73. public static TextureWrapMode WrapMode { get { return Config.wrapMode; } }
  74. public static FilterMode FilterMode { get { return Config.filterMode; } }
  75. public static int AnisoLevel { get { return Config.anisoLevel; } }
  76. public static int MaxSize { get { return Config.maxSize; } }
  77. public static TextureImporterFormat Format { get { return Config.format; } }
  78. public static TextureImporterCompression Compression { get { return Config.compression; } }
  79. public static bool UseCrunchCompression { get { return Config.useCrunchCompression; } }
  80. }
  81. }

有了配置表后,在OnPreprocessTexture函数中根据配置来对TextureImporter进行设置,代码如下:


  
  1. using UnityEngine;
  2. using UnityEditor;
  3. namespace SK.Framework
  4. {
  5. public class TexturePreprocessor : AssetPostprocessor
  6. {
  7. public void OnPreprocessTexture()
  8. {
  9. if (!TexturePreprocessorConfig.IsEnabled) return;
  10. Debug.Log($"OnPreprocessTexture {assetPath}");
  11. TextureImporter importer = assetImporter as TextureImporter;
  12. if (importer == null) return;
  13. importer.textureShape = TexturePreprocessorConfig.TextureShape;
  14. importer.sRGBTexture = TexturePreprocessorConfig.SRGBTexture;
  15. importer.alphaSource = TexturePreprocessorConfig.AlphaSource;
  16. importer.alphaIsTransparency = TexturePreprocessorConfig.AlphaIsTransparency;
  17. importer.ignorePngGamma = TexturePreprocessorConfig.IgnorePNGFileGamma;
  18. importer.npotScale = TexturePreprocessorConfig.NonPowerOf2;
  19. importer.isReadable = TexturePreprocessorConfig.ReadWriteEnabled;
  20. importer.streamingMipmaps = TexturePreprocessorConfig.StreamingMipmaps;
  21. importer.vtOnly = TexturePreprocessorConfig.VitrualTextureOnly;
  22. importer.mipmapEnabled = TexturePreprocessorConfig.GenerateMipMaps;
  23. importer.borderMipmap = TexturePreprocessorConfig.BorderMipMaps;
  24. importer.mipmapFilter = TexturePreprocessorConfig.MipmapFilter;
  25. importer.mipMapsPreserveCoverage = TexturePreprocessorConfig.MipMapsPreserveCoverage;
  26. importer.fadeout = TexturePreprocessorConfig.FadeoutMipMaps;
  27. importer.wrapMode = TexturePreprocessorConfig.WrapMode;
  28. importer.filterMode = TexturePreprocessorConfig.FilterMode;
  29. importer.anisoLevel = TexturePreprocessorConfig.AnisoLevel;
  30. importer.maxTextureSize = TexturePreprocessorConfig.MaxSize;
  31. importer.textureFormat = TexturePreprocessorConfig.Format;
  32. importer.textureCompression = TexturePreprocessorConfig.Compression;
  33. importer.crunchedCompression = TexturePreprocessorConfig.UseCrunchCompression;
  34. importer.textureType = TexturePreprocessorConfig.TextureType;
  35. }
  36. }
  37. }

例如我们在搭建UI时,可以将Texture Type设为Sprite类型,那么在将UI切图导入到Unity中时,将自动将其设为Sprite类型:

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/123241490

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。