最近在搞一个比较复杂的项目。用到了好多新知识,也在不断研究中。嘿嘿嘿嘿。。比较开心的是搞明白了图像学中的空间物体拾取。等有时间把那些都给记录上来。现在项目 中出现一个问题是需要往工程中导入很多的模型,差不多快两百个了。我们通常导入模型到工程文件中有一个默认的规范制度,比如我要拖入一个车的模型,我们要在Assets文件夹下创建Models/Car文件夹,然后将car模型拖入到car文件夹里。但是上百个模型这么一个个导入手动创建文件夹感觉太耽误时间,所以就必须自己写一个编辑器帮助工具来帮我们批量导入模型并创建对应的文件夹。
我们都知道,编辑器扩展脚本是要放到Editor文件下才可以运行,所以我们在Editor文件夹下创建一个我们随意命名的脚本。下面就是实现模型批量导入,批量导入设置,批量创建对应的预制体功能实现。
0x00 批量导入模型
批量导入其实就是资源文件的拷贝然后复制到指定的文件夹,对于代码的复制拷贝其实就是文件流的操作。代码贴到下面。
static int num = 0;
static FileInfo[] files;
[MenuItem("JayW/CopyModel")]
public static void CopyFile()
{
//return;
string orginPath = @"C:\Users\Administrator\Desktop\FBX格式02";
if (Directory.Exists(orginPath)&&num==0)
{
DirectoryInfo direction = new DirectoryInfo(orginPath);
files = direction.GetFiles("*.FBX", SearchOption.AllDirectories);
}
//else return;
int index = num;
for (int i = index; i < index + 10; i++)
{
string fileName = files[i].Name;
string folderName = Application.dataPath + "/Models/" + Path.GetFileNameWithoutExtension(fileName);
string targetPath = folderName + "/"+ fileName;//目标文件夹
if (!Directory.Exists(targetPath)) Directory.CreateDirectory(folderName);
files[i].CopyTo(targetPath);
num=i;
}
Debug.Log(num + "success");
}
上面代码for循环中的index+10是每次导入10个模型,我测试一次导入100多个没卡,也可能是我模型不大的原因,如果你对你得机器不自信或者模型资源确实很大,那就设置每次导入少数量的然后分批次导入。
0x01 模型导入设置
我们知道unity对于被烘焙的模型导入设置中,要勾选Generate LightMap UVs。
unity土工模型导入设置中有个API就是ModelImporter,我们可以使用如下代码获取到对应路径模型的ModelImporter信息。
ModelImporter modelImporter = AssetImporter.GetAtPath(namePath) as ModelImporter;
由于我们使用的unity提供的API,所以对于路径我们不必要获取到底是什么盘啊什么的,unity内部已经给你处理了,我们只需要直接写上Assets/**/**就可以了。让我们可以很快捷。其实实现思路就是获取Models文件夹下所有FBX格式文件以及舍掉Assets以前的路径,实现代码如下:
[MenuItem("JayW/SetModelImporter")]
public static void SetModelImporter()
{
//return;
string orginPath = Application.dataPath + "/Models";
DirectoryInfo direction = new DirectoryInfo(orginPath);
FileInfo[] files = direction.GetFiles("*.FBX", SearchOption.AllDirectories);
if (files.Length == 0) return;
files.Length.DebugLog();
for (int i = 0; i < files.Length; i++)
{
string[] pathNames = (files[i].FullName).Split(new string[] { "Assets" }, StringSplitOptions.RemoveEmptyEntries);
string namePath = "Assets" + pathNames[1];
ModelImporter modelImporter = AssetImporter.GetAtPath(namePath) as ModelImporter;
//Undo.RecordObject(modelImporter, modelImporter.name);
modelImporter.generateSecondaryUV = true;
//EditorUtility.SetDirty(modelImporter);
modelImporter.SaveAndReimport();
}
}
0x02 批量制作模型预制体
具体实现和上一块差不多,都是获取模型文件然后按照API操作。代码如下:
[MenuItem("JayW/CreatePrefab")]
public static void CreatePrefab()
{
//return;
string orginPath = Application.dataPath + "/Models";
DirectoryInfo direction = new DirectoryInfo(orginPath);
FileInfo[] files = direction.GetFiles("*.FBX", SearchOption.AllDirectories);
if (files.Length == 0) return;
files.Length.DebugLog();
for (int i = 0; i < files.Length; i++)
{
string[] pathNames = (files[i].FullName).Split(new string[] { "Assets" }, StringSplitOptions.RemoveEmptyEntries);
string namePath = "Assets" + pathNames[1];
string fileName = Path.GetFileNameWithoutExtension(files[i].Name);
GameObject gameObj = AssetDatabase.LoadAssetAtPath(namePath);
string targetPath = "Assets/Resources/Pool/Models/" + fileName+".prefab";
PrefabUtility.CreatePrefab(targetPath, gameObj);
}
"success".DebugLog();
}
在用完这个脚本后记得把函数体里的return取消掉注释。防止不小心操作失误又再一次创建预制体啥的。希望本博客对你有帮助。