96 lines
2.9 KiB
C#
96 lines
2.9 KiB
C#
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<Sprite>(resPath);
|
|
|
|
return sprites.FirstOrDefault(sprite => sprite.name == spriteName);
|
|
}
|
|
|
|
public static T LoadAssetSync<T>(string key) where T : UnityEngine.Object
|
|
{
|
|
T result = null;
|
|
var operation = Addressables.LoadAssetAsync<T>(key);
|
|
|
|
// 运行协程等待加载完成
|
|
GameManager.Instance.StartCoroutine(LoadCoroutine(operation, loadedObject => result = loadedObject));
|
|
|
|
// 等待协程完成(阻塞主线程)
|
|
while (!operation.IsDone)
|
|
{
|
|
// 主动让出一帧
|
|
System.Threading.Thread.Sleep(1);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
private static IEnumerator LoadCoroutine<T>(AsyncOperationHandle<T> operation, Action<T> 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);
|
|
}
|
|
}
|
|
} |