批量设置 FBX 文件导入模型切线方式

原理

利用AssetDatabase.FindAssets("t:Model")找出所有的FBX模型的GUID。再利用AssetDatabase.GUIDToAssetPath将GUID转为文件路径。然后使用 AssetImporter.GetAtPath函数拿到 模型导入器(ModelImporter) 对象。模型导入期对象里面就有一个importTangents属性项,当此项为None时表示没切线,其他选项都表示带有切线信息。下面是查找所有带有切线信息的模型的函数。

 1/// <summary>
 2/// 查找出带有切线信息的模型
 3/// </summary>
 4/// List<string> mikkTSpace 使用Morten Mikkelsen切线空间(MikkTSpace)算法计算生成切线的模型文件名
 5/// List<string> calculateLegacy 使用传统的算法计算生成切线的模型文件名
 6/// List<string> calculateLegacyWithSplitTangents,使用传统的算法,并对UV图表进行拆分的方式,计算生成切线的模型文件名
 7/// List<string> imported 从原始文件中导入切线的模型文件名
 8private void FindAllModelsContainTangent(List<string> mikkTSpace,List<string> calculateLegacy,
 9List<string> calculateLegacyWithSplitTangents,List<string> imported)
10{
11    // 使用了库函数,用"t:Model"参数检索所有的模型文件。即FBX文件
12    // 返回的是所有fbx的GUID
13    string[] allModels = AssetDatabase.FindAssets("t:Model");
14
15    for (int i = 0; i < allModels.Length; i++)
16    {
17        // 把GUID换成资源文件路径名,然后使用AssetImporter模块获取到模型导入器
18        string modelPath = AssetDatabase.GUIDToAssetPath(allModels[i]);
19        var modelImporter = AssetImporter.GetAtPath(modelPath) as ModelImporter;
20
21        if (modelImporter == null)
22            continue;
23
24        switch (modelImporter.importTangents)
25        {
26            case ModelImporterTangents.CalculateLegacy: // 使用传统的算法计算生成切线
27                calculateLegacy.Add(modelPath);
28                break;
29            case ModelImporterTangents.CalculateLegacyWithSplitTangents: // 使用传统的算法,并对UV图表进行拆分的方式,计算生成切线
30                calculateLegacyWithSplitTangents.Add(modelPath);
31                break;
32            case ModelImporterTangents.CalculateMikk: // 使用了MikkTSpace方式生成计算切线 http://www.mikktspace.com/
33                mikkTSpace.Add(modelPath);
34                break;
35            case ModelImporterTangents.Import: // 从原始文件中导入切线
36                imported.Add(modelPath);
37                break;
38            case ModelImporterTangents.None:
39            default:
40                break;
41        }
42    }
43}

参考网页

MikkTSpace方式生成计算切线