using UnityEngine; using System.IO; using System.Collections.Generic; using UnityEngine.Playables; using UnityEngine.Video; using LuaInterface; public delegate void ResourceLoadCallback(T o, string assetPath, params string[] assetNames); public delegate void ResourceLoadCallbackWithSeqId(T o, long seqId,string assetPath,object[] userdatas, params string[] assetNames); public class ResourceInfo { private string path; private string name; private Object asset; private float lastUsedTime; public string Path { get { return path; } } public string Name { get { return name; } } public Object Asset { get { return asset; } } public float LastUsedTime { get { return lastUsedTime; } set { lastUsedTime = value; } } public ResourceInfo(string path_, string name_, Object asset_) { path = path_; name = name_; asset = asset_; lastUsedTime = Time.time; } public Object Reuse() { lastUsedTime = Time.time; return asset; } public void Dispose() { asset = null; } } public class LoadingResourceInfo { System.Type delegateType; public System.Type DelegateType { get { return delegateType; } } System.Delegate callback; public System.Delegate Callback { get { return callback; } } string assetPath; public string AssetPath { get { return assetPath; } } string assetName; public string AssetName { get { return assetName; } } string[] assetNames; public string[] AssetNames { get { return assetNames; } } long mSeqId = 0; public long SeqId { get { return mSeqId; } } bool mReturnSeqId = false; public bool ReturnSeqId { get { return mReturnSeqId; } } int mLoadNum = 0; public int LoadCBNum { get { return mLoadNum; } set { mLoadNum = value; } } public object[] userDatas; public LoadingResourceInfo(long seqId, string path_, System.Delegate callback_, System.Type delegateType_, bool returnSeq,params string[] assetNames_) { mSeqId = seqId; assetPath = path_; callback = callback_; assetNames = assetNames_; delegateType = delegateType_; mReturnSeqId = returnSeq; } public void Dispose() { callback = null; assetNames = null; } } public class ResourceMgr : Singleton { long loadingSeqId = 0; //对象池 Dictionary> > assetsPool = new Dictionary>>(); //已加载的资源列表 List loadedResources = new List(); //正在加载的资源 List loadingResources = new List(); const float check_internal = 60; const float cache_Time = 300; float lastCheckTime = 0; [NoToLua] public override void Init() { lastCheckTime = Time.time; } [NoToLua] public override void UnInit() { ClearAllResource(); } private GameObject mPoolGo = null; public Transform PoolNode { get { if (mPoolGo == null) { mPoolGo = new GameObject("PoolRoot"); if (GameMgr.Instance != null) { mPoolGo.transform.SetParent(GameMgr.Instance.transform); } mPoolGo.SetActive(false); } return mPoolGo.transform; } } #region outer_methods //已经在的资源个数 [NoToLua] public int LoadedResourceCnt { get { return loadedResources.Count; } } //正在加载的资源个数 [NoToLua] public int LoadingResourceCnt { get { return loadingResources.Count; } } [NoToLua] public GameObject GetGOFromResources(string assetName) { GameObject prefab = LoadObjFromResources(assetName); if (prefab == null) return null; //DebugHelper.LogError("AssetName " + assetName); return GameObject.Instantiate(prefab); } [NoToLua] public T LoadObjFromResources(string assetName) where T : UnityEngine.Object { return AssetsMgr.Instance.GetAssetFromResources(assetName); } [NoToLua] public void LoadLuaAsset(ResourceLoadCallback> cb, string pathName) { loadingSeqId++; LoadingResourceInfo lri = new LoadingResourceInfo(loadingSeqId, pathName, cb as System.Delegate, typeof(List), false, null); loadingResources.Add(lri); lri.LoadCBNum = AssetsMgr.Instance.GetAsset>(OnLoadDirAssetallback, ELoadType.OTHER, loadingSeqId, pathName); } [NoToLua] public void LoadDirAsset(ResourceLoadCallback cb, string pathName, ELoadType type = ELoadType.OTHER) { if (string.IsNullOrEmpty(pathName)) return; if (ExistAssetPath(pathName)) { FinishResourceLoad(cb, typeof(T), pathName, null,false,0,null); return; } loadingSeqId++; LoadingResourceInfo lri = new LoadingResourceInfo(loadingSeqId, pathName, cb as System.Delegate, typeof(T), false,null); loadingResources.Add(lri); lri.LoadCBNum = AssetsMgr.Instance.GetAsset(OnLoadDirAssetallback, type, loadingSeqId, pathName); } #region methods_for_lua public long LoadAssetSprite(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, null,assetNames); } public long LoadAssetSprites(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId> cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, null, assetNames); } public long LoadAssetSpriteWithUserData(string pathName, ELoadType type,object[] userDatas, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, userDatas,assetNames); } public long LoadAssetGameObject(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, null,assetNames); } public long LoadAssetGameObjectWithUserData(string pathName, ELoadType type, object[] userDatas, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type,userDatas ,assetNames); } public long LoadAssetGameObjects(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId> cb, params string[] assetNames) { return LoadAsset(cb, pathName, type,null, assetNames); } public long LoadAssetGameObjectsWithUserData(string pathName, ELoadType type, object[] userDatas, ResourceLoadCallbackWithSeqId> cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, userDatas, assetNames); } public long LoadAssetRuntimeAnimatorControllers(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId> cb, params string[] assetNames) { return LoadAsset(cb, pathName, type,null, assetNames); } public long LoadAssetRuntimeAnimatorControllersWithUserData(string pathName, ELoadType type, object[] userDatas, ResourceLoadCallbackWithSeqId> cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, userDatas,assetNames); } public long LoadAssetMaterial(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, null,assetNames); } public long LoadAssetMaterialWithUserData(string pathName, ELoadType type, object[] userDatas, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, userDatas, assetNames); } public long LoadAssetTexture(string pathName, ELoadType type, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, null, assetNames); } public long LoadAssetTextureWithUserData(string pathName, ELoadType type, object[] userDatas, ResourceLoadCallbackWithSeqId cb, params string[] assetNames) { return LoadAsset(cb, pathName, type, userDatas, assetNames); } public long LoadAsset(ResourceLoadCallbackWithSeqId cb, string pathName, ELoadType type, object[] userDatas, params string[] assetNames) { return Inner_LoadAsset(cb, pathName, assetNames, type, userDatas); } public Sprite FindSpriteByPathAndName(string pathName, string assetName) { return FindAssetByPathAndName(pathName, assetName); } #endregion public long LoadAsset(ResourceLoadCallback cb, string pathName, ELoadType type, params string[] assetNames) { return Inner_LoadAsset(cb, pathName, assetNames, type); } public long LoadAsset(ResourceLoadCallback cb, string pathName, params string[] assetNames) { return Inner_LoadAsset(cb, pathName, assetNames, ELoadType.OTHER); } public Object[] LoadABSync(string pathName, params string[] assetNames) { return AssetsMgr.Instance.LoadABSync(pathName, assetNames); } public T LoadAssetSync(string assetPath, string assetName) where T : UnityEngine.Object { T ret = null; Object obj = FindAssetByPathAndName(assetPath, assetName); if (obj == null) { ret = AssetsMgr.Instance.LoadAssetSync(assetPath, assetName); ResourceInfo ri = new ResourceInfo(assetPath, assetName, ret); loadedResources.Add(ri); } else { ret = obj as T; } return ret; } /// /// 从对象池中获取对象 /// /// /// /// public long GetGOFromPool(string assetsPath, string assetsName, System.Action action = null) { if (action == null || string.IsNullOrEmpty(assetsName)) return 0; if(!string.IsNullOrEmpty(assetsPath)) { Dictionary> mDirGoPool; if (assetsPool.TryGetValue(assetsPath, out mDirGoPool)) { GameObjectPool curPool = null; mDirGoPool.TryGetValue(assetsName, out curPool); if (curPool == null) { curPool = new GameObjectPool(); mDirGoPool.Add(assetsName, curPool); } GameObject go = curPool.Spawn(); if (go != null) { action(go); return 0; } } } ResourceLoadCallback callBack = (prefab, path_, assetName_) => { if (null == prefab) { if (action != null) action(null); return; } if (action != null) { GameObject goInst = GameObject.Instantiate(prefab); goInst.transform.localPosition = Vector3.zero; goInst.transform.localScale = Vector3.one; goInst.name = assetsName; action(goInst); } }; return LoadAsset(callBack, assetsPath, assetsName); } public long GetGoesFromPool(string assetsPath,string[] assetsNames, ResourceLoadCallback> cb) { if (cb == null || string.IsNullOrEmpty(assetsPath) || assetsNames == null || assetsNames.Length == 0) return 0; Dictionary> mDirGoPool; if (assetsPool.TryGetValue(assetsPath, out mDirGoPool)) { List goList = new List(); int cnt = 0; GameObjectPool curPool = null; for(int idx =0; idx < assetsNames.Length;idx++) { mDirGoPool.TryGetValue(assetsNames[idx], out curPool); if (curPool == null) { curPool = new GameObjectPool(); mDirGoPool.Add(assetsNames[idx], curPool); } GameObject go = curPool.Spawn(); if (go != null) { goList.Add(go); } else { cnt = idx; break; } } if(goList.Count == assetsNames.Length) { cb(goList, assetsPath, assetsNames); return 0; } else { for(int idx =0; idx > callBack = (prefabs, path_, assetName_) => { if (null == prefabs) { if (cb != null) cb(null, path_, assetName_); return; } if (cb != null) { List goInstList = new List(); for(int idx =0;idx < prefabs.Count;idx++) { GameObject goInst = GameObject.Instantiate(prefabs[idx]); goInst.transform.localPosition = Vector3.zero; goInst.transform.localScale = Vector3.one; goInst.name = assetName_[idx]; goInstList.Add(goInst); } cb(goInstList, path_, assetName_); } }; return LoadAsset>(callBack, assetsPath, assetsNames); } public GameObject GetGoFromPool(string assetPath, string assetName) { if (string.IsNullOrEmpty(assetName)) return null; GameObject go = null; if (!string.IsNullOrEmpty(assetPath)) { Dictionary> mDirGoPool; if (assetsPool.TryGetValue(assetPath, out mDirGoPool)) { GameObjectPool curPool = null; mDirGoPool.TryGetValue(assetName, out curPool); if (curPool == null) { curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); } go = curPool.Spawn(); if (go != null) { return go; } } } GameObject prefab = (GameObject)FindAssetByPathAndName(assetPath, assetName); if(prefab == null) { prefab = ResourceMgr.Instance.LoadAssetSync(assetPath, assetName); } if(prefab != null) { go = GameObject.Instantiate(prefab); } return go; } public GameObject GetUIGoFromPool(string assetPath, string assetName) { if (string.IsNullOrEmpty(assetName)) return null; if (!string.IsNullOrEmpty(assetPath)) { Dictionary> mDirGoPool; if (assetsPool.TryGetValue(assetPath, out mDirGoPool)) { GameObjectPool curPool = null; mDirGoPool.TryGetValue(assetName, out curPool); if (curPool == null) { curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); } GameObject go = curPool.Spawn(); if (go != null) { return go; } } } return null; } public void SetGoPoolMaxCacheNum(string assetPath, string assetName,int num) { if (string.IsNullOrEmpty(assetPath) || string.IsNullOrEmpty(assetName)) return; Dictionary> mDirGoPool; if(assetsPool.TryGetValue(assetPath,out mDirGoPool)) { GameObjectPool curPool = null; mDirGoPool.TryGetValue(assetName, out curPool); if (curPool == null) { curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); } curPool.SetMaxCacheNum(num); } else { mDirGoPool = new Dictionary>(); GameObjectPool curPool = new GameObjectPool(); curPool.SetMaxCacheNum(num); mDirGoPool.Add(assetName, curPool); assetsPool.Add(assetPath, mDirGoPool); } } public Object GetAsset(string assetPath,string assetName) { if(string.IsNullOrEmpty(assetName)) { return null; } return FindAssetByPathAndName(assetPath, assetName); } public void RecycleUIGO(string assetPath, string assetName, GameObject go) { if (go == null) return; if (string.IsNullOrEmpty(assetName) || string.IsNullOrEmpty(assetPath)) { GameObject.Destroy(go); go = null; return; } Dictionary> mDirGoPool = null; if (assetsPool.TryGetValue(assetPath, out mDirGoPool)) { GameObjectPool curPool = null; if (mDirGoPool.TryGetValue(assetName, out curPool)) { go.transform.SetParent(UIMgr.Instance.UIRootTrans); //CommonUtil.SetGameObjectLayer(go, "Hide"); go.SetActive(false); curPool.Recycle(go); return; } else { curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); go.transform.SetParent(UIMgr.Instance.UIRootTrans); //CommonUtil.SetGameObjectLayer(go, "Hide"); go.SetActive(false); curPool.Recycle(go); } } else { mDirGoPool = new Dictionary>(); GameObjectPool curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); assetsPool.Add(assetPath, mDirGoPool); go.transform.SetParent(UIMgr.Instance.UIRootTrans); //CommonUtil.SetGameObjectLayer(go, "Hide"); go.SetActive(false); curPool.Recycle(go); } } public void RecycleGO(string assetPath,string assetName, GameObject go) { if (go == null) return; if (string.IsNullOrEmpty(assetName) || string.IsNullOrEmpty(assetPath)) { GameObject.Destroy(go); go = null; return; } Dictionary> mDirGoPool = null; if(assetsPool.TryGetValue(assetPath, out mDirGoPool)) { GameObjectPool curPool = null; if (mDirGoPool.TryGetValue(assetName, out curPool)) { go.transform.SetParent(PoolNode); curPool.Recycle(go); return; } else { curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); go.transform.SetParent(PoolNode); curPool.Recycle(go); } } else { mDirGoPool = new Dictionary>(); GameObjectPool curPool = new GameObjectPool(); mDirGoPool.Add(assetName, curPool); assetsPool.Add(assetPath, mDirGoPool); go.transform.SetParent(PoolNode); curPool.Recycle(go); } } public void UnloadAssetBySeqId(long seqId) { RemoveLoadingCb(seqId); } [NoToLua] public void CleanGOPool() { foreach (var p in assetsPool) { Dictionary> poolDic = p.Value; foreach(var list in poolDic) { GameObjectPool goPool = list.Value; goPool.Dispose(); } } assetsPool.Clear(); } public Shader FindShader(string shaderName,string shaderPath) { return AssetsMgr.Instance.FindShader(shaderName, shaderPath); } #endregion [NoToLua] public void Update() { //if (LoadedResourceCnt == 0) return; //float curTime = Time.time; //if (curTime - lastCheckTime >= check_internal) //{ // ClearLongTimeUnusedResource(curTime); // lastCheckTime = curTime; //} } #region inner_methods void RemoveLoadingCb(long seqId) { LoadingResourceInfo lri = FindLoadingResourceInfoBySeqId(seqId); if (lri != null) { AssetsMgr.Instance.CancelLoadAsset(seqId); lri.Dispose(); loadingResources.Remove(lri); } } LoadingResourceInfo FindLoadingResourceInfoBySeqId(long seqId) { for (int idx = 0; idx < loadingResources.Count; idx++) { LoadingResourceInfo lri = loadingResources[idx]; if (lri.SeqId == seqId) return lri; } return null; } public bool HasAsset(string path,string assetName) { if (string.IsNullOrEmpty(assetName)) return false; Object obj = FindAssetByPathAndName(path, assetName); return obj != null; } bool ExistAssets(string path, string[] assetNames) { if (assetNames == null || assetNames.Length == 0) return false; bool find = false; for (int idx = 0; idx < assetNames.Length; idx++) { Object obj = FindAssetByPathAndName(path, assetNames[idx]); if (obj == null) return false; find = true; } return find; } bool ExistAssetPath(string path) { for (int idx = 0; idx < loadedResources.Count; idx++) { ResourceInfo ri = loadedResources[idx]; if (ri.Path == path) { return true; } } return false; } Object FindAssetByPathAndName(string pathName, string assetName) { for (int idx = 0; idx < loadedResources.Count; idx++) { ResourceInfo ri = loadedResources[idx]; if (ri.Path == pathName && ri.Name == assetName) { return ri.Asset; } } return null; } T FindAssetByPathAndName(string pathName, string assetName) where T : Object { for (int idx = 0; idx < loadedResources.Count; idx++) { ResourceInfo ri = loadedResources[idx]; if (ri.Path == pathName && ri.Name == assetName) { T ret = ri.Reuse() as T; return ret; } } return null; } long Inner_LoadAsset(ResourceLoadCallbackWithSeqId cb, string pathName, string[] assetNames, ELoadType type, object[] userDatas) { if (string.IsNullOrEmpty(pathName) && (assetNames == null || assetNames.Length == 0)) return 0; for (int idx = 0; idx < assetNames.Length; idx++) { if (assetNames[idx] == "Null" || string.IsNullOrEmpty(assetNames[idx])) { DebugHelper.LogError("加载的资源存在Null,请检查配置"); return 0; } } if (assetNames == null || assetNames.Length == 0) { if (cb != null) cb.DynamicInvoke(null, 0, pathName, userDatas, assetNames); return 0; } if (ExistAssets(pathName, assetNames)) { FinishResourceLoad(cb, typeof(T), pathName, assetNames,true,0, userDatas); return 0; } loadingSeqId++; LoadingResourceInfo lri = new LoadingResourceInfo(loadingSeqId, pathName, cb as System.Delegate, typeof(T), true,assetNames); lri.userDatas = userDatas; loadingResources.Add(lri); lri.LoadCBNum = AssetsMgr.Instance.GetAsset(OnLoadAssetallback, type, loadingSeqId, pathName, assetNames); if (lri.LoadCBNum == 0) { if (cb != null) cb.DynamicInvoke(null, loadingSeqId,pathName, userDatas, assetNames); RemoveLoadingCb(loadingSeqId); } return loadingSeqId; } private long Inner_LoadAsset(ResourceLoadCallback cb, string pathName, string[] assetNames, ELoadType type) { if (string.IsNullOrEmpty(pathName) && (assetNames == null || assetNames.Length == 0)) return 0; for (int idx = 0; idx < assetNames.Length; idx++) { if (assetNames[idx] == "Null" || string.IsNullOrEmpty(assetNames[idx])) { DebugHelper.LogError("加载的资源存在Null,请检查配置"); return 0; } } if (assetNames == null || assetNames.Length == 0) { if (cb != null) cb.DynamicInvoke(null, pathName, assetNames); return 0; } if (ExistAssets(pathName, assetNames)) { FinishResourceLoad(cb, typeof(T), pathName, assetNames,false,0,null); return 0; } loadingSeqId++; LoadingResourceInfo lri = new LoadingResourceInfo(loadingSeqId, pathName, cb as System.Delegate, typeof(T), false,assetNames); loadingResources.Add(lri); lri.LoadCBNum = AssetsMgr.Instance.GetAsset(OnLoadAssetallback, type, loadingSeqId, pathName, assetNames); if (lri.LoadCBNum == 0) { if (cb != null) cb.DynamicInvoke(null, pathName, assetNames); RemoveLoadingCb(loadingSeqId); } return loadingSeqId; } void OnLoadDirAssetallback(T result, long seqId, string assetPath, params string[] assetNames) { LoadingResourceInfo lri = FindLoadingResourceInfoBySeqId(seqId); if (lri != null) { System.Delegate cb = lri.Callback; if(cb!=null) cb.DynamicInvoke(result, assetPath, assetNames); RemoveLoadingCb(seqId); } else { DebugHelper.Log("Load " + seqId + " Failed LoadingCnt:" + LoadingResourceCnt); } } void OnLoadAssetallback(T result, long seqId, string assetPath, params string[] assetNames) { var t = typeof(T); if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { string objName = objList[idx] != null ? objList[idx].name : null; ResourceInfo ri = new ResourceInfo(assetPath, objName, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(List))) { List objList = result as List; if (assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, assetNames[idx], objList[idx]); loadedResources.Add(ri); } } else { for (int idx = 0; idx < objList.Count; idx++) { ResourceInfo ri = new ResourceInfo(assetPath, null, objList[idx]); loadedResources.Add(ri); } } } else if (t.Equals(typeof(ScriptableObject)) || t.Equals(typeof(GameObject)) || t.Equals(typeof(AudioClip)) || t.Equals(typeof(VideoClip)) || t.Equals(typeof(Texture2D)) || t.Equals(typeof(Sprite)) || t.Equals(typeof(Material)) || t.Equals(typeof(AnimationClip)) || t.Equals(typeof(RuntimeAnimatorController))) { Object obj = result as Object; ResourceInfo ri = new ResourceInfo(assetPath, assetNames[0], obj); loadedResources.Add(ri); } LoadingResourceInfo lri = FindLoadingResourceInfoBySeqId(seqId); if (lri != null) { lri.LoadCBNum = lri.LoadCBNum - 1; if(lri.LoadCBNum <= 0) { System.Delegate cb = lri.Callback; FinishResourceLoad(cb, lri.DelegateType, lri.AssetPath, lri.AssetNames, lri.ReturnSeqId, lri.SeqId,lri.userDatas); RemoveLoadingCb(seqId); } } else { DebugHelper.Log("Load " + seqId + " Failed LoadingCnt:" + LoadingResourceCnt); } } void FinishResourceLoad(System.Delegate cb, System.Type delegateType, string pathName, string[] assetNames,bool returnSeq,long seqId,object[] userdatas) { if (cb == null) return; if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq,seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(List))) { FinishLoad(cb, pathName, assetNames, false, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(GameObject))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(Texture2D))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(Sprite))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(TextAsset))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(PlayableAsset))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(AudioClip))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(VideoClip))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(AnimationClip))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(Sprite))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(Material))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } else if (delegateType.Equals(typeof(RuntimeAnimatorController))) { FinishLoad(cb, pathName, assetNames, true, returnSeq, seqId, userdatas); } } void FinishLoad(System.Delegate cb, string pathName, string[] assetNames, bool single, bool returnSeq, long seqId, object[] userdatas) where T : Object { if (single) { T go = FindAssetByPathAndName(pathName, assetNames[0]); try { if (returnSeq) { cb.DynamicInvoke(go, seqId, pathName, userdatas,assetNames); } else { cb.DynamicInvoke(go, pathName, assetNames); } } catch(System.Exception e) { DebugHelper.LogError(e.StackTrace); } } else { List assetList = new List(); if (assetNames != null && assetNames.Length > 0) { for (int idx = 0; idx < assetNames.Length; idx++) { assetList.Add(FindAssetByPathAndName(pathName, assetNames[idx])); } } else { for (int idx = 0; idx < loadedResources.Count; idx++) { ResourceInfo ri = loadedResources[idx]; if (ri.Path == pathName) { T asset = ri.Reuse() as T; assetList.Add(asset); } } } if(returnSeq) { cb.DynamicInvoke(assetList,seqId, pathName, userdatas, assetNames); } else { cb.DynamicInvoke(assetList, pathName, assetNames); } } ClearNullResource(); } void ClearNullResource() { for (int idx = loadedResources.Count - 1; idx >= 0; idx--) { ResourceInfo ri = loadedResources[idx]; if (ri.Asset == null) { loadedResources.RemoveAt(idx); } } } public void RemoveLoadedResource(string path,string assetName) { for (int idx = loadedResources.Count-1; idx >= 0; idx--) { var ri = loadedResources[idx]; if(ri.Path == path && ri.Name == assetName) { ri.Dispose(); loadedResources.RemoveAt(idx); } } } List mResidentDirList = new List(); List mResidentResList = new List(); public void ReadResidentResCfg() { mResidentDirList.Clear(); mResidentResList.Clear(); Dictionary> tab = ConfigMgr.Instance.getTable(Config.ResidentResCfg); if (tab == null) return; foreach(var p in tab) { var key = p.Key; var dic = p.Value; int kVal = 0; if (int.TryParse(key, out kVal)) { string resName = dic["name"]; int type = 0; if (dic.ContainsKey("type")) { int.TryParse(dic["type"], out type); } if (!string.IsNullOrEmpty(resName) && type > 0) { if (type == 1) { if (!mResidentDirList.Contains(resName)) mResidentDirList.Add(resName); } else if (type == 2) { if (!mResidentResList.Contains(resName)) { mResidentResList.Add(resName); } } } } } } public bool IsResidentRes(string assetPath,string assetName) { string path = assetPath + "/" + assetName; return IsResidentRes(path); } public bool IsResidentRes(string assetFullPath) { for (int idx = 0; idx < mResidentResList.Count; idx++) { if (mResidentResList[idx] == assetFullPath) return true; } string pathDir; FileUtils.ExtractParent(assetFullPath, out pathDir); if (!string.IsNullOrEmpty(pathDir)) { for (int idx = 0; idx < mResidentDirList.Count; idx++) { if (mResidentDirList[idx] == pathDir) return true; } } return false; } public void ClearAllResource() { for(int idx = loadedResources.Count -1; idx>=0; idx--) { ResourceInfo ri = loadedResources[idx]; if (IsResidentRes(ri.Path, ri.Name)) { continue; } ri.Dispose(); loadedResources.RemoveAt(idx); } CleanGOPool(); } void ClearLongTimeUnusedResource(float curTime) { for (int idx = loadedResources.Count - 1; idx >= 0; idx--) { ResourceInfo ri = loadedResources[idx]; float passedTime = curTime - ri.LastUsedTime; if (passedTime >= cache_Time && !IsResidentRes(ri.Path,ri.Name) && HasGoInPool(ri.Path,ri.Name)) { ri.Dispose(); loadedResources.RemoveAt(idx); } } } bool HasGoInPool(string assetPath,string assetName) { if (string.IsNullOrEmpty(assetPath)) return false; if (assetsPool == null) return false; Dictionary> mDirGoPool; if (assetsPool.TryGetValue(assetPath, out mDirGoPool)) { GameObjectPool curPool = null; mDirGoPool.TryGetValue(assetName, out curPool); if (curPool != null && curPool.Count > 0) { return true; } } return false; } #endregion }