【发布时间】:2015-11-27 15:27:25
【问题描述】:
我正在尝试在导出时从 3dsmax 将自定义数据写入 FBX 文件。即使我现在不知道该怎么做,这也是可能的。
但我的问题是如何在导入时读取 Unity 中的那些自定义 FBX 数据。
非常感谢。
【问题讨论】:
我正在尝试在导出时从 3dsmax 将自定义数据写入 FBX 文件。即使我现在不知道该怎么做,这也是可能的。
但我的问题是如何在导入时读取 Unity 中的那些自定义 FBX 数据。
非常感谢。
【问题讨论】:
执行此操作的简单方法是向 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 的含义。
【讨论】: