using UnityEngine; using System.Collections.Generic; using System; using UnityEngine.U2D; using System.IO; using UnityEngine.Video; using Spine.Unity; #if UNITY_EDITOR using UnityEditor; #endif using LaunchCommon; public class ResManager : Singleton { //不下载时本地安卓测试路径 // public string assetBundlesPath = Application.dataPath + "/../AssetBundles/Android/"; // public static string bytesFolderName = "logicbytes/"; public string StreamingAssetPath { get { return ResourcesPath.Instance.StreamingAssetPath; } } public string ExternalStorePath { get { return ResourcesPath.Instance.ExternalStorePath; } } //用于editor 下的资源路径 public string ResourcesOutPath { get { return ResourcesPath.ResourcesOutPath; } } public string CONFIG_FODLER { get { return ResourcesPath.CONFIG_FODLER; } } public string ResourcesOutAssetPath { get { return ResourcesPath.ResourcesOutAssetPath; } } private static readonly Dictionary fileExtensionDict = new Dictionary() { {typeof(GameObject), "prefab"}, {typeof(Sprite), "png"}, {typeof(Texture2D), "png"}, {typeof(Shader), "shader"}, {typeof(TextAsset), "txt"}, {typeof(AudioClip), "wav"}, {typeof(Font), "ttf"}, {typeof(Material), "mat"}, {typeof(VideoClip), "mp4"}, {typeof(SpriteAtlas), "spriteatlasv2"}, {typeof(SkeletonDataAsset), "asset"}, }; public void Init() { } public void Release() { } private string GetExtension(Type type) { if (fileExtensionDict.TryGetValue(type, out string extension)) return "." + extension; else { Debug.LogErrorFormat("GetExtension() => 不支持的资源类型: {0}.", type.Name); return ""; } } #if UNITY_EDITOR public string GetFullDirectory(string directory) { string fullDirectory = Path.Combine(ResourcesOutPath, directory); return fullDirectory; } public string FindFilePath(string directory, string fileName) { string[] files = Directory.GetFiles(GetFullDirectory(directory), fileName, SearchOption.AllDirectories); if (files.Length > 0) { return files[0]; } return string.Empty; } public string GetRelativePath(string absolutePath) { string relativePath = absolutePath.Replace(ResourcesOutPath, "Assets/ResourcesOut/"); return relativePath; } #endif public T LoadAsset (string directory, string name) where T : UnityEngine.Object { T asset = null; // 特殊处理 因为有一层图集的关系 directory要传入的应该是atlas的名字 if (typeof(T) == typeof(Sprite)) { return LoadSprite(directory, name) as T; } return LoadAssetInternal(directory, name); } private T LoadAssetInternal(string directory, string name) where T : UnityEngine.Object { T asset = null; var path = ($"Assets/ResourcesOut/{directory}/{name}" + GetExtension(typeof(T))).Replace("//", "/").Trim().Replace("\\", "/"); if (!AssetSource.isUseAssetBundle) { #if UNITY_EDITOR asset = UnityEditor.AssetDatabase.LoadAssetAtPath(path); #endif } else { var assetInfo = new AssetInfo(directory.ToLower(), name.ToLower()); asset = AssetBundleUtility.Instance.Sync_LoadAsset(assetInfo, typeof(T)) as T; } if (asset == null) { Debug.LogErrorFormat("LoadAsset() => 加载不到资源: {0}", path); } return asset; } public string[] LoadConfig(string name) { string path = string.Empty; if (!AssetSource.isUseAssetBundle) { #if UNITY_EDITOR path = ResourcesPath.CONFIG_FODLER + "/" + name + ".txt"; #endif } else { path = AssetVersionUtility.GetAssetFilePath($"Config/{name}.txt"); } return File.ReadAllLines(path); } private Sprite LoadSprite(string atlasName, string spriteName) { #if !UNITY_EDITOR SpriteAtlas atlas = LoadAsset("Sprite", atlasName.Replace("Sprite/", "")); return atlas.GetSprite(spriteName); #else return ResManager.Instance.LoadAssetInternal(atlasName, spriteName); #endif } public void LoadAssetAsync(string directory, string name, Action callBack) where T : UnityEngine.Object { // 特殊处理 因为有一层图集的关系 directory要传入的应该是atlas的名字 if (typeof(T) == typeof(Sprite)) { LoadSpriteAsync(directory, name, callBack); return; } LoadAssetAsyncInternal(directory, name, callBack); } private void LoadSpriteAsync(string atlasName, string spriteName, Action callBack) where T : UnityEngine.Object { #if !UNITY_EDITOR LoadAssetAsync(atlasName, spriteName, (isLoaded, atlas) => { if (isLoaded) { callBack?.Invoke(isLoaded, atlas.GetSprite(spriteName)); } else { callBack?.Invoke(false, null); } }); #else // 编辑器下可以直接加载没啥问题 LoadAssetAsyncInternal(atlasName, spriteName, callBack); #endif } private void LoadAssetAsyncInternal(string directory, string name, Action callBack) where T : UnityEngine.Object { var path = string.Concat($"Assets/ResourcesOut/{directory}/{name}", GetExtension(typeof(T))).Replace("//", "/"); if (!AssetSource.isUseAssetBundle) { #if UNITY_EDITOR var asset = UnityEditor.AssetDatabase.LoadAssetAtPath(path); callBack?.Invoke(asset != null, asset); #endif } else { var assetInfo = new AssetInfo(directory.ToLower(), name.ToLower()); AssetBundleUtility.Instance.Co_LoadAsset(assetInfo, callBack); } } public void UnloadAsset(string assetBundleName, string assetName) { if (!AssetSource.isUseAssetBundle) return; AssetBundleUtility.Instance.UnloadAsset(assetBundleName, assetName); } public void UnloadAssetBundle(string assetBundleName, bool unloadAllLoadedObjects, bool includeDependenice) { if (!AssetSource.isUseAssetBundle) return; AssetBundleUtility.Instance.UnloadAssetBundle(assetBundleName, unloadAllLoadedObjects, includeDependenice); } public string GetAssetFilePath(string _assetKey) { var path = Path.Combine(ExternalStorePath, _assetKey); if (!File.Exists(path)) { path = Path.Combine(StreamingAssetPath, _assetKey); } return path; } }