| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 | using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Text.RegularExpressions;using Core.AssetLoadTool.Asset;using Fort23.Core;using Fort23.UTool;#if !COMBAT_SERVERusing UnityEngine;using UnityEngine.Networking;using Object = UnityEngine.Object;using Utility;public class AssetBundleLoadManager : Singleton<AssetBundleLoadManager>{    public BundleLoadType BundleLoadType;    public string h5Url;    public bool UnloadType = true;    public bool stopUpdate;    private string m_rootStreamingURL;    public string RootStreamingURL    {        get { return m_rootStreamingURL; }    }    private string m_rootStreamingBundleURL;    public string RootStreamingBundleURL    {        get { return m_rootStreamingBundleURL; }    }    private string m_rootPersistentBundleURL;    public string RootPersistentBundleURL    {        get { return m_rootPersistentBundleURL; }    }    public string manifestName    {        get { return m_manifestName; }    }    private string m_manifestName;    private string m_globalConfigName;    private string m_buildNoName;    private string m_assetConfigName;    public float gcTime;    public Map<string, AssetInfo> assetToBundleDict = new Map<string, AssetInfo>();    private AssetBundleManifest assetBundleManifest = null;    private Dictionary<string, string> assetBundleHash = new Dictionary<string, string>();    private int index = 0;    private System.Action loadEndCallBack;    public Map<AssetInfo, AssetLoadTaskBasic> m_currLoadAsset = new Map<AssetInfo, AssetLoadTaskBasic>();    public Map<string, BundleLoadBasic> m_currLoadBundle = new Map<string, BundleLoadBasic>();    public bool isSceneLoad;    private List<BundleLoadBasic> bundleUnloadBuffer = new List<BundleLoadBasic>();    public List<BundleLoadBasic> dependenciesBuffer = new List<BundleLoadBasic>();    public bool isUnload;    public System.Action<string> onLoadAsset;    public AssetBundleLoadManager()    {        SetFileRoot();    }    public async CTask InitAssetsManager(System.Action loadEndCallBack)    {        // Ctask        CTask cTask = CTask.Create(false);        LogTool.Log("kaishijiazai asset");        this.loadEndCallBack = delegate        {            cTask.SetResult();            loadEndCallBack?.Invoke();        };        index = 0;        //Load assetconfig file.        LoadAssetConfig(null);        //Load manifest file.        LoadManifest();        await cTask;    }    public void UnloadBundleBuffer()    {        LogTool.Log("卸载数据");        for (int i = 0; i < bundleUnloadBuffer.Count; i++)        {            bundleUnloadBuffer[i].UnloadBundle();        }        bundleUnloadBuffer.Clear();    }    public void CallBackLoadEnd()    {        index++;        if (index >= 2)        {            loadEndCallBack();        }    }    private void SetFileRoot()    {        m_rootStreamingURL = Application.streamingAssetsPath;        m_rootStreamingBundleURL = m_rootStreamingURL + "/Bundle/";        m_rootPersistentBundleURL = Application.persistentDataPath + "/Bundle/";#if UNITY_EDITOR        m_assetConfigName = Application.streamingAssetsPath +                            "/assetConfig.txt";#elif UNITY_IPHONE         m_rootStreamingURL = "file://" + m_rootStreamingURL;        m_rootStreamingBundleURL = "file://" + m_rootStreamingBundleURL;        m_assetConfigName = m_rootPersistentBundleURL +                            "assetConfig.txt";#else        m_assetConfigName = m_rootPersistentBundleURL +                            "assetConfig.txt";#endif        m_manifestName = "UnityBundle.unity3d";        //Temp path. When version update is ready, path will be persistentPath and streamingPath.//        m_rootpersistentBundleURL = Application.persistentDataPath + "/BundlAsset/";    }    private Dictionary<string, string> GetABNamesWithHash(AssetBundleManifest abm)    {        var hashNames = abm.GetAllAssetBundles();        Dictionary<string, string> ABNamesDict =            new Dictionary<string, string>();        foreach (var hashName in hashNames)        {            //需要注意AB后缀名,默认 .unity3d            var abName = Regex.Match(hashName,                "_[0-9a-f]{32}").Success                ? hashName.Substring(0, hashName.Length - 33)                : hashName;            ABNamesDict.Add(abName, hashName);        }        return ABNamesDict;    }    public void LoadAssetConfig(System.Action callBack)    {        DoLoadingAssetConfig(m_assetConfigName, callBack);    }    private void DoLoadingAssetConfig(string url, System.Action callBack)    {        assetToBundleDict.Clear();        if (BundleLoadType != BundleLoadType.H5 && File.Exists(url))        {            Debug.Log("URL:" + url);            string data = File.ReadAllText(url);            LoadPackedInfo(data, callBack);        }        else        {            // url = m_rootStreamingURL +            if (BundleLoadType != BundleLoadType.H5)            {                url = m_rootStreamingBundleURL + "assetConfig.txt";            }            else            {                url = h5Url + "assetConfig.txt";            }            Debug.Log("URL22:" + url);            Uri uri = new Uri(url);            UnityWebRequest unityWebRequest = UnityWebRequest.Get(uri);            unityWebRequest.SetRequestHeader("Content-Type", "application/json");            unityWebRequest.SetRequestHeader("Accept", "application/json");            unityWebRequest.certificateHandler = new CustomCertificateHandler();            UnityWebRequestAsyncOperation webRequestAsyncOperation = unityWebRequest.SendWebRequest();            webRequestAsyncOperation.completed += delegate(AsyncOperation operation)            {                if (!string.IsNullOrEmpty(webRequestAsyncOperation.webRequest.downloadHandler.error))                {                    LogTool.Error(Application.streamingAssetsPath + "m_assetConfigName buchunzai" + m_assetConfigName);                    LogTool.Error(webRequestAsyncOperation.webRequest.downloadHandler.error);                }                else                {                    LoadPackedInfo(webRequestAsyncOperation.webRequest.downloadHandler.text, callBack);                }            };        }        return;    }    private void LoadPackedInfo(string json, System.Action callBack)    {        // Debug.Log(json);        AllPackedAssetsInfo allPackedInfo = JsonManager.FromJson<AllPackedAssetsInfo>(json);        Debug.Log(allPackedInfo != null);        Debug.Log(allPackedInfo.assetsList.Count);        for (int i = 0; i < allPackedInfo.assetsList.Count; i++)        {            AssetInfo assetInfo = allPackedInfo.assetsList[i];            if (assetInfo != null)            {                assetToBundleDict.Add(assetInfo.name, assetInfo);            }        }        if (callBack != null)            callBack();        CallBackLoadEnd();    }    private void LoadManifest()    {        DoLoadingManifest();    }    private void DoLoadingManifest()    {        string url = RootPersistentBundleURL + m_manifestName;        if (BundleLoadType != BundleLoadType.H5 && !File.Exists(url))        {            url = Application.streamingAssetsPath + "/Bundle/" + m_manifestName;        }        if (BundleLoadType == BundleLoadType.LocalAsset)        {            CallBackLoadEnd();            return;        }        if (BundleLoadType == BundleLoadType.H5)        {            url = h5Url + m_manifestName;        }#if UNITY_ANDROID&&!UNITY_EDITOR        url = "file://" + url;#endif        Debug.Log(url);        UnityWebRequest webRequest = UnityWebRequestAssetBundle.GetAssetBundle(url);        webRequest.certificateHandler = new CustomCertificateHandler();        UnityWebRequestAsyncOperation webRequestAsyncOperation = webRequest.SendWebRequest();        // AssetBundleCreateRequest bundlReq = AssetBundle.LoadFromFileAsync(url);        webRequestAsyncOperation.completed += delegate(AsyncOperation operation)        {            DownloadHandlerAssetBundle downloadHandler = webRequest.downloadHandler as DownloadHandlerAssetBundle;            assetBundleManifest = downloadHandler.assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");            if (assetBundleManifest != null)            {                LogTool.Log("AssetBundleManifest jizaiwancheng");            }            assetBundleHash = GetABNamesWithHash(assetBundleManifest);            downloadHandler.assetBundle.Unload(false);            CallBackLoadEnd();        };    }    public string[] GetBundleDependencies(string bundleName)    {        if (assetBundleManifest == null)        {            return null;        }        return assetBundleManifest.GetDirectDependencies(bundleName);    }    public async CTask<AssetHandle> LoadAssetAsyncTask<T>(string assetName,        System.Action<AssetHandle> callBack = null, Clock clock = null, bool isUseSynchronous = false) where T : Object    {        onLoadAsset?.Invoke(assetName);        //临时使用到007的bundle加载,现在这个bundel卸载有遗漏,后面有时间了在改        CTask task = CTask.Create(false);        AssetHandle obj = null;        LoadAssetAsync<T>(assetName, delegate(AssetHandle o, object o1)        {            if (o != null)            {                obj = o;            }            task.SetResult();        }, clock, isUseSynchronous);        await task;        // TODO 暂时去掉,不知道会不会有影响        // await TimerComponent.Instance.WaitFrameAsync();        callBack?.Invoke(obj);        return obj;    }    private void LoadAssetAsync<T>(string assetName, System.Action<AssetHandle, object> callBack, Clock clock = null,        object userData = null, bool isUseSynchronous = false) where T : Object    {        if (!assetToBundleDict.TryGetValue(assetName, out AssetInfo assetInfo))        {            callBack?.Invoke(null, userData);            Debug.LogWarning("没找到资源" + assetName);            return;        }        LoadAssetCallBackData loadAssetCallBackData = new LoadAssetCallBackData();        loadAssetCallBackData.loadEndCallBack = callBack;        loadAssetCallBackData.userData = userData;        loadAssetCallBackData.Clock = clock;        loadAssetCallBackData.isUseSynchronous = isUseSynchronous;        AssetLoadTaskBasic assetLoad = null;        if (!m_currLoadAsset.TryGetValue(assetInfo, out assetLoad))        {            assetLoad = CreateAssetTaskBasic();            assetLoad.InitAsset<T>(assetInfo, UnloadType, loadAssetCallBackData);            m_currLoadAsset.Add(assetInfo, assetLoad);        }        else        {            assetLoad.AddCallBack<T>(loadAssetCallBackData);        }    }    protected AssetLoadTaskBasic CreateAssetTaskBasic()    {        switch (BundleLoadType)        {            case BundleLoadType.LocalAsset:                return new LocalAssetLoadTask();                break;            case BundleLoadType.LocalBundle:                return new BundleAssetLoadTask();                break;            case BundleLoadType.H5:                return new BundleAssetLoadTask();                break;        }        LogTool.Error("加载模式不存在" + BundleLoadType);        return null;    }    protected BundleLoadBasic CreateBundleTaskBasic()    {        switch (BundleLoadType)        {            case BundleLoadType.LocalAsset:                break;            case BundleLoadType.LocalBundle:                return new LocalBundleLoadTask();                break;            case BundleLoadType.H5:                return new H5BundleLoadTask();                break;        }        LogTool.Error("加载模式不存在" + BundleLoadType);        return null;    }    public BundleLoadBasic AddBundleTask(string bundleName, System.Action<BundleLoadBasic, object> callBack,        LoadTaskBasic loadTaskBasic)    {        BundleLoadBasic bundleLoadTask = null;        if (assetBundleHash.TryGetValue(bundleName, out string hash))        {            bundleName = hash;        }        if (m_currLoadBundle.ContainsKey(bundleName))        {            bundleLoadTask = m_currLoadBundle[bundleName];        }        if (bundleLoadTask == null)        {            bundleLoadTask = CreateBundleTaskBasic();            //AssetInfo bundleInfo = assetToBundleDict[assetName];            m_currLoadBundle.Add(bundleName, bundleLoadTask);            bundleLoadTask.InitBundle(bundleName, UnloadType, callBack);            bundleLoadTask.AddOwnTask(loadTaskBasic);        }        else        {            bundleLoadTask.AddOwnTask(loadTaskBasic);            bundleLoadTask.AddCallBack(callBack);        }        return bundleLoadTask;    }    public string GetBudnleInfo()    {        return $"当前拥有资源数:{m_currLoadAsset.Count}    bundle数:{m_currLoadBundle.Count}";    }    public void UpdateBundle()    {        if (stopUpdate)            return;        BundleLoadBasic[] depend = dependenciesBuffer.ToArray();        for (int i = 0; i < depend.Length; i++)        {            if (depend[i].AwaitDependenceLoadEnd())            {                dependenciesBuffer.Remove(depend[i]);            }        }        // bool isShowDebug = Input.GetKeyUp(KeyCode.K);        int count = 0;        for (m_currLoadAsset.Begin(); m_currLoadAsset.Next();)        {            // if (isShowDebug)            // {            //     Debug.Log(m_currLoadAsset.Key.name + "____" + m_currLoadAsset.Value.HandCount);            // }            count += m_currLoadAsset.Value.HandCount;            m_currLoadAsset.Value.Update();        }        // if (isShowDebug)        // {        //     Debug.Log($"当前拥有资源数:{count}    bundle数:{m_currLoadBundle.Count}");        // }    }    public void RemoveAssetTask(AssetInfo assetInfo)    {        if (m_currLoadAsset.ContainsKey(assetInfo))        {            m_currLoadAsset.Remove(assetInfo);        }    }    public void RemoveBundleTask(BundleLoadBasic budnleLoadTask)    {        if (m_currLoadBundle.ContainsKey(budnleLoadTask.bundleName))        {            m_currLoadBundle.Remove(budnleLoadTask.bundleName);        }    }    public void ClearUnusedBundles()    {    }    public bool IsAssetInfo(string assetName)    {        return false;    }}#endif
 |