Unity资源导入设置方式选择

发布于:2025-09-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

本文由 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中)