| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 | using System;using System.Collections;using System.Collections.Generic;using Core.AssetLoadTool.Asset;using Fort23.UTool;#if !COMBAT_SERVERusing Fort23.Core;using UnityEngine;#endifusing Utility;using Object = UnityEngine.Object;public class AssetLoadTaskBasic : LoadTaskBasic{#if !COMBAT_SERVER    private List<LoadAssetCallBackData> loadEndCallBackData = new List<LoadAssetCallBackData>();    private Object objAsset;    private List<AssetHandle> _loadAssetHandles = new List<AssetHandle>();    protected bool _isUnloadType;    private int _callBackCount;    public int HandCount    {        get { return _loadAssetHandles.Count; }    }    public void InitAsset<T>(AssetInfo bundleInfo, bool isUnloadType,        LoadAssetCallBackData loadEndCallBack)        where T : Object    {        _isUnloadType = isUnloadType;        _assetInfo = bundleInfo;        loadState = LoadState.Load;        AddCallBack<T>(loadEndCallBack);        StartLoadAsset<T>();    }    protected virtual void StartLoadAsset<T>() where T : Object    {    }    public void LoadFinish<T>(Object objAsset)    {        this.objAsset = objAsset;        LoadAsset<T>();    }    public void Dispose()    {        if (loadState == LoadState.Disposed)        {            return;        }        objAsset = null;        loadEndCallBackData.Clear();        if (AssetBundleLoadManager.Instance != null)        {            AssetBundleLoadManager.Instance.RemoveAssetTask(_assetInfo);        }        loadState = LoadState.Disposed;        ProDispose();    }    protected virtual void ProDispose()    {    }    public void RemoveAssetHandle(AssetHandle assetHandle)    {        _loadAssetHandles.Remove(assetHandle);        if (_loadAssetHandles.Count <= 0 && _callBackCount <= 0)        {            Dispose();        }    }    private void LoadAsset<T>()    {        if (loadEndCallBackData.Count <= 0 || objAsset == null)        {            if (objAsset == null)            {                LogTool.Error(ToString() + "   " + _assetInfo.name + "资源没有了");            }            else            {                LogTool.Error(ToString() + "   " + _assetInfo.name + " 回掉没有了");            }            return;        }        if (loadState != LoadState.Load)        {            LogTool.Error(_assetInfo.name + " 以释放不能在加载");            return;        }        loadState = LoadState.End;        LoadAssetCallBackData[] delegateArr = loadEndCallBackData.ToArray();        _callBackCount = delegateArr.Length;        for (int i = 0; i < delegateArr.Length; i++)        {            _callBackCount--;            ExecutionCallBack<T>(delegateArr[i]);        }        loadEndCallBackData.Clear();        _callBackCount = 0;    }    protected void ExecutionCallBack<T>(LoadAssetCallBackData loadAssetCallBackData)    {        // Debug.Log("加载资源"+_assetInfo.name);        if (loadAssetCallBackData.Clock != null && loadAssetCallBackData.Clock.isBreak)        {            loadAssetCallBackData.loadEndCallBack?.Invoke(null, loadAssetCallBackData.userData);            return;        }        InstantiateSync<T>(loadAssetCallBackData.loadEndCallBack, loadAssetCallBackData.userData,            loadAssetCallBackData.isUseSynchronous);    }    public async CTask<AssetHandle> InstantiateSync(bool isUseSynchronous)    {        if (objAsset == null)        {            return null;        }        AssetHandle assetHandle = new AssetHandle();        try        {            UnityEngine.Object go = objAsset;            if ((go is GameObject)) //Prefab类型            {                // 异步unity目前有bug,先不要使用                 AsyncInstantiateOperation asyncInstantiateOperation = Object.InstantiateAsync<GameObject>(objAsset as GameObject);                                 if (isUseSynchronous)                 {                     asyncInstantiateOperation.WaitForCompletion();                 }                 else                 {                     CTask cTask = CTask.Create(false);                     asyncInstantiateOperation.completed += delegate(AsyncOperation operation)                     {                         cTask.SetResult();                     };                     await cTask;                 }                 go = asyncInstantiateOperation.Result[0];                 if (!Application.isPlaying)                 {                     GameObject.DestroyImmediate(go);                     return null;                 }                 // go = Object.Instantiate(objAsset);                // go.name = _assetInfo.name;            }            assetHandle.Init(this, go);            _loadAssetHandles.Add(assetHandle);        }        catch (Exception e)        {            LogTool.Error("资源加载出问题" + _assetInfo.name + "___" + e.Message);            LogTool.Error(e);        }        return assetHandle;    }    private async CTask InstantiateSync<T>(System.Action<AssetHandle, object> callBack, object userData,        bool isUseSynchronous)    {        try        {            AssetHandle assetHandle = await InstantiateSync(isUseSynchronous);            callBack(assetHandle, userData);        }        catch (System.Exception e)        {            LogTool.Error(_assetInfo.name + "_" + e);            CallErrorBack();        }    }    protected override void ProUpdate()    {        for (int i = 0; i < _loadAssetHandles.Count; i++)        {            bool isActivation = _loadAssetHandles[i].IsActivation();            if (!isActivation)            {                _loadAssetHandles[i].Release();            }        }    }    public void AddCallBack<T>(LoadAssetCallBackData loadEndCallBack)    {        //LogTool.Log("assetAddCallBack" + assetName);        if (loadState == LoadState.End)        {            ExecutionCallBack<T>(loadEndCallBack);            return;        }        loadEndCallBackData.Add(loadEndCallBack);    }    protected void CallErrorBack()    {        for (int i = 0; i < loadEndCallBackData.Count; i++)        {            LoadAssetCallBackData loadAssetCallBackData = loadEndCallBackData[i];            loadAssetCallBackData.loadEndCallBack?.Invoke(null, loadAssetCallBackData.userData);        }        _callBackCount = 0;        loadEndCallBackData.Clear();    }#endif}
 |