Unity — настраиваемый экспорт и импорт данных FBX

Я пытаюсь записать пользовательские данные в файл FBX из 3dsmax во время экспорта. Это возможно, даже если я сейчас не знаю, как это сделать.
Но мой вопрос будет заключаться в том, как я могу прочитать эти пользовательские данные FBX внутри Unity при импорте.

Большое спасибо.


person MaT    schedule 02.09.2015    source источник


Ответы (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 и передавая JSON в виде строкового атрибута; это обычно легче поддерживать, чем сеть с несколькими именами и типами атрибутов.

Имейте в виду, что FBX имеет тенденцию коверкать длинные имена атрибутов - я не уверен, где находится отсечка, но очень длинные имена атрибутов иногда усекаются до бессмысленной строки, такой как `FBXASC_012345", если они превышают количество магических символов.

Единственное, что вы не можете легко сделать таким образом, это данные уровня вершин или граней; хотя вы можете упаковать такие вещи в пользовательские атрибуты, нет твердой гарантии, что индексы, которые вы видите в Max/Maya, будут такими же, как в FBX. Для этого типа данных цвета вершин или дополнительные UV-каналы являются хорошими местами для хранения дополнительной информации, хотя вам решать, как решить, что означает данный цвет или UV.

person theodox    schedule 02.09.2015
comment
Спасибо @theodox, это кажется хорошим решением. Но поскольку я новичок в этой теме, у меня есть некоторые трудности с поиском способа записи данных JSON внутри пользовательского атрибута для объекта в 3dsmax. Я также думал, что использование FBX SDK позволит записывать любые пользовательские данные в FBX, но как их можно разобрать внутри Unity. - person MaT; 03.09.2015
comment
Хорошо, я нашел панель свойств определяемого пользователем объекта в 3dsmax, поэтому я могу добавить JSON и проанализировать его в Unity, используя запись UDP3DSMAX. Но есть ли способ добавить новые пользовательские свойства и установить их? - person MaT; 03.09.2015
comment
Кажется, что пользовательские атрибуты также экспортируются и доступны с помощью OnPostprocessGameObjectWithUserProperties. - person MaT; 03.09.2015
comment
Похоже, у вас есть это - пользовательский атрибут строки, содержащий экранированный JSON, а затем проанализированный в C # - person theodox; 03.09.2015