_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(); } }