104 lines
3.1 KiB
C#
104 lines
3.1 KiB
C#
|
||
using System.IO;
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
using System.Collections;
|
||
|
||
public class ModelMatTool : AssetPostprocessor
|
||
{
|
||
private static bool _needWaiting = false;
|
||
|
||
/// <summary>
|
||
/// 是否启用删除操作
|
||
/// OnPostprocessModel回调在模型导入的时候就会调到,
|
||
/// 通过这个标记位保证只在调用脚本函数的时候执行。
|
||
/// </summary>
|
||
private static bool _enableDelete = false;
|
||
|
||
/// <summary>
|
||
/// 批量删除模型上的材质
|
||
/// </summary>
|
||
public static IEnumerator DelModelMats(Object[] models)
|
||
{
|
||
foreach (Object obj in models)
|
||
{
|
||
while (_needWaiting) yield return null;
|
||
DelModelMat(obj as GameObject);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除模型上绑定的材质
|
||
/// </summary>
|
||
/// <param name="model">模型对象</param>
|
||
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<Renderer>();
|
||
if (null == renders) return;
|
||
foreach (Renderer render in renders)
|
||
{
|
||
render.sharedMaterials = new Material[render.sharedMaterials.Length];
|
||
}
|
||
renders = model.GetComponentsInChildren<Renderer>();
|
||
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();
|
||
}
|
||
}
|