【小工具】Unity批量删除物体上引用丢失的脚本
创始人
2024-11-13 08:37:17
0次
介绍

Unity批量删除物体上引用丢失的脚本

使用场景

当在外部导入资源时会造成物体上挂载的脚本引用丢失,一个个删除比较麻烦,可以借用这个工具快速实现

工具原理
  • 继承EditorWindow绘制一个自定义的编辑器窗口

  • 加载Assets目录下所有预制体

    • 获取其所有子物体的Component组件
    • 如果组件为Null则表示丢失
    • 将丢失的物体加入待清理列表
  • 遍历待清理列表,通过**GameObjectUtility.RemoveMonoBehavioursWithMissingScript(obj);**进行清理;

使用API
  • 高亮显示资源并选中
 EditorGUIUtility.PingObject(selectTarget);  Selection.activeObject = selectTarget; 
  • 获取指定文件夹下指定类型得资源路径
Directory.GetFiles("Assets","*.prefab",SearchOption.AllDirectories); 
  • 显示进度条
if(EditorUtility.DisplayCancelableProgressBar("Title","信息",Rage(0,1))) {       EditorUtility.ClearProgressBar();       break; } 
  • 移除丢失脚本的组件
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(gamoObjList[i]); 
  • 编辑器下加载资源、保存资源
AssetDatabase.LoadAssetAtPath(paths[i]);  AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); 
代码
using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;  namespace Tools.MissingScriptsToolWindowTool {     public class MissingScriptsWindowTool : EditorWindow     {         [MenuItem("Tools/Missing Scripts Window")]         public static void ShowWindow()         {             GetWindow(typeof(MissingScriptsWindowTool),false,"Missing Scripts GameObjects");         }          List missGamoObjList = new List();          private void OnEnable()         {                         SelectMissingGameObjects(ref missGamoObjList);         }          private Vector2 scrollPosition = Vector2.zero;         private void OnGUI()         {             GUILayout.BeginHorizontal();             GUILayout.Box("丢失脚本物体列表:");             if(GUILayout.Button("刷新列表",GUILayout.Width(150)))             {                 SelectMissingGameObjects(ref missGamoObjList);             }             if(GUILayout.Button("清除无效脚本",GUILayout.Width(150)))             {                 RemoveMissingGameObjects(ref missGamoObjList);             }             GUILayout.EndHorizontal();              GUILayout.Space(10);             if(missGamoObjList.Count == 0)             {                 GUILayout.Label("没有丢失脚本的物体");                 return;             }              scrollPosition = GUILayout.BeginScrollView(scrollPosition);              for(int i = 0; i < missGamoObjList.Count; i++)             {                 GUILayout.BeginHorizontal("Box",GUILayout.Height(30));                  GUILayout.Label(i.ToString(),"AssetLabel",GUILayout.Width(40));                 GUILayout.Space(10);                 if(GUILayout.Button(missGamoObjList[i].name,"AnimLeftPaneSeparator"))                 {                     GameObject selectTarget = missGamoObjList[i];                     while(selectTarget.transform.parent != null)                     {                         selectTarget = selectTarget.transform.parent.gameObject;                     }                     EditorGUIUtility.PingObject(selectTarget);                     Selection.activeObject = selectTarget;                 }                  GUILayout.EndHorizontal();                 GUILayout.Space(5);             }              GUILayout.EndScrollView();         }          private static void SelectMissingGameObjects(ref List gameObjList)         {             gameObjList.Clear();              string[] paths = Directory.GetFiles("Assets","*.prefab",SearchOption.AllDirectories);             for(int i = 0; i < paths.Length; i++)             {                                 if(EditorUtility.DisplayCancelableProgressBar("查找GameObject···","数量 : " + i,(float)i / paths.Length))                 {                     EditorUtility.ClearProgressBar();                     break;                 }                  GameObject tempObj = AssetDatabase.LoadAssetAtPath(paths[i]);                 if(tempObj != null)                 {                     Transform[] transArr = tempObj.GetComponentsInChildren();                     for(int j = 0; j < transArr.Length; j++)                     {                         Component[] components = transArr[j].GetComponents();                         for(int k = 0; k < components.Length; k++)                         {                             if(components[k] == null)                             {                                 if(!gameObjList.Contains(transArr[j].gameObject))                                     gameObjList.Add(transArr[j].gameObject);                             }                         }                     }                 }             }             EditorUtility.ClearProgressBar();         }          private static void RemoveMissingGameObjects(ref List gameObjList)         {             if(gameObjList.Count == 0)                 return;              for(int i = 0; i < gameObjList.Count; i++)             {                 GameObjectUtility.RemoveMonoBehavioursWithMissingScript(gameObjList[i]);             }             AssetDatabase.SaveAssets();             AssetDatabase.Refresh();             gameObjList.Clear();         }      }  }  

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...