读一读

_UnComoressConfig = AssetDatabase.LoadAssetAtPath<UncomoressConfig>(SavePath);
//操作数据
EditorUtility.SetDirty(_UnComoressConfig);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();



string[] Guids = AssetDatabase.FindAssets("t:Prefab", new string[] { "Assets" });



SerializedObject so = new SerializedObject(images[k]); //images[k] 为组件或是GameObject
SerializedProperty iterator = so.GetIterator();
//获取所有属性
while (iterator.NextVisible(true))
{
    if (iterator.propertyType == SerializedPropertyType.ObjectReference)
    {
        //引用对象是null 并且 引用ID不是0 说明丢失了引用
        if (iterator.objectReferenceValue == null && iterator.objectReferenceInstanceIDValue != 0)
        {
            AddProblem(cur, images[k].transform);//该组件该物体丢失饮用了
        }
    }
}



//强制以文本的方式保存资源
EditorSettings.serializationMode = SerializationMode.ForceText;
AssetDatabase.Refresh();

//获取你需要匹配的资源 一般通过后缀查找
List<string> withoutExtensions = new List<string>() { ".prefab", ".unity", ".mat" };
string[] files = Directory.GetFiles(Path.Combine(Application.dataPath, "AssetsPackage"), "*.*", SearchOption.AllDirectories)
    .Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
    
//你需要搜索的资源 通过路径转换为guid
string guid = AssetDatabase.AssetPathToGUID(imagePaths);

//遍历匹配的资源 匹配guid
foreach (var file in files)
{
    var content = File.ReadAllText(file);
    if (Regex.IsMatch(fileContent, guid))
    {
        isHas = true;
    }
}


如果是多对多的关系,例如查找项目中没有使用过的图片,就需要遍历找到所有图片资源,然后每一个图片都需要遍历一次匹配的资源。可以采用多线程的机制跑,且将IO操作提前缓存文本内容。可以质一般的提升速度。


//一个EditorWindow
private void OnGUI()
{
    EditorGUILayout.BeginHorizontal();
    GUILayout.Label("搜索图片:", GUILayout.Width(70));
    Rect rect = EditorGUILayout.GetControlRect(GUILayout.Width(300));//创建一个区域
    a = EditorGUI.ObjectField(rect,(Object)a, typeof(Sprite),false) as Sprite;//用这个区域去创建
    EditorGUILayout.EndHorizontal();

    if ((Event.current.type == EventType.DragUpdated
            || Event.current.type == EventType.DragExited)
            && rect.Contains(Event.current.mousePosition)) //通过事件检查是否为拖拽,Rect判断是否拖到对应的区域
    {

        if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)
        {
            searchText = DragAndDrop.paths[0];//获取资源路径
        }
    }
}

AssetImporter tmpAssetImporter = AssetImporter.GetAtPath(cur);//cur为路径
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(tmpAssetImporter.assetPath);
//一顿操作prefab后
PrefabUtility.SavePrefabAsset(prefab);//保存修改过后的Prefab

private Vector2 scrollPosition = Vector2.zero;
private string searchText = "";
Sprite a = null;

EditorGUILayout.BeginHorizontal();//一行开始
GUILayout.Label("", GUILayout.Width(70)); //绘制一个label不可编辑
searchText = GUILayout.TextField(searchText, GUILayout.Width(600));//绘制一个文字区域,可以编辑
a = EditorGUI.ObjectField(rect,(Object)a, typeof(Sprite),false) as Sprite;//绘制一个对象区域,拖动赋值
if (GUILayout.Button("开始")){}//绘制一个按钮,点击后返回true
EditorGUILayout.EndHorizontal();//一行结束

scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
//滚动区域
EditorGUILayout.EndScrollView();

GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path); //path - Assets/...
AssetDatabase.OpenAsset(prefab);
this.curOpenPrefab = Selection.activeGameObject; //打开时选择的是打开的prefab的根目录,所以这样直接取了


这样子就可以去获取这个Prefab下面的子物体了。


GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path); //path - Assets/...
EditorGUIUtility.PingObject(prefab);
Selection.activeGameObject = prefab.gameObject;

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Script_04_01))]
public class Script_04_01_Insprctor : Editor {

    public override void OnInspectorGUI()
    {
        serializedObject.Update();//更新最新数据
        
        EditorGUI.BeginChangeCheck(); //监听具体的元素发生变化
        EditorGUILayout.PropertyField(serializedObject.FindProperty("datas"), true);
        if (EditorGUI.EndChangeCheck())
        {
            Debug.LogError("datas changes");
        }

        if (GUI.changed) //监听任意元素发生变化
            Debug.LogError("有东西改变了");

        serializedObject.ApplyModifiedProperties();
    }

}