Unity - 自定义导出和导入 FBX 数据

Posted

技术标签:

【中文标题】Unity - 自定义导出和导入 FBX 数据【英文标题】:Unity - custom Export and Import FBX Data 【发布时间】:2015-11-27 15:27:25 【问题描述】:

我正在尝试在导出时从 3dsmax 将自定义数据写入 FBX 文件。即使我现在不知道该怎么做,这也是可能的。 但我的问题是如何在导入时读取 Unity 中的那些自定义 FBX 数据。

非常感谢。

【问题讨论】:

【参考方案1】:

执行此操作的简单方法是向 Maya/Max 场景中的对象添加自定义属性,然后使用 Unity AssetPostprocessor 查找属性并解析其数据。

AssetPostprocessor 有一个OnPostprocessGameObjectWithUserProperties 回调,它将为您的 fbx 文件中应用了自定义属性的每个转换触发。你会想在后处理器中找到你的属性并做一些事情:

public void OnPostprocessGameObjectWithUserProperties(GameObject incomingGameObject, string[] incomingPropetyNames, object[] incomingValues)

    var thisModelImporter = this.assetImporter as ModelImporter;
    var meta_key = "your_attribute_name";
    if (incomingPropetyNames.Contains(meta_key))
    
        string raw_data = (string)incomingValues[Array.IndexOf(incomingPropetyNames, meta_key)];
        // use the data here....
    

没有标准的方法来创建文件级元数据,这很烦人,我通常只是将我的“***”数据附加到 FBX 文件中模型的根目录之类的东西上。您可以通过将事物存储为 JSON blob 并将 JSON 作为字符串属性传递来传递复杂数据;这通常比包含多个属性名称和类型的网络更容易维护。

请注意,FBX 倾向于破坏长属性名称 - 我不确定截止点在哪里,但如果属性名称超过魔术字符数,有时会被截断为无意义的字符串,例如“FBXASC_012345”。

这种方式唯一不能轻易做到的是顶点或面级数据;虽然您可以将这类东西打包到自定义属性中,但并不能保证您在 Max/Maya 中看到的索引与 FBX 中的索引相同。对于这种类型的数据,顶点颜色或额外的 UV 通道是存储额外信息的好地方,但您可以想出一种方法来确定给定颜色或 UV 的含义。

【讨论】:

感谢@theodox,这似乎是一个不错的解决方案。但是由于我是这个主题的新手,我很难找到一种方法来将自定义属性中的 JSON 数据写入 3dsmax 中的对象。我还认为使用 FBX SDK 将允许在 FBX 中写入任何自定义数据,但如何在 Unity 中解析它。 好吧,我在 3dsmax 中找到了用户定义的对象属性面板,所以我可以添加 JSON 并使用 UDP3DSMAX 条目在 Unity 中解析它。但是有没有办法添加新的自定义属性并设置它们? 似乎自定义属性也可以使用 OnPostprocessGameObjectWithUserProperties 导出和使用。 听起来你已经明白了 - 一个包含转义 JSON 然后在 C# 中解析的字符串自定义属性

以上是关于Unity - 自定义导出和导入 FBX 数据的主要内容,如果未能解决你的问题,请参考以下文章

FBX文件导入Unity导致贴图丢失问题解决,以3ds max,Blender导入导出为例

Vroid怎么导入unity

通过3dmax将max文件导出为unity3d可用的带贴图的fbx文件

FBX导入Unity中模型没有材质的处理

3D MAX模型怎么通过FBX格式导入unity

从 Daz3D、fbx 导出头像到 Unity 材质冲突