diff --git a/Assets/Editor/EditorKit.cs b/Assets/Editor/EditorKit.cs index 1b1bdaee5..09d23a728 100644 --- a/Assets/Editor/EditorKit.cs +++ b/Assets/Editor/EditorKit.cs @@ -1,5 +1,7 @@ -using UnityEditor; +using UnityEditor; using UnityEngine; +using System; +using UnityEditor.U2D.PSD; namespace AibisDream.SystemEditor { @@ -86,11 +88,11 @@ namespace AibisDream.SystemEditor return SortingLayer.layers[idx].id; } - + public static void RecordObjectAndChildren(GameObject parent, string actionName) { Transform[] transforms = parent.GetComponentsInChildren(true); - Object[] objectsToUndo = new Object[transforms.Length]; + UnityEngine.Object[] objectsToUndo = new UnityEngine.Object[transforms.Length]; for (int i = 0; i < transforms.Length; i++) { @@ -99,5 +101,79 @@ namespace AibisDream.SystemEditor Undo.RegisterCompleteObjectUndo(objectsToUndo, actionName); } + + public static string SaveSprite(Sprite sprite) + { + if (!sprite) return ""; + + string psdPath = AssetDatabase.GetAssetPath(sprite); + var psdResPath = GetResourcePath(psdPath); + + int lastDotIndex = psdResPath.LastIndexOf('.'); + if (lastDotIndex == -1) + return psdResPath; + + var purePath = psdResPath.Substring(0, lastDotIndex); + return purePath + "/" + sprite.name; + } + + private static string GetResourcePath(string absolutePath) + { + const string resourcesFolderName = "Resources/"; + var index = absolutePath.IndexOf(resourcesFolderName, StringComparison.Ordinal); + return index >= 0 ? absolutePath[(index + resourcesFolderName.Length)..] : absolutePath; + } + + public static bool GetAssetAddressableKey(T asset, out string addressableKey) where T : UnityEngine.Object + { + string path = AssetDatabase.GetAssetPath(asset); + + if (asset is Sprite sprite && AssetImporter.GetAtPath(path) is TextureImporter importer) + { + if (importer.textureType == TextureImporterType.Sprite && + importer.spriteImportMode == SpriteImportMode.Multiple) + { + if (TryGetAddressableKey(path, out var addressableKeyPrefix)) + { + addressableKey = $"{addressableKeyPrefix}[{sprite.name}]"; + return true; + } + + addressableKey = addressableKeyPrefix; + return false; + } + } + else if (asset is Sprite texture && AssetImporter.GetAtPath(path) is PSDImporter) + { + if (TryGetAddressableKey(path, out var addressableKeyPrefix)) + { + addressableKey = $"{addressableKeyPrefix}[{texture.name}]"; + return true; + } + + addressableKey = addressableKeyPrefix; + return false; + } + + return TryGetAddressableKey(path, out addressableKey); + } + + private static bool TryGetAddressableKey(string path, out string addressableKey) + { + var settings = UnityEditor.AddressableAssets.AddressableAssetSettingsDefaultObject.Settings; + if (settings != null) + { + var entry = settings.FindAssetEntry(AssetDatabase.AssetPathToGUID(path)); + if (entry != null) + { + addressableKey = entry.address; + return true; + } + } + + Debug.Log($"资源{path}不存在于Addressables中"); + addressableKey = path; + return false; + } } } \ No newline at end of file