using UnityEngine; 
 | 
using System.Collections.Generic; 
 | 
using System; 
 | 
using UnityEngine.U2D; 
 | 
using System.IO; 
 | 
using UnityEngine.Video; 
 | 
using Spine.Unity; 
 | 
using UnityEngine.UI; 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
#if UNITY_EDITOR 
 | 
using UnityEditor; 
 | 
#endif 
 | 
  
 | 
using LaunchCommon; 
 | 
  
 | 
public class ResManager : Singleton<ResManager> 
 | 
{ 
 | 
     
 | 
  
 | 
    //不下载时本地安卓测试路径 
 | 
    // 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<Type, string> fileExtensionDict = new Dictionary<Type, string>() 
 | 
    { 
 | 
        {typeof(GameObject), "prefab"}, 
 | 
        {typeof(Sprite), "png"}, 
 | 
        {typeof(Texture2D), "jpg"}, 
 | 
        {typeof(Texture), "jpg"}, 
 | 
        { 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<T> (string directory, string name, bool needExt = true) where T : UnityEngine.Object 
 | 
    { 
 | 
        T asset = null; 
 | 
        //  特殊处理 因为有一层图集的关系 directory要传入的应该是atlas的名字 
 | 
        if (typeof(T) == typeof(Sprite)) 
 | 
        { 
 | 
            return LoadSprite(directory, name) as T; 
 | 
        } 
 | 
        else if (typeof(T) == typeof(SkeletonDataAsset)) 
 | 
        { 
 | 
            //文件目录调整,name中包含了路径 
 | 
            if (name.Contains("/")) 
 | 
            { 
 | 
                directory += name.Substring(0, name.LastIndexOf("/")); 
 | 
                name = name.Substring(name.LastIndexOf("/") + 1); 
 | 
            } 
 | 
  
 | 
            directory = directory.Replace("\\", "/"); 
 | 
        } 
 | 
  
 | 
        return LoadAssetInternal<T>(directory, name, needExt); 
 | 
    } 
 | 
  
 | 
    private T LoadAssetInternal<T>(string directory, string name, bool needExt = true) where T : UnityEngine.Object 
 | 
    { 
 | 
        T asset = null; 
 | 
        var path = ($"Assets/ResourcesOut/{directory}/{name}" + (needExt ? GetExtension(typeof(T)) : "")).Replace("//", "/").Trim().Replace("\\", "/"); 
 | 
  
 | 
        if (!AssetSource.isUseAssetBundle) 
 | 
        { 
 | 
#if UNITY_EDITOR 
 | 
            asset = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(path); 
 | 
#endif 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            if (!needExt) 
 | 
            { 
 | 
                //外部用到的自己加后缀,内部统一去除后缀名 
 | 
                name = name.Substring(0, name.LastIndexOf(".")); 
 | 
            } 
 | 
  
 | 
            if (directory == "UI" || directory == "UIComp" || directory.StartsWith("Sprite") 
 | 
            || directory == "Battle/Prefabs" || directory == "Materials") 
 | 
            { 
 | 
                directory = "UI/" + directory; 
 | 
            } 
 | 
            else if (name == "Hero_001") 
 | 
            { 
 | 
                directory = "UI/Hero/SpineRes"; 
 | 
            } 
 | 
  
 | 
            else if (directory.Contains("Texture")) 
 | 
            { 
 | 
                directory = "maps/" + name; 
 | 
            } 
 | 
  
 | 
  
 | 
            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 UNITY_EDITOR 
 | 
        if (!AssetSource.isUseAssetBundle) 
 | 
        { 
 | 
            path = ResourcesPath.CONFIG_FODLER + "/" + name + ".txt"; 
 | 
        } 
 | 
        else 
 | 
#endif 
 | 
        { 
 | 
            path = AssetVersionUtility.GetAssetFilePath($"config/{name}.txt"); 
 | 
        } 
 | 
  
 | 
        return File.ReadAllLines(path); 
 | 
    } 
 | 
  
 | 
    private Sprite LoadSprite(string atlasName, string spriteName) 
 | 
    { 
 | 
        if (!AssetSource.isUseAssetBundle) 
 | 
        { 
 | 
            SpriteAtlas atlas = LoadAsset<SpriteAtlas>("Sprite", atlasName.Replace("Sprite/", "")); 
 | 
            if (null == atlas) 
 | 
            { 
 | 
                return null; 
 | 
            } 
 | 
            return atlas.GetSprite(spriteName); 
 | 
        } 
 | 
        else 
 | 
            return LoadAssetInternal<Sprite>(atlasName, spriteName); 
 | 
    } 
 | 
  
 | 
    public void LoadAssetAsync<T>(string directory, string name, Action<bool, UnityEngine.Object> callBack, bool needExt = true) where T : UnityEngine.Object 
 | 
    { 
 | 
        //  特殊处理 因为有一层图集的关系 directory要传入的应该是atlas的名字 
 | 
        if (typeof(T) == typeof(Sprite)) 
 | 
        { 
 | 
            LoadSpriteAsync<T>(directory, name, callBack); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        LoadAssetAsyncInternal<T>(directory, name, callBack, needExt); 
 | 
    } 
 | 
  
 | 
    private void LoadSpriteAsync<T>(string atlasName, string spriteName, Action<bool, UnityEngine.Object> callBack) where T : UnityEngine.Object 
 | 
    { 
 | 
#if !UNITY_EDITOR 
 | 
        LoadAssetAsync<SpriteAtlas>(atlasName, spriteName, (isLoaded, atlas) => { 
 | 
            if (isLoaded) 
 | 
            { 
 | 
                SpriteAtlas _atlas = atlas as SpriteAtlas; 
 | 
                callBack?.Invoke(isLoaded, _atlas.GetSprite(spriteName)); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                callBack?.Invoke(false, null); 
 | 
            } 
 | 
        }); 
 | 
#else 
 | 
        //  编辑器下可以直接加载没啥问题 
 | 
        LoadAssetAsyncInternal<T>(atlasName, spriteName, callBack); 
 | 
#endif 
 | 
    } 
 | 
  
 | 
    private void LoadAssetAsyncInternal<T>(string directory, string name, Action<bool, UnityEngine.Object> callBack, bool needExt = true) where T : UnityEngine.Object 
 | 
    { 
 | 
        var path = string.Concat($"Assets/ResourcesOut/{directory}/{name}", (needExt ? GetExtension(typeof(T)) : "")).Replace("//", "/"); 
 | 
  
 | 
        if (!AssetSource.isUseAssetBundle) 
 | 
        { 
 | 
#if UNITY_EDITOR 
 | 
            var asset = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(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; 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |