Unity资源导入设置方式选择
本文由 NRatel 历史笔记整理而来,如有错误欢迎指正。
一、两种方式
1、Preset Manager(预置)
https://docs.unity3d.com/2021.3/Documentation/Manual/Presets.html
https://docs.unity3d.com/2021.3/Documentation/Manual/class-PresetManager.html
Preset:
一种可保存和重复应用的资源导入配置模板。
需先在 Inspector 窗口中为某种类型资源(如 Texture、Model、AudioClip)配置好所有导入设置后,将其保存为一个 .preset 文件。
然后在 Inspector 窗口中手动拖拽或应用 Preset 到选中的资源(可多选资源批量应用)。
支持只应用部分字段。
PresetManager:
可在 Edit -> Project Settings -> Preset Manager 中设置默认 Preset。
允许设置 全局默认 和 特定规则的覆盖(路径支持通配符)(存在覆盖时,列表下方覆盖上方)。
生效时机:被路径规则到的资源,将在 新导入 或 在其Inspector上使用Reset命令时应用 Preset。
优缺点:
直观可视、.preset文件可以纳入版本控制系统。
规则仅为路径匹配,无法自定义复杂的导入判断(但不一定需要)。
2、AssetPostprocessor (资源后处理器)
https://docs.unity3d.com/2021.3/Documentation/ScriptReference/AssetPostprocessor.html
一个 C# 脚本 API。通过编写继承自 AssetPostprocessor 的类并覆写其事件方法。
在资源导入过程中动态拦截并修改其导入设置。
OnPreprocessXXX:
在最开始被调用,可在其中覆盖 XXXImporter 的设置,修改其 纹理属性、更改压缩格式等。
注意:修改完成后不应调用 AssetImporter.SaveAndReimport。
OnPostprocessXXX:
在导入完成时被调用,通常只应在其中审视资源,而不应该修改 XXXImporter(因为导入已完成),也不推荐直接操作修改资源。
若在它里面 修改 XXXImporter 的设置,只会在下次导入时生效,这会制造出明显问题。
注意:不要因此强行修改 XXXImporter 并调用 AssetImporter.SaveAndReimport。这将使资源导入2次,导致严重耗时。
OnPostprocessAllAssets:
在完成任意数量的资源导入后(当资源进度条到达末尾时)被调用。
可利用它,在资源导入/删除/移动后,生成或重置资源关联的其他资源。
如:为UI的Sprites目录生成对应的SpriteAltas、为Spine资源生成对应的预设等。
内部常用搭配类 AssetImporter
https://docs.unity3d.com/2021.3/Documentation/ScriptReference/AssetImporter.html
在 AssetPostprocessor 中获取:XXXImporter xxxImporter = (XXXImporter)this.assetImporter;
项目中,除插件携带外,同类型资源尽量只维护一个 XXXPostprocessor,然后在其中分流处理。
原因是:新增 XXXPostprocessor,将导致项目中所有此类型资源的重新导入,而在 XXXPostprocessor 内部修改则不会。
错误示例:AssetPostprocessor_EffectTextures、AssetPostprocessor_SpineTextures、AssetPostprocessor_ModelTextures。。
二、疑问
1、整体导入流程:
Preset基础设置 → OnPreprocessXXX → 检查一致性 -> 标准导入流程 → OnPostprocessXXX --→ OnPostprocessAllAssets
检查一致性时,Unity 通过 .meta 文件的哈希值(资源内容+导入设置)判断是否需要重新导入。
若无需重新导入,将跳过实际生成导入结果(如纹理压缩、模型网格生成等) 的耗时步骤,复用缓存的中间文件(.meta 文件关联这些文件)。
但,即使缓存命中,Unity 仍然会触发 OnPostprocessXXX 和 OnPostprocessAllAssets 事件!
2、PresetManager 和 OnPreprocessXXX 的 触发时机/生效能力对比:
Reimport 文档说明
https://docs.unity3d.com/cn/current/Manual/ImporterConsistency.html
3、ScriptedImporter 是什么?
https://docs.unity3d.com/cn/current/Manual/ScriptedImporters.html
为Unity原生不支持的全新格式的文件(特定扩展名的文件,如:hello.xyz, hello.lua)创建导入器,在内部完成令Unity可识别的资源的组装、创建。
三、项目实际需要分析
1、导入时需按照路径匹配规则设置资源格式、允许特殊情况修改至与当前路径规则不同。
如,个别图需要单独调整为高品质、有 Read/Write、MipMaps、Filter Mode 等需求。
适合 PresetManager。
2、需能检查提示出与当前路径规则不同的文件,避免意外修改、位置挪动等导致的问题。
3、为UI的Sprites目录生成对应的SpriteAltas、为Spine资源生成对应的预设等。
使用 OnPostprocessAllAssets,且在创建图集时:
⑴、仅创建时默认设置图集Texture选项(可特殊修改,不会被覆盖)
⑵、仅创建时默认设置图集格式(可特殊修改,不会被覆盖)
⑶、覆盖设置图集 IncludeInBuild 为 true(个人修改会被覆盖)
⑷、覆盖设置图集打包参数(个人修改会被覆盖)
⑸、覆盖设置图集引用的碎图目录(个人修改会被覆盖)
四、其他
PresetManager 与 并行导入冲突!
开启并行导入后,Preset设置会失效(Unity2021.3.42f1c1中)