FBX中的材质球设置

发布于 2017-02-21 00:34:50 字数 216 浏览 1151 评论 9

image.png 为了避免FBX在打入AB时自动生成Standard材质,故想在这里设置成自己指定的材质球,想知道有脚本上如何设置呢? ModelImporter中并没有相关的API- -!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

瑾兮 2020-03-28 17:43:19

两句话连起来看,不导入材质之后指定一个默认材质,生不生成有什么关系,又不会进包

清晨说ぺ晚安 2020-01-06 06:59:21

之前就是通过AssetProcessor来做的,但是由于打AB包时自动重新导入导致设置失效,这里不想把AssetProcessor加入到打包机中,主要是为了节省打包时间。

夜无邪 2019-12-28 03:20:30

这里设置不导入材质是没用的,因为这个FBX由于AB共用依赖问题会单独打成AB,故此FBX会被加载,importmaterials虽然为False,但是它还会自动生成Standard材质

偏爱自由 2018-12-03 10:54:03

谢谢,不得以时也只能这样做了

灵芸 2018-08-03 05:22:53

importer.importMaterials = false 可以默认不导入材质的吗?
再指定一个需求的材质,没有就是diffuse.
这个需要做好美术资源管理才可以。

瑾兮 2018-04-11 17:30:39

话不多说

var importer = AssetImporter.GetAtPath("Assets/fbx.fbx") as ModelImporter;
var mat = AssetDatabase.LoadAssetAtPathu003CMaterialu003E("Assets/mat.mat");
using (var serializedObject = new SerializedObject(importer))
{
    var externalObjects = serializedObject.FindProperty("m_ExternalObjects");
    var materials = serializedObject.FindProperty("m_Materials");

    for (int materialIdx = 0; materialIdx u003C materials.arraySize; ++materialIdx)
    {
        var id = materials.GetArrayElementAtIndex(materialIdx);
        var name = id.FindPropertyRelative("name").stringValue;
        var type = id.FindPropertyRelative("type").stringValue;
        var assembly = id.FindPropertyRelative("assembly").stringValue;

        SerializedProperty materialProp = null;
        Material material = null;
        var propertyIdx = 0;

        for (int externalObjectIdx = 0, count = externalObjects.arraySize; externalObjectIdx u003C count; ++externalObjectIdx)
        {
            var pair = externalObjects.GetArrayElementAtIndex(externalObjectIdx);
            var externalName = pair.FindPropertyRelative("first.name").stringValue;
            var externalType = pair.FindPropertyRelative("first.type").stringValue;

            if (externalName == name && externalType == type)
            {
                materialProp = pair.FindPropertyRelative("second");
                material = materialProp != null ? materialProp.objectReferenceValue as Material : null;
                propertyIdx = externalObjectIdx;
                break;
            }
        }

        if (materialProp != null)
        {
            materialProp.objectReferenceValue = mat;
        }
        else
        {
            var newIndex = externalObjects.arraySize++;
            var pair = externalObjects.GetArrayElementAtIndex(newIndex);
            pair.FindPropertyRelative("first.name").stringValue = name;
            pair.FindPropertyRelative("first.type").stringValue = type;
            pair.FindPropertyRelative("first.assembly").stringValue = assembly;
            pair.FindPropertyRelative("second").objectReferenceValue = mat;
        }
    }

    serializedObject.ApplyModifiedPropertiesWithoutUndo();
}
importer.importMaterials = false;
importer.SaveAndReimport();
灵芸 2018-02-21 11:18:30

正解,就是这个方法!

瑾兮 2017-10-02 01:39:47

那可以试试把相关资源从FBX中提取出来,这样就彻底摆脱对FBX的依赖了,我们上个项目这样用过,缺点就是要写一些FBX变化时自动同步的工具。

灵芸 2017-08-12 11:16:13

题主可以参考这篇:[Unity Editor]删除FBX的默认材质,利用Unity的AssetProcessor提供的回调函数将Renderer的sharedMaterials置空或者修改为自定义的默认材质,置空会导致预览变成丢失材质的洋红色,所以使用一个Diffuse材质代替比较合适。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文