返回「计算机、信息技术与工程」

本地删除FBX的DefaultMaterial在unity重启后无效

更多
Markdown 结构化数据
本文目录 3 个章节

本地删除FBX的DefaultMaterial在unity重启后无效

note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。

问题

用了addressables系统,打包ab有default material有冗余

在打包机上运行脚本把fbx的默认材质删除后变紫,但是重新打开工程后默认材质又回来了,导致冗余还在

版本2018.4.34

删除材质的脚本:

using System;

using UnityEngine;

using System.Collections;

using System.IO;

using UnityEditor;

using Object = UnityEngine.Object;

class DisableMaterialImport : AssetPostprocessor {

    [MenuItem("Tools/Reimport All Model")]

    public static void ReimportAllModel()

    {

        var assetPaths = AssetDatabase.GetAllAssetPaths();

        Array.Sort(assetPaths);

        Debug.LogWarning(string.Format("Total assets count: {0}", assetPaths.Length));

        int processedCount = 0;

        foreach (string assetPath in assetPaths)

        {

            string normalizedAssetPath = assetPath.ToLower();

            if (!normalizedAssetPath.EndsWith(".fbx") &&

                !normalizedAssetPath.EndsWith(".obj") &&

                !normalizedAssetPath.EndsWith(".3ds"))

            {

                continue;

            }

            var modelImporter = AssetImporter.GetAtPath(assetPath) as ModelImporter;

            if (modelImporter == null || modelImporter.importMaterials)

            {

                continue;

            }

            AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ImportRecursive | ImportAssetOptions.ForceUpdate);

            Debug.Log(assetPath, AssetDatabase.LoadMainAssetAtPath(assetPath));

            processedCount++;

        }

        Debug.LogWarning(string.Format("Total processed model count: {0}", processedCount));

        AssetDatabase.SaveAssets();

    }

    private static void FixedModelImport(ModelImporter modelImporter, GameObject model)

    {

        //Debug.Log("FixedModelImport "+model);

        var renderers = model.GetComponentsInChildren<Renderer>(true);

        if (renderers == null)

        {

            return;

        }

        modelImporter.importMaterials = false;

        modelImporter.importBlendShapes = false;

        modelImporter.importAnimation = false;

        modelImporter.isReadable = false;

        modelImporter.optimizeMesh = true;

        foreach (var renderer in renderers)

        {

            if (renderer == null)

            {

                continue;

            }

            renderer.sharedMaterials = new Material[renderer.sharedMaterials.Length];

        }

/*        var animator = model.GetComponent<Animator>();

        if(animator!=null) Object.DestroyImmediate(animator);*/

    }

    private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets,

        string[] movedFromAssetPaths)

    {

        foreach (var path in importedAssets)

        {

            //Debug.Log("OnPostprocessAllAssets "+path+" "+path.EndsWith(".FBX"));

            if (path.EndsWith(".FBX")) //大写的FBX不会进OnPostprocessModel函数

            {

                GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(path);

                ModelImporter import = AssetImporter.GetAtPath(path) as ModelImporter;

                FixedModelImport(import, model);

            }

        }

    }

    void OnPostprocessModel(GameObject model)

    {

        var modelImporter = assetImporter as ModelImporter;

        if (modelImporter == null)

        {

            return;

        }

        FixedModelImport(modelImporter, model);

    }

}
  • 提问者:唐
  • 提问时间:2021-05-11 02:08:56

我的回答

我这边试验过,不会变回来啊,会不会是把工程回滚了。另外这个脚本的ReimportAllModel只对本身就没有勾选Import Materials的模型有效。

  • 回答时间:2021-05-11 05:49:23
  • 最后更新:2021-05-11 05:50:10
  • 采纳状态:未采纳

来源与关系