| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 | using System.Collections.Generic;using Fort23.Core;using Fort23.UTool;using UnityEngine;using Utility;namespace Core.AssetLoadTool.Asset{    public class BundleLoadBasic : LoadTaskBasic    {        public List<LoadTaskBasic> ownTask = new List<LoadTaskBasic>();        protected string url;        private float progress;        protected object userData;        private Map<string, LoadInfoAsset> _bundleAsset = new Map<string, LoadInfoAsset>();        public AssetBundle currBundle        {            get { return _currBundle; }        }        protected AssetBundle _currBundle;        protected System.Action<BundleLoadBasic, object> callBack;        protected List<BundleLoadBasic> m_dependenceTasks = new List<BundleLoadBasic>();        protected bool isAwaitDependencies;        protected bool _isUnloadType;        public string bundleName;        public void InitBundle(string bundleName, bool isUnloadType, System.Action<BundleLoadBasic, object> callBack)        {            // Debug.Log("加载bunlde"+bundleName);            _isUnloadType = isUnloadType;            loadState = LoadState.Init;            AddCallBack(callBack);            this.bundleName = bundleName;            LoadDependencies(bundleName);        }        public bool IsRepeat(string bundleName)        {            for (int i = 0; i < m_dependenceTasks.Count; i++)            {                BundleLoadBasic bundleLoadBasic = m_dependenceTasks[i];                if (bundleLoadBasic.bundleName == bundleName)                {                    return true;                }                else                {                    bool isRepeat = bundleLoadBasic.IsRepeat(bundleName);                    if (isRepeat)                    {                        return true;                    }                }            }            return false;        }        public void LoadDependencies(string bundleName)        {            string[] dependencies = AssetBundleLoadManager.Instance.GetBundleDependencies(bundleName);            if (dependencies != null && dependencies.Length > 0)            {                m_dependenceTasks = new List<BundleLoadBasic>();                for (int i = 0; i < dependencies.Length; i++)                {                    string depBundleName = dependencies[i];                    BundleLoadBasic task = AssetBundleLoadManager.Instance.AddBundleTask(depBundleName, null, this);                    if (task.IsRepeat(bundleName))                    {                        LogTool.Error("重复加载依赖包" + depBundleName + "  " + bundleName);                        continue;                    }                    m_dependenceTasks.Add(task);                }                isAwaitDependencies = true;                loadState = LoadState.Await;                AssetBundleLoadManager.Instance.dependenciesBuffer.Add(this);            }            else            {                loadState = LoadState.Load;                StartLoad();            }        }        public bool AwaitDependenceLoadEnd()        {            for (int i = 0; i < m_dependenceTasks.Count; i++)            {                if (!m_dependenceTasks[i].IsLoadEnd())                {                    return false;                }            }            AwaitDependenciesFinish();            return true;        }        protected void AwaitDependenciesFinish()        {            isAwaitDependencies = false;            if (loadState == LoadState.Await)            {                // loadState = LoadState.End;                // callBack?.Invoke(this, userData);                loadState = LoadState.Load;                StartLoad();            }        }        protected void LoadFinish(AssetBundle assetBundle)        {            _currBundle = assetBundle;            if (_currBundle == null)            {                LogTool.Error("budnle空的" + url + "__" + bundleName);                return;            }            // if (isAwaitDependencies)            // {            //     loadState = LoadState.Await;            // }            // else            {                loadState = LoadState.End;                callBack?.Invoke(this, userData);            }        }        public void AddCallBack(System.Action<BundleLoadBasic, object> callBack)        {            if (loadState == LoadState.End)            {                if (callBack != null)                {                    callBack(this, userData);                }                return;            }            this.callBack += callBack;        }        public void AddOwnTask(LoadTaskBasic taskBasic)        {            if (taskBasic == null)            {                return;            }            if (ownTask.Contains(taskBasic))            {                return;            }            ownTask.Add(taskBasic);        }        public void RemoveAsset(string assetName)        {            if (_bundleAsset.TryGetValue(assetName, out LoadInfoAsset loadInfoAsset))            {                loadInfoAsset.count--;            }        }        public async CTask<T> LoadAsset<T>(string assetName) where T : Object        {            if (_bundleAsset.TryGetValue(assetName, out LoadInfoAsset loadInfoAsset))            {                loadInfoAsset.count++;                if (loadInfoAsset.asset == null)                {                    _bundleAsset.Remove(assetName);                }                else                {                    return (T)loadInfoAsset.asset;                }            }            if (_currBundle == null)            {                LogTool.Error("budnle已经空" + url + "__" + bundleName);                return default;            }            using (await CoroutineLockComponent.Instance.Wait(assetName))            {                if (_bundleAsset.TryGetValue(assetName, out loadInfoAsset))                {                    return (T)loadInfoAsset.asset;                }                CTask cTask = CTask.Create(false);                loadInfoAsset = new LoadInfoAsset();                AssetBundleRequest assetBundleRequest = _currBundle.LoadAssetAsync<T>(assetName);                assetBundleRequest.completed += delegate(AsyncOperation obj)                {                    loadInfoAsset.asset = assetBundleRequest.asset;                    loadInfoAsset.count = 1;                    _bundleAsset.Add(assetName, loadInfoAsset);                    cTask.SetResult();                };                // loadInfoAsset.asset = _currBundle.LoadAsset<T>(assetName);                // loadInfoAsset.count = 1;                await cTask;            }            return (T)loadInfoAsset.asset;        }        public void RemoveOwnTask(LoadTaskBasic taskBasic)        {            ownTask.Remove(taskBasic);            UnloadBundle();        }        public void UnloadBundle()        {            if (ownTask.Count <= 0)            {                Dispose();            }        }        private void Dispose()        {            if (loadState == LoadState.Load)            {                return;            }            for (_bundleAsset.Begin(); _bundleAsset.Next();)            {                if (_bundleAsset.Value.asset is GameObject)                {                    Object.DestroyImmediate(_bundleAsset.Value.asset, true);                }                else                {                    Resources.UnloadAsset(_bundleAsset.Value.asset);                }            }            _bundleAsset.Clear();            for (int i = 0; i < m_dependenceTasks.Count; i++)            {                m_dependenceTasks[i].RemoveOwnTask(this);            }            m_dependenceTasks.Clear();            if (_currBundle != null)            {                // Debug.Log("卸载bunlde"+bundleName);                _currBundle.Unload(_isUnloadType);                _currBundle = null;            }            AssetBundleLoadManager.Instance.RemoveBundleTask(this);            loadState = LoadState.Disposed;        }    }}
 |