using System; using System.Collections; using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; namespace AibisDream.Framework { public static class ResourceKit { public static string SaveSprite(Sprite sprite) { #if UNITY_EDITOR if (!sprite) return ""; // 先读Psd的路径 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; #else return null; #endif } 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 Sprite LoadSpriteFromPsd(string path) { int lastIndex = path.LastIndexOf('/'); string spriteName = path[(lastIndex + 1)..]; string resPath = path[..lastIndex]; // 加载 var sprites = Resources.LoadAll(resPath); return sprites.FirstOrDefault(sprite => sprite.name == spriteName); } public static T LoadAssetSync(string key) where T : UnityEngine.Object { T result = null; var operation = Addressables.LoadAssetAsync(key); // 运行协程等待加载完成 GameManager.Instance.StartCoroutine(LoadCoroutine(operation, loadedObject => result = loadedObject)); // 等待协程完成(阻塞主线程) while (!operation.IsDone) { // 主动让出一帧 System.Threading.Thread.Sleep(1); } return result; } private static IEnumerator LoadCoroutine(AsyncOperationHandle operation, Action onComplete) where T : UnityEngine.Object { yield return operation; if (operation.Status == AsyncOperationStatus.Succeeded) { onComplete?.Invoke(operation.Result); } else { Debug.LogError("Failed to load addressable"); } Addressables.Release(operation); } } }