| using Snxxz.UI;  | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using System.IO;  | 
| using System.Reflection;  | 
| using System.Text.RegularExpressions;  | 
| using UnityEditor;  | 
| using UnityEngine; | 
| using UnityEngine.UI;  | 
|   | 
| public static class ImageMissTool  | 
| { | 
|     static Dictionary<GameObject, List<MissImage>> missImageDict = new Dictionary<GameObject, List<MissImage>>(); | 
|   | 
|     static Vector2 m_ScrollPosition = Vector2.zero; | 
|   | 
|     static bool viewserialized = true; | 
|     public static void OnGUI()  | 
|     {  | 
|         ToolsHelper.DisplayFolderPath();  | 
|   | 
|         viewserialized = GUILayout.Toggle(viewserialized, "全部");  | 
|   | 
|         if (GUILayout.Button("查找"))  | 
|         {  | 
|             missImageDict.Clear();  | 
|             if (ToolsHelper.folderPath.Equals(string.Empty))  | 
|             {  | 
|                 return;  | 
|             }  | 
|             StartFind();  | 
|         }  | 
|   | 
|         m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition);  | 
|         foreach (var _object in missImageDict.Keys)  | 
|         {  | 
|             bool allserialized = true;  | 
|             var _list = missImageDict[_object];  | 
|             for (int i = 0; i < _list.Count; i++)  | 
|             {  | 
|                 if (!_list[i].serialized)  | 
|                 {  | 
|                     allserialized = false;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|   | 
|             if (allserialized && !viewserialized)  | 
|             {  | 
|                 continue;  | 
|             }  | 
|   | 
|             GUILayout.BeginHorizontal();  | 
|             EditorGUILayout.ObjectField(_object, typeof(UnityEngine.Object), false);  | 
|             GUILayout.FlexibleSpace();  | 
|             GUILayout.EndHorizontal();  | 
|   | 
|             for (int i = 0; i < _list.Count; i++)  | 
|             {  | 
|                 if (_list[i].serialized && !viewserialized)  | 
|                 {  | 
|                     continue;  | 
|                 }  | 
|                 GUILayout.BeginHorizontal();  | 
|                 GUILayout.Label(_list[i].path);  | 
|                 if (_list[i].path != string.Empty && GUILayout.Button("Goto"))  | 
|                 {  | 
|                     var _go = GameObject.Find(_list[i].path);  | 
|                     if (_go != null)  | 
|                     {  | 
|                         Selection.activeGameObject = _go;  | 
|                     }  | 
|                 }  | 
|                 EditorGUILayout.Toggle(_list[i].serialized);  | 
|                 GUILayout.FlexibleSpace();  | 
|                 GUILayout.EndHorizontal();  | 
|             }  | 
|             GUILayout.Space(5);  | 
|         }  | 
|         GUILayout.EndScrollView();  | 
|     } | 
|   | 
|     static void StartFind()  | 
|     {  | 
|         string[] _files = Directory.GetFiles(ToolsHelper.folderPath, "*.prefab", SearchOption.AllDirectories);  | 
|         if (_files == null || _files.Length == 0)  | 
|         {  | 
|             return;  | 
|         }  | 
|         var _index = 0;  | 
|         var inspectorModeInfo = typeof(SerializedObject).GetProperty("inspectorMode", BindingFlags.NonPublic | BindingFlags.Instance);  | 
|         EditorApplication.update = delegate ()  | 
|         {  | 
|             var _file = _files[_index];  | 
|             var _prefab = AssetDatabase.LoadAssetAtPath<GameObject>(ToolsHelper.GetRelativeAssetsPath(_file));  | 
|             if (_prefab != null)  | 
|             {  | 
|                 var all_text = File.ReadAllText(_file);  | 
|                 var images = _prefab.GetComponentsInChildren<Image>(true);  | 
|                 if (images != null && images.Length > 0)  | 
|                 {  | 
|                     for (int i = 0; i < images.Length; i++)  | 
|                     {  | 
|                         var serializedObject = new SerializedObject(images[i]);  | 
|                         inspectorModeInfo.SetValue(serializedObject, InspectorMode.Debug, null);  | 
|                         var localIdProp = serializedObject.FindProperty("m_LocalIdentfierInFile");  | 
|                         var fieldId = localIdProp.longValue;  | 
|   | 
|                         bool isSerialized = ContainGuid(all_text, fieldId.ToString());  | 
|   | 
|                         if (images[i].sprite == null && images[i].GetComponent<Mask>() == null)  | 
|                         {  | 
|                             if (!missImageDict.ContainsKey(_prefab))  | 
|                             {  | 
|                                 missImageDict.Add(_prefab, new List<MissImage>());  | 
|                             }  | 
|                             missImageDict[_prefab].Add(new MissImage()  | 
|                             {  | 
|                                 path = GetParentName(images[i].transform),  | 
|                                 serialized = isSerialized,  | 
|                             });  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }  | 
|             bool _isCancel = EditorUtility.DisplayCancelableProgressBar("提取界面丢失图片的组件",  | 
|                StringUtility.Contact(_index, "/", _files.Length), (float)_index / _files.Length);  | 
|             _index++;  | 
|             if (_isCancel || _index >= _files.Length)  | 
|             {  | 
|                 EditorUtility.ClearProgressBar();  | 
|                 EditorApplication.update = null;  | 
|                 _index = 0;  | 
|             }  | 
|         };  | 
|     } | 
|   | 
|     static string GetParentName(Transform _parent)  | 
|     {  | 
|         if (_parent.parent != null && _parent.GetComponent<WindowInfo>() == null)  | 
|         {  | 
|             return StringUtility.Contact(GetParentName(_parent.parent), "/", _parent.name);  | 
|         }  | 
|         return _parent.name;  | 
|     } | 
|   | 
|     static bool ContainGuid(string _serializedFile, string _guid)  | 
|     {  | 
|         if (string.IsNullOrEmpty(_serializedFile))  | 
|         {  | 
|             return false;  | 
|         }  | 
|         else  | 
|         {  | 
|   | 
|             var matches = Regex.Matches(_serializedFile, _guid);  | 
|             return matches.Count > 2;  | 
|         }  | 
|     } | 
|   | 
|     public class MissImage  | 
|     {  | 
|         public string path;  | 
|         public bool serialized;  | 
|     } | 
| } |