采坑记录...
最近有需求要将倾斜摄影模型导入到Unity中,由于Unity只支持fbx类型的模型。于是就在想将.osgb类型转化为fbx类型。
经历好一段时间之后才知道FME2018可以支持这两种类型的文件相互转换。于是将模型类型转换好了之后,我发现Unity模型导入也成了
一个问题…(最近才开始学的渣渣)。
后来发现fbx导入Unity有两种方式:
- 直接将fbx模型放到项目目录下,从project视图中直接拖拽至Hierarchy视图中。
- 写脚本
第一种方法很简单,并且可以直接实例化模型,即拖即用(神似IPV6 DHCP协议…),当然坏处也是有的。这种方式方便是方便,但是
当我需要导入的fbx模型不止数个的时候问题就来了。这种方法不支持多选,然后群体拖入Hierarchy视图中这种方法。这时候我就比较
头疼了,开始探索第二种方式:写脚本。
刚开始写脚本的时候又是踩了无数坑,一开始网上的教程都比较麻烦。我去GITHUB搜了脚本,搜到一个FBX importer,但更多的是FBX exporter…
无奈那个脚本clone下来了也不会用。只得自己写。后来发现Resources.Load()方法可以直接将fbx文件导入unity,再循环遍历一下文件夹
就实现了fbx模型的批量导入,但是load方法的输入路径参数比较复杂,在这个地方走了好多弯路。要注意Load的参数不能带后缀。
我把fbx文件都保存在Assets/Resources/fbx文件夹中,方法如下:
string filename = "fbx/" + file;
UnityEngine.Object obj = Resources.Load(filename);
GameObject go = Instantiate(obj) as GameObject;
go.transform.position = new Vector3(0, 0, 0);
导入后将模型的位置设置为(0, 0, 0)。
得到并处理文件名的代码如下:
// file path like F:\Project\Assets\Resources\fbx\Tile_+001_+004_L22_0003010.fbx
string[] files = Directory.GetFiles(path, "*.fbx", SearchOption.AllDirectories);
foreach (string file in files)
{
char[] sp1 = { '\\' };
char[] sp2 = { '.' };
char[] s3 = { '_' };
string name_p1 = file.Split('x')[1];
string name_p2 = name_p1.Split(sp1)[1];
string name_p3 = name_p2.Split(sp2)[0];
try
{
string flag = name_p3.Split(s3)[3];
if (flag == "L19")
{
Lod1Name.Add(name_p3);
}
else if (flag == "L22")
{
Lod0Name.Add(name_p3);
}
//Debug.Log(flag);
}
catch (Exception e)
{
//Debug.Log(name_p3);
Lod2Name.Add(name_p3);
}
}
处理完后的文件名就是无后缀的纯文件名,直接使用Resources.Load(filename)就可以动态,批量加载fbx模型了。
这三个连续的判断语句是为了将导入的fbx模型先分类,并Set给不同的Parent,然后直接将Parent的renderer赋给LODGroup实现LOD功能,后续将逐渐完善。