using System.IO; using UnityEditor; using UnityEngine; using System.Collections; public class ModelMatTool : AssetPostprocessor { private static bool _needWaiting = false; /// /// 是否启用删除操作 /// OnPostprocessModel回调在模型导入的时候就会调到, /// 通过这个标记位保证只在调用脚本函数的时候执行。 /// private static bool _enableDelete = false; /// /// 批量删除模型上的材质 /// public static IEnumerator DelModelMats(Object[] models) { foreach (Object obj in models) { while (_needWaiting) yield return null; DelModelMat(obj as GameObject); } } /// /// 删除模型上绑定的材质 /// /// 模型对象 public static void DelModelMat(GameObject model) { if (null == model) return; string assetPath = AssetDatabase.GetAssetPath(model); ModelImporter importer = AssetImporter.GetAtPath(assetPath) as ModelImporter; if (null == importer) return; _enableDelete = true; _needWaiting = true; AssetDatabase.ImportAsset(assetPath); } public static void DelModelMatByPath(string assetPath) { ModelImporter importer = AssetImporter.GetAtPath(assetPath) as ModelImporter; if (null == importer) return; _enableDelete = true; _needWaiting = true; AssetDatabase.ImportAsset(assetPath); } private void OnPostprocessModel(GameObject model) { if (null == model) return; if (!_enableDelete) return; _enableDelete = false; Renderer[] renders = model.GetComponentsInParent(); if (null == renders) return; foreach (Renderer render in renders) { render.sharedMaterials = new Material[render.sharedMaterials.Length]; } renders = model.GetComponentsInChildren(); if (null == renders) return; foreach (Renderer render in renders) { render.sharedMaterials = new Material[render.sharedMaterials.Length]; } _needWaiting = false; } [MenuItem("Tools/删除模型的默认材质")] static void DelSelectedModelMat() { /* Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); if ( objs != null) { DelModelMat(objs[0] as GameObject); return; } */ string[] m_folder = { "Assets" }; var mesh_assets = AssetDatabase.FindAssets("t:mesh", m_folder); var i = 0; foreach(var meshGuid in mesh_assets) { var assetPath_ = AssetDatabase.GUIDToAssetPath(meshGuid); DelModelMatByPath(assetPath_); EditorUtility.DisplayProgressBar("重新导出assets", string.Format("更改Mesh的材质 {0}/{1}", i, mesh_assets.Length), (i * 1.0f) / mesh_assets.Length); i++; } EditorUtility.ClearProgressBar(); } }