批量设置FBX文件导入模型切线方式
请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com
原理
利用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}