using UnityEngine;
using UnityEditor;
using System.IO;
public class RemoveMissingScriptsRecursively : EditorWindow
{
[MenuItem("Tools/RemoveAllAssetPrefabMissingScriptsRecursively")]
public static void ShowWindow()
{
//Remove Missing Scripts in Asset Prefab GameObjects
string[] filePaths = Directory.GetFiles(Application.dataPath, "*.prefab", SearchOption.AllDirectories);
for (int i = 0; i < filePaths.Length; i++)
{
string path = filePaths[i].Replace(Application.dataPath, "Assets");
GameObject objPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
GameObject obj = PrefabUtility.InstantiatePrefab(objPrefab) as GameObject;
if (IsHaveMissBehaviour(obj))
{
RemoveRecursively(obj);
PrefabUtility.SaveAsPrefabAssetAndConnect(obj, path, InteractionMode.AutomatedAction);//创建的物体替换预设
}
UnityEngine.Object.DestroyImmediate(obj);
}
}
private static void RemoveRecursively(GameObject g)
{
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(g);
foreach (Transform childT in g.transform)
{
RemoveRecursively(childT.gameObject);
}
}
private static bool IsHaveMissBehaviour(GameObject obj)
{
if (obj.hideFlags == HideFlags.None)
{
var components = obj.GetComponents<Component>();
SerializedObject so = new SerializedObject(obj);
var soProperties = so.FindProperty("m_Component");
for (int j = 0; j < components.Length; j++)
{
if (components[j] == null)
{
Debug.LogError("清除了物体:" + obj.name + " 的一个missing脚本");
return true;
}
}
}
return false;
}
}