namespace AtlasUtility { using UnityEditor; using UnityEngine; using UnityEditor.SceneManagement; using System; using System.IO; using System.Linq; using System.Collections.Generic; using System.Text.RegularExpressions; public class ReferenceManager { public static void FindReference(string path) { SerializationMode userSerializationMode = EditorSettings.serializationMode; EditorSettings.serializationMode = SerializationMode.ForceText; string guid = AssetDatabase.AssetPathToGUID(path); List pathList = GetAllFile(true); for (int i = 0; i < pathList.Count; i++) { EditorUtility.DisplayProgressBar("匹配", pathList[i], (i + 1) / (float)pathList.Count); int count = Regex.Matches(File.ReadAllText(pathList[i]), guid).Count; if (count > 0) { Debug.LogWarning($"{count}处引用 {pathList[i].GetRelativePath()}"); } } EditorUtility.ClearProgressBar(); EditorSettings.serializationMode = userSerializationMode; } public static void ChangeReference(bool includeMaterial, List fromList, List toList) { if (fromList.Count != toList.Count) { throw new Exception("遇到一个Bug"); } if (fromList.Count == 0) { return; } AssetDatabase.SaveAssets(); EditorSceneManager.SaveOpenScenes(); SerializationMode userSerializationMode = EditorSettings.serializationMode; EditorSettings.serializationMode = SerializationMode.ForceText; List pathList = GetAllFile(includeMaterial); for (int i = 0; i < pathList.Count; i++) { EditorUtility.DisplayProgressBar("修改引用", Path.GetFileNameWithoutExtension(pathList[i]), (i + 1) / (float)pathList.Count); string originText = File.ReadAllText(pathList[i]); string newText = originText; for (int j = 0; j < fromList.Count; j++) { newText = newText.Replace(fromList[j], toList[j]); } if (newText != originText) { File.WriteAllText(pathList[i], newText); } } EditorUtility.ClearProgressBar(); EditorSettings.serializationMode = userSerializationMode; AssetDatabase.Refresh(); } public static List GetAllFile(bool includeMaterial) { List searchExtension = new List() { ".asset", ".anim", ".unity", ".prefab" }; if (includeMaterial) { searchExtension.Add(".mat"); } List pathList = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories).Where ( path => { string extension = Path.GetExtension(path); if (searchExtension.Contains(extension)) { return true; } else { return false; } } ) .ToList(); return pathList; } public static List GetChildSpritePath(string atlasPath) { string atlasGUID = AssetDatabase.AssetPathToGUID(atlasPath); List spritePathList = new List(); List referencePairList = AtlasReferenceTable.ReadAllLine(); foreach (var referencePair in referencePairList) { AtlasReference atlasReference = referencePair.AtlasReference; AtlasReference sourceAtlasReference = referencePair.SourceAtlasReference; if (atlasReference.GUID == atlasGUID) { spritePathList.Add(AssetDatabase.GUIDToAssetPath(sourceAtlasReference.GUID)); } } return spritePathList; } } }