一键移除 Hierarchy 以及 prefab 上 miss 的脚本
/**
* Class Description: 移除 丢失了 momo 脚本的组件
*
*
* Author : Ankh
*
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
public class RemoveMissMonoCmp:MonoBehaviour
{
[MenuItem("ClientPlugins/Remove Single Missing-MonoBehavior Component")]
static public void RemoveSelectObjMissCmp()
{
GameObject go = Selection.activeGameObject;
string path = AssetDatabase.GetAssetPath(go);
CheckMissMonoBehavior(path);
}
#region remove all
//[MenuItem("MyTools/Remove All Missing-MonoBehavior Component")]
static public void RemoveMissComponent()
{
//此处地址为根地址,代码会从这个地址的文件夹下开始遍历里面的所有文件夹的所有预置体以及它的子物体
string path = Application.dataPath + "/Download";
string[] getFoder = Directory.GetDirectories(path);
searchFile(getFoder);
}
//递归遍历文件夹
static public void searchFile(string[] path)
{
foreach (string item in path)
{
string[] getFile = Directory.GetFiles(item);
foreach (string file in getFile)
{
FileInfo fileInfo = new FileInfo(file);
if (fileInfo.Extension.Equals(".Prefab", StringComparison.CurrentCultureIgnoreCase))
{
//先截取路径,使路径从ASSETS开始
int index = file.IndexOf("Assets/", StringComparison.CurrentCultureIgnoreCase);
string newPath = file.Substring(index);
CheckMissMonoBehavior(newPath);
}
}
string[] getFoder = Directory.GetDirectories(item);
searchFile(getFoder);
}
}
#endregion
/// <summary>
/// 删除一个Prefab上的空脚本
/// </summary>
/// <param name="path">prefab路径 例Assets/Resources/FriendInfo.prefab</param>
static void CheckMissMonoBehavior(string newPath)
{
GameObject obj = AssetDatabase.LoadAssetAtPath(newPath, typeof(GameObject)) as GameObject;
//实例化物体
GameObject go = PrefabUtility.InstantiatePrefab(obj) as GameObject;
//递归删除
searchChild(go);
// 将数据替换到asset
PrefabUtility.SaveAsPrefabAsset(go, newPath);
go.hideFlags = HideFlags.HideAndDontSave;
//删除掉实例化的对象
DestroyImmediate(go);
}
//递归物体的子物体
static public void searchChild(GameObject gameObject)
{
int number = GameObjectUtility.RemoveMonoBehavioursWithMissingScript(gameObject);
if (gameObject.transform.childCount > 0)
{
for (int i = 0; i < gameObject.transform.childCount; i++)
{
searchChild(gameObject.transform.GetChild(i).gameObject);
}
}
}
}