Files
aibis-dream/Assets/Scripts/Framework/ResourceKit/ResourceKit.cs
T
2025-12-08 19:54:35 +08:00

116 lines
3.6 KiB
C#

using System;
using System.Linq;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
#if UNITY_EDITOR
using UnityEditor;
#endif
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<Sprite>(resPath);
return sprites.FirstOrDefault(sprite => sprite.name == spriteName);
}
public static T LoadAssetSync<T>(string key) where T : UnityEngine.Object
{
var operation = Addressables.LoadAssetAsync<T>(key);
operation.WaitForCompletion();
if (operation.Status == AsyncOperationStatus.Succeeded)
{
return operation.Result;
}
else
{
Debug.Log($"资源{key}不存在");
return default;
}
}
public static void LoadAssetAsync<T>(string key, Action<T> callback) where T : UnityEngine.Object
{
Addressables.LoadAssetAsync<T>(key).Completed += operation =>
{
if (operation.Status == AsyncOperationStatus.Succeeded)
{
callback(operation.Result);
}
else
{
Debug.Log($"资源{key}不存在");
}
};
}
#if UNITY_EDITOR
public static bool GetAssetAddressableKey(UnityEngine.Object asset, out string addressableKey)
{
string path = AssetDatabase.GetAssetPath(asset);
// 获取其在Addressables里的路径
var settings = UnityEditor.AddressableAssets.AddressableAssetSettingsDefaultObject.Settings;
if (settings != null)
{
var entry = settings.FindAssetEntry(AssetDatabase.AssetPathToGUID(path));
if (entry != null)
{
Debug.Log($"Addressable Key: {entry.address}");
addressableKey = entry.address;
return true;
}
}
Debug.Log($"资源{asset.name}不存在于Addressables中");
addressableKey = path;
return false;
}
}
#endif
}