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();
}
}