批量设置FBX文件导入模型切线方式
Table of Contents
请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com
原理
利用AssetDatabase.FindAssets("t:Model")
找出所有的FBX模型的GUID。再利用AssetDatabase.GUIDToAssetPath
将GUID转为文件路径。然后使用 AssetImporter.GetAtPath
函数拿到 模型导入器(ModelImporter) 对象。模型导入期对象里面就有一个importTangents
属性项,当此项为None
时表示没切线,其他选项都表示带有切线信息。下面是查找所有带有切线信息的模型的函数。
/// <summary>
/// 查找出带有切线信息的模型
/// </summary>
/// List<string> mikkTSpace 使用Morten Mikkelsen切线空间(MikkTSpace)算法计算生成切线的模型文件名
/// List<string> calculateLegacy 使用传统的算法计算生成切线的模型文件名
/// List<string> calculateLegacyWithSplitTangents,使用传统的算法,并对UV图表进行拆分的方式,计算生成切线的模型文件名
/// List<string> imported 从原始文件中导入切线的模型文件名
private void FindAllModelsContainTangent(List<string> mikkTSpace,List<string> calculateLegacy,
List<string> calculateLegacyWithSplitTangents,List<string> imported)
{
// 使用了库函数,用"t:Model"参数检索所有的模型文件。即FBX文件
// 返回的是所有fbx的GUID
string[] allModels = AssetDatabase.FindAssets("t:Model");
for (int i = 0; i < allModels.Length; i++)
{
// 把GUID换成资源文件路径名,然后使用AssetImporter模块获取到模型导入器
string modelPath = AssetDatabase.GUIDToAssetPath(allModels[i]);
var modelImporter = AssetImporter.GetAtPath(modelPath) as ModelImporter;
if (modelImporter == null)
continue;
switch (modelImporter.importTangents)
{
case ModelImporterTangents.CalculateLegacy: // 使用传统的算法计算生成切线
calculateLegacy.Add(modelPath);
break;
case ModelImporterTangents.CalculateLegacyWithSplitTangents: // 使用传统的算法,并对UV图表进行拆分的方式,计算生成切线
calculateLegacyWithSplitTangents.Add(modelPath);
break;
case ModelImporterTangents.CalculateMikk: // 使用了MikkTSpace方式生成计算切线 http://www.mikktspace.com/
mikkTSpace.Add(modelPath);
break;
case ModelImporterTangents.Import: // 从原始文件中导入切线
imported.Add(modelPath);
break;
case ModelImporterTangents.None:
default:
break;
}
}
}