ro-webgl/Assets/Editor/InstantGame/ModelDelShaderTool.cs
2022-02-18 12:58:59 +08:00

104 lines
3.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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