namespace AtlasUtility { using UnityEditor; using UnityEngine; using UnityEditor.SceneManagement; using System; using System.IO; using System.Linq; using System.Collections.Generic; public class ReferenceManager { public static void ChangeReference(List fromReferenceList, List toReferenceList) { if (fromReferenceList.Count != toReferenceList.Count) { throw new Exception("An error occured"); } if (fromReferenceList.Count == 0) { return; } AssetDatabase.SaveAssets(); EditorSceneManager.SaveOpenScenes(); SerializationMode userSerializationMode = EditorSettings.serializationMode; EditorSettings.serializationMode = SerializationMode.ForceText; List searchExtension = new List() { ".asset", ".anim", ".unity", ".prefab" }; 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(); for (int i = 0; i < pathList.Count; i++) { EditorUtility.DisplayProgressBar("Changing reference", Path.GetFileNameWithoutExtension(pathList[i]), (i + 1)/(float) pathList.Count); string originText = File.ReadAllText(pathList[i]); string newText = originText; for (int j = 0; j < fromReferenceList.Count; j++) { newText = newText.Replace(fromReferenceList[j], toReferenceList[j]); } if (newText != originText) { File.WriteAllText(pathList[i], newText); } } EditorUtility.ClearProgressBar(); EditorSettings.serializationMode = userSerializationMode; AssetDatabase.Refresh(); } public static void ChangeAllReference() { if (!EditorUtility.DisplayDialog("Warning", "Are you sure you want to set all the references?", "Go ahead", "Cancel")) { return; } List fromReferenceList = new List(); List toReferenceList = new List(); List itemList = ReferenceTable.ReadAllLine(); for (int i = 0; i < itemList.Count; i++) { itemList[i] = itemList[i].TrimEnd((char)13); string atlasReference = itemList[i].Split('|')[0]; string sourceReference = itemList[i].Split('|')[1]; if (fromReferenceList.Contains(sourceReference)) { int index = fromReferenceList.IndexOf(sourceReference); Debug.LogWarning($"Repeat sprite detected {ReferenceToFakePath(atlasReference)} {ReferenceToFakePath(toReferenceList[index])}"); } fromReferenceList.Add(sourceReference); toReferenceList.Add(atlasReference); } ChangeReference(fromReferenceList, toReferenceList); } public static void ResetReference(List pngPathList) { if (pngPathList.Count == 0) { return; } List fromReferenceList = new List(); List toReferenceList = new List(); List itemList = ReferenceTable.ReadAllLine(); foreach (string path in pngPathList) { string atlasGUID = AssetDatabase.AssetPathToGUID(path); for (int i = 0; i < itemList.Count; i++) { itemList[i] = itemList[i].TrimEnd((char)13); string atlasReference = itemList[i].Split('|')[0]; string sourceReference = itemList[i].Split('|')[1]; if (atlasReference.Contains(atlasGUID)) { fromReferenceList.Add(atlasReference); toReferenceList.Add(sourceReference); itemList.RemoveAt(i--); } } ChangeReference(fromReferenceList, toReferenceList); ReferenceTable.WriteAllLine(itemList); } } public static void ResetAllReference() { if (!EditorUtility.DisplayDialog("Warning", "Are you sure you want to reset all the references?", "Go ahead", "Cancel")) { return; } List fromReferenceList = new List(); List toReferenceList = new List(); List itemList = ReferenceTable.ReadAllLine(); for (int i = 0; i < itemList.Count; i++) { itemList[i] = itemList[i].TrimEnd((char)13); string atlasReference = itemList[i].Split('|')[0]; string sourceReference = itemList[i].Split('|')[1]; fromReferenceList.Add(atlasReference); toReferenceList.Add(sourceReference); } ChangeReference(fromReferenceList, toReferenceList); ReferenceTable.Clear(); } public static string ReferenceToFakePath(string reference) { string guid = ReferenceToGUID(reference); string fileId = ReferenceToFileId(reference); int spriteIndex = (int.Parse(fileId) - 21300000)/2; string atlasPath = AssetDatabase.GUIDToAssetPath(guid); TextureImporter textureImporter = (TextureImporter) AssetImporter.GetAtPath(atlasPath); return $"{atlasPath}/{textureImporter.spritesheet[spriteIndex].name}"; } public static string ReferenceToGUID(string reference) { return reference.Split(',')[1].Split(' ')[2]; } public static string ReferenceToFileId(string reference) { return reference.Split(',')[0].Split(' ')[1]; } public static List GetChildPathList(string path) { List pathList = new List(); List itemList = ReferenceTable.ReadAllLine(); string atlasGUID = AssetDatabase.AssetPathToGUID(path); for (int i = 0; i < itemList.Count; i++) { itemList[i] = itemList[i].TrimEnd((char) 13); string atlasReference = itemList[i].Split('|')[0]; string sourceReference = itemList[i].Split('|')[1]; if (atlasReference.Contains(atlasGUID)) { pathList.Add(AssetDatabase.GUIDToAssetPath(ReferenceToGUID(sourceReference))); } } return pathList; } } }