ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

查找场景中所有丢失脚本(Mono Script)

查找场景中所有丢失脚本(Mono Script) 脚本放在 Editor 文件夹测试版本Unity 2019usingSystem.Collections.Generic;usingUnityEngine;usingUnityEditor;publicclassFindAllMissingScripts:EditorWindow{privateListGameObjectm_missingObjsnewListGameObject();[MenuItem(Tools/查找所有丢失脚本(Mono Script))]staticvoidOpenWindow(){GetWindowFindAllMissingScripts(Missing脚本查找器);}//扫描当前场景只查找打印不删除voidScanCurrentScene(){m_missingObjs.Clear();Object[]objsResources.FindObjectsOfTypeAll(typeof(GameObject));ListGameObjectsceneGosnewListGameObject();foreach(Objectoinobjs){GameObjectgooasGameObject;if(go!null!EditorUtility.IsPersistent(go)){sceneGos.Add(go);}}foreach(GameObjectgoinsceneGos){boolhasMissingCheckHasMissingScript(go);if(hasMissing){m_missingObjs.Add(go);Debug.Log($【场景发现丢失脚本】物体路径{go.transform.GetPath()},go);}}EditorUtility.DisplayDialog(扫描完成,$当前场景找到{m_missingObjs.Count}个带Missing脚本的物体\n控制台点击日志定位物体,OK);}//扫描全部预制体只查找打印不删除voidScanAllPrefabs(){m_missingObjs.Clear();string[]prefabGuidsAssetDatabase.FindAssets(t:prefab);inttotalprefabGuids.Length;for(inti0;itotal;i){EditorUtility.DisplayProgressBar(扫描预制体,${i}/{total},(float)i/total);stringpathAssetDatabase.GUIDToAssetPath(prefabGuids[i]);GameObjectprefabObjAssetDatabase.LoadAssetAtPathGameObject(path);if(prefabObjnull)continue;ScanGameObjectRecursive(prefabObj);}EditorUtility.ClearProgressBar();EditorUtility.DisplayDialog(预制体扫描完成,$共找到{m_missingObjs.Count}个预制体内含Missing脚本\n查看Console日志,OK);}voidScanGameObjectRecursive(GameObjectgo){boolhasMissingCheckHasMissingScript(go);if(hasMissing){m_missingObjs.Add(go);Debug.Log($【预制体内丢失脚本】{go.transform.GetPath()},go);}foreach(Transformtingo.transform){ScanGameObjectRecursive(t.gameObject);}}//检查GameObject上是否存在Missing(null)组件只检测不删除boolCheckHasMissingScript(GameObjectgo){Component[]compsgo.GetComponentsComponent();foreach(varcincomps){if(cnull)returntrue;}returnfalse;}//真正删除当前场景所有Missing脚本谨慎voidRemoveAllSceneMissing(){intremoveCount0;Object[]objsResources.FindObjectsOfTypeAll(typeof(GameObject));foreach(Objectoinobjs){GameObjectgooasGameObject;if(go!null!EditorUtility.IsPersistent(go)){intcntGameObjectUtility.RemoveMonoBehavioursWithMissingScript(go);removeCountcnt;}}EditorUtility.DisplayDialog(执行完毕,$场景中共移除{removeCount}个Missing脚本组件,OK);}voidOnGUI(){GUILayout.Label(Missing(Mono Script)查找工具 Unity2019.4);if(GUILayout.Button(扫描当前打开的场景仅查找不删除)){ScanCurrentScene();}if(GUILayout.Button(扫描项目全部预制体(Prefab)仅查找不删除)){ScanAllPrefabs();}EditorGUILayout.Space();if(GUILayout.Button(⚠️删除当前场景全部Missing脚本谨慎操作)){if(EditorUtility.DisplayDialog(确认,确认删除场景所有Missing脚本不可撤销,确认,取消)){RemoveAllSceneMissing();}}EditorGUILayout.HelpBox(扫描只会打印日志删除按钮才会真正移除Missing脚本组件,MessageType.Warning);}}publicstaticclassTransformExtension{publicstaticstringGetPath(thisTransformt){if(tnull)return;if(t.parentnull)returnt.name;return${t.parent.GetPath()}/{t.name};}}
返回列表