public GameObject InstantiateObject(string path, bool setSceneObj = false, bool bClear = true)//是否跳场景清除 { uint crc = Crc32.GetCrc32(path); ResourceObj resourceObj = GetObjectFromPool(crc); if (resourceObj == null) { resourceObj = m_ResourceObjClassPool.Spawn(); resourceObj.m_Crc = crc; resourceObj.m_bClear = bClear; resourceObj.m_ResItem = null; resourceObj = ResourceMgr.Instance.LoadResoruce(path, resourceObj); if (resourceObj.m_ResItem.m_Obj != null) { resourceObj.m_CloneObj = GameObject.Instantiate(resourceObj.m_ResItem.m_Obj) as GameObject; } } if (setSceneObj) { resourceObj.m_CloneObj.transform.SetParent(SceneTrs, false); } int tempID = resourceObj.m_CloneObj.GetInstanceID(); if (!m_ResourceObjDic.ContainsKey(tempID)) { m_ResourceObjDic.Add(tempID, resourceObj); } return(resourceObj.m_CloneObj); }
/// <summary> /// 清楚资源池缓存 /// </summary> public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint crc in m_ObjectPoolDic.Keys) { List <ResourceObj> resObjs = m_ObjectPoolDic[crc]; for (int i = resObjs.Count - 1; i >= 0; i--) { ResourceObj item = resObjs[i]; if (!System.Object.ReferenceEquals(item, null) && resObjs[i].m_bClear) { GameObject.Destroy(item.m_CloneObj); m_ResourceObjDic.Remove(item.m_CloneObj.GetInstanceID()); item.Reset(); m_ResourceObjClassPool.Recycle(item); resObjs.Remove(item); } } if (resObjs.Count <= 0) { tempList.Add(crc); } } for (int i = 0; i < tempList.Count; i++) { if (m_ObjectPoolDic.ContainsKey(tempList[i])) { m_ObjectPoolDic.Remove(tempList[i]); } } tempList.Clear(); }
/// <summary> /// 清除某个资源在对象池中所有的对象 /// </summary> /// <param name="crc"></param> public void ClearPoolObject(uint crc) { List <ResourceObj> st = null; if (!m_ObjectPoolDic.TryGetValue(crc, out st) || st == null) { return; } for (int i = st.Count - 1; i >= 0; i--) { ResourceObj resObj = st[i]; if (resObj.m_bClear) { st.Remove(resObj); int tempID = resObj.m_CloneObj.GetInstanceID(); GameObject.Destroy(resObj.m_CloneObj); resObj.Reset(); m_ResourceObjDic.Remove(tempID); m_ResourceObjClassPool.Recycle(resObj); } } if (st.Count <= 0) { m_ObjectPoolDic.Remove(crc); } }
/// <summary> /// 取消异步加载资源 /// </summary> /// <returns>true为完全取消了,false表示可能还有其他相同操作的异步在进行,并没有取消</returns> public bool CancleLoad(ResourceObj resObj) { AsyncLoadResParam para = null; if (m_LoadingAssetDic.TryGetValue(resObj.m_Crc, out para) && m_LoadingAssetList[(int)para.m_Priority].Contains(para)) { for (int i = para.m_CallBackList.Count - 1; i >= 0; i--) { AsyncCallBack tempCallBack = para.m_CallBackList[i]; if (tempCallBack != null && resObj == tempCallBack.m_ResObj) { tempCallBack.Reset(); m_AsyncCallBackPool.Recycle(tempCallBack); para.m_CallBackList.Remove(tempCallBack); } } if (para.m_CallBackList.Count <= 0) { m_LoadingAssetList[(int)para.m_Priority].Remove(para); para.Reset(); m_AsyncLoadResParamPool.Recycle(para); m_LoadingAssetDic.Remove(resObj.m_Crc); return(true); } } return(false); }
public void AsyncLoadResource(string path, ResourceObj resObj, OnAsyncFinish dealfinish, LoadResPriority priority) { ResourceItem item = GetCacheResourceItem(resObj.m_Crc); if (item != null) { resObj.m_ResItem = item; if (dealfinish != null) { dealfinish(path, resObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3); } return; } //判断是否在加载中 AsyncLoadResParam para = null; if (!m_LoadingAssetDic.TryGetValue(resObj.m_Crc, out para) || para == null) { para = m_AsyncLoadResParamPool.Spwan(true); para.m_Crc = resObj.m_Crc; para.m_Path = path; para.m_Priority = priority; m_LoadingAssetDic.Add(resObj.m_Crc, para); m_LoadingAssetList[(int)priority].Add(para); } //往回调列表里面加回调 AsyncCallBack callBack = m_AsyncCallBackPool.Spwan(true); callBack.m_DealFinish = dealfinish; callBack.m_ResObj = resObj; para.m_CallBackList.Add(callBack); }
/// <summary> /// 同步加载 /// </summary> /// <param name="path">路径</param> /// <param name="setSceneObj">是否设置父节点为场景节点</param> /// <param name="bClear">跳场景是否清楚,默认清除</param> /// <returns></returns> public GameObject InstantiateObject(string path, bool setSceneObj = false, bool bClear = true) { uint crc = Crc.GetCRC32(path); ResourceObj resObj = GetObjectFromPool(crc); if (resObj == null) { resObj = m_ResourceObjClassPool.Spawn(); resObj.m_Crc = crc; resObj.m_bClear = bClear; //resMgr提供加载方法 resObj = ResourceManger.Instance.LoadResource(path, resObj); if (resObj.m_ResourceItem.m_obj != null) { resObj.m_CloneObj = GameObject.Instantiate(resObj.m_ResourceItem.m_obj) as GameObject; resObj.m_OffineData = resObj.m_CloneObj.GetComponent <OffineData>(); } } if (setSceneObj) { //因为SetParent十分耗费性能,所以加一个开关 resObj.m_CloneObj.transform.SetParent(SceenTrs, true); } //resObj.m_OffineData.ResetProp();//还原 long guid = resObj.m_CloneObj.GetInstanceID(); if (!m_ResourceObjDic.ContainsKey(guid)) { m_ResourceObjDic.Add(guid, resObj); } return(resObj.m_CloneObj); }
/// <summary> /// 从对象池取对象 /// </summary> /// <param name="crc"></param> /// <returns></returns> protected ResourceObj GetObjectFromPool(uint crc) { List <ResourceObj> st = null; if (m_ObjectPoolDic.TryGetValue(crc, out st) && st != null && st.Count > 0) { ResourceManager.Instance.IncreaseResourceRef(crc); ResourceObj resObj = st[0]; st.RemoveAt(0); GameObject obj = resObj.m_CloneObj; if (!System.Object.ReferenceEquals(obj, null)) { if (!System.Object.ReferenceEquals(resObj.m_OfflineData, null)) { resObj.m_OfflineData.ResetProp(); } resObj.m_Already = false; #if UNITY_EDITOR if (obj.name.EndsWith("(Recycle)")) { obj.name = obj.name.Replace("(Recycle)", ""); } #endif } return(resObj); } return(null); }
/// <summary> /// 同步加载 /// </summary> /// <param name="path"></param> /// <param name="bClear"></param> /// <returns></returns> public GameObject InstantiateObject(string path, bool setSceneObj = false, bool bClear = true) { uint crc = CRC32.GetCRC32(path); ResourceObj resourceObj = GetObjectFromPool(crc); if (resourceObj == null) { resourceObj = m_ResourceObjClassPool.Spwan(true); resourceObj.m_Crc = crc; resourceObj.m_bClear = bClear; resourceObj = ResourceManager.Instance.LoadResource(path, resourceObj); if (!System.Object.ReferenceEquals(resourceObj.m_ResItem.m_Obj, null)) { resourceObj.m_CloneObj = GameObject.Instantiate(resourceObj.m_ResItem.m_Obj) as GameObject; resourceObj.m_OfflineData = resourceObj.m_CloneObj.GetComponent <OfflineData>(); } } if (setSceneObj) { resourceObj.m_CloneObj.transform.SetParent(SceneTrs); } int tempID = resourceObj.m_CloneObj.GetInstanceID(); if (!m_ResourceObjDic.ContainsKey(tempID)) { m_ResourceObjDic.Add(tempID, resourceObj); } return(resourceObj.m_CloneObj); }
/// <summary> /// 清空对象池 /// </summary> public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint key in m_ObjectPoolDic.Keys) { List <ResourceObj> st = m_ObjectPoolDic[key]; for (int i = st.Count - 1; i >= 0; i--) { ResourceObj resObj = st[i]; if (!System.Object.ReferenceEquals(resObj.m_CloneObj, null) && resObj.m_bClear) { GameObject.Destroy(resObj.m_CloneObj); m_ResourceObjDic.Remove(resObj.m_CloneObj.GetInstanceID()); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } } if (st.Count <= 0) { tempList.Add(key); } } for (int i = 0; i < tempList.Count; i++) { uint temp = tempList[i]; if (m_ObjectPoolDic.ContainsKey(temp)) { m_ObjectPoolDic.Remove(temp); } } tempList.Clear(); }
public override void Reset() { foreach (var ResourceObj in ActiveResources) //this will clear all the instances: TODO: possibly implement new method on modules to free memory (if needed) { ResourceObj.Reset(); } }
public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destroyCache = false, bool recycleParent = true) { if (obj == null) { return; } ResourceObj resObj = null; int tempID = obj.GetInstanceID(); if (!m_ResourceObjDic.TryGetValue(tempID, out resObj)) { Debug.LogError("对象不是ObjMgr创建的"); return; } if (resObj == null) { Debug.LogError("缓存的resObj为空"); } if (resObj.m_Already) { Debug.LogError("对象已被放回对象池,是否清除引用"); return; } }
public void Reset() { m_DealObjFinish = null; m_Param1 = null; m_Param2 = null; m_Param3 = null; m_ResObj = null; }
/// <summary> /// 同步加载资源 针对给ObjectManager的接口 /// </summary> /// <param name="path"></param> /// <param name="resObj"></param> /// <returns></returns> public ResourceObj LoadResource(string path, ResourceObj resObj) { if (resObj == null) { return(null); } uint crc = resObj.m_Crc == 0 ? CRC32.GetCRC32(path) : resObj.m_Crc; ResourceItem item = GetCacheResourceItem(crc); if (item != null) { resObj.m_ResItem = item; return(resObj); } Object obj = null; #if UNITY_EDITOR if (!m_LoadFromAssetBundle) { item = AssetBundleManager.Instance.FindResourceItem(resObj.m_Crc); if (item != null && item != null) { obj = item.m_Obj as Object; } else { if (item == null) { item = new ResourceItem(); item.m_Crc = crc; } obj = LoadAssetByEditor <Object>(path); } } #endif if (obj == null) { item = AssetBundleManager.Instance.LoadResouceAssetBundle(crc); if (item != null && item.m_AssetBundle != null) { if (item.m_Obj != null) { obj = item.m_Obj as Object; } else { obj = item.m_AssetBundle.LoadAsset <Object>(item.m_AssetName); } } } CacheResouce(path, ref item, crc, obj); resObj.m_ResItem = item; item.m_Clear = resObj.m_bClear; return(resObj); }
/// <summary> /// 获得这个游戏对象的离线数据,(getCompute耗时) /// </summary> /// <param name="obj"></param> /// <returns></returns> public OffineData FindOffineData(GameObject obj) { ResourceObj resObj = null; if (m_ResourceObjDic.TryGetValue(obj.GetInstanceID(), out resObj) && resObj != null) { return(resObj.m_OffineData); } return(null); }
/// <summary> /// 取消异步加载 /// </summary> /// <param name="guid"></param> public void CancleLoad(long guid) { ResourceObj resObj = null; if (m_AsyncResObjs.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancleLoad(resObj)) { m_AsyncResObjs.Remove(guid); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } }
/// <summary> /// 根据实例化对象直接获取离线数据 /// </summary> /// <param name="obj">GameObject</param> /// <returns></returns> public OfflineData FindOfflineData(GameObject obj) { OfflineData data = null; ResourceObj resObj = null; m_ResourceObjDic.TryGetValue(obj.GetInstanceID(), out resObj); if (resObj != null) { data = resObj.m_OfflineData; } return(data); }
private void btnAdd_Click(object sender, EventArgs e) { var temp = new ResourceObj(); temp.Desciption = tbxDescription.Text; temp.Type = cbxType.SelectedValue.ToString(); temp.Name = tbxName.Text; Resource = temp; DialogResult = System.Windows.Forms.DialogResult.Yes; }
public virtual void FetchCamera() { if (ResourcePrefab.IsInv()) { ResourceObj = CameraObj.GO; } if (ResourceObj != null) { MainCamera = ResourceObj.GetComponent <Camera>(); MainCameraTrans = MainCamera.transform; PostProcessVolume = MainCamera.GetComponentInChildren <PostProcessVolume>(); Callback_OnFetchCamera?.Invoke(MainCamera); } }
/// <summary> /// 对象池中取出obj,没有就新例化一个 同步加载 /// </summary> /// <param name="path">资源路径</param> /// <param name="setSceneObj">是否设置到场景对象池管理位置</param> /// <param name="bClear"></param> /// <param name="targetTransform">实例化到此tranform下</param> /// <returns></returns> public GameObject SpwanObjFromPool(string path, bool setSceneObj = false, bool bClear = true, Transform targetTransform = null) { uint crc = CRC32.GetCRC32(path); ResourceObj resourceObj = GetObjectFromPool(crc); if (resourceObj == null) { resourceObj = m_ResourceObjClassPool.Spawn(true); resourceObj.m_Crc = crc; resourceObj.m_bClear = bClear; //ResourceManager提供加载方法 resourceObj = ResourceManager.Instance.LoadResource(path, resourceObj); if (resourceObj.m_ResItem.m_Obj != null) { resourceObj.m_CloneObj = GameObject.Instantiate(resourceObj.m_ResItem.m_Obj) as GameObject; if (resourceObj.m_CloneObj.GetComponent <OfflineData>() != null) { resourceObj.m_OfflineData = resourceObj.m_CloneObj.GetComponent <OfflineData>(); } } } if (targetTransform != null) { resourceObj.m_CloneObj.transform.SetParent(targetTransform, true); if (resourceObj.m_OfflineData) { resourceObj.m_OfflineData.ResetProp(); } } else { if (setSceneObj) { resourceObj.m_CloneObj.transform.SetParent(SceneTrs, false); } } int tempID = resourceObj.m_CloneObj.GetInstanceID(); if (!m_ResourceObjDic.ContainsKey(tempID)) { m_ResourceObjDic.Add(tempID, resourceObj); } return(resourceObj.m_CloneObj); }
/// <summary> /// 不需要实例化的资源的卸载,根据 ResouceObj /// </summary> /// <param name="resObj"></param> /// <param name="destoryObj"></param> /// <returns></returns> public bool ReleaseResouce(ResourceObj resObj, bool destoryObj = false) { if (resObj == null) { return(false); } ResourceItem item = null; if (!AssetDic.TryGetValue(resObj.crc, out item) || null == item) { Debug.LogError("AssetDic 里不存在该资源:" + resObj.cloneObj.name + " 可能释放了多次"); } GameObject.Destroy(resObj.cloneObj); item.RefCount--; DestoryResouceItme(item, destoryObj); return(true); }
/// <summary> /// 根据ResourceObj卸载资源 /// </summary> /// <param name="resObj"></param> /// <param name="destroyObj"></param> /// <returns></returns> public bool ReleaseResource(ResourceObj resObj, bool destroyObj = false) { if (resObj == null) { return(false); } //return ReleaseResource(resObj.m_CloneObj, destroyObj); ResourceItem item = null; if (!AssetDic.TryGetValue(resObj.m_Crc, out item) || item == null) { Debug.LogError("AssetDic里不存在该资源:" + resObj.m_CloneObj.name); } //? GameObject.Destroy(resObj.m_CloneObj); item.RefCount--; DestroyResourceItem(item, destroyObj); return(true); }
/// <summary> /// 资源加载完成回调 /// </summary> /// <param name="path">路径</param> /// <param name="resObj">中间类</param> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> /// <param name="param3">参数3</param> void OnLoadResourceObjFinish(string path, ResourceObj resObj, object param1 = null, object param2 = null, object param3 = null) { if (resObj == null) { return; } if (resObj.m_ResItem.m_Obj == null) { #if UNITY_EDITOR Debug.LogError("异步资源加载的资源为空:" + path); #endif } else { resObj.m_CloneObj = GameObject.Instantiate(resObj.m_ResItem.m_Obj) as GameObject; resObj.m_OfflineData = resObj.m_CloneObj.GetComponent <OfflineData>(); } //加载完成就从正在加载的异步中移除 if (m_AsyncResObjs.ContainsKey(resObj.m_Guid)) { m_AsyncResObjs.Remove(resObj.m_Guid); } if (resObj.m_CloneObj != null && resObj.m_SetSceneParent) { resObj.m_CloneObj.transform.SetParent(SceneTrs, false); } if (resObj.m_DealFinis != null) { int tempID = resObj.m_CloneObj.GetInstanceID(); if (!m_ResourceObjDic.ContainsKey(tempID)) { m_ResourceObjDic.Add(tempID, resObj); } resObj.m_DealFinis(path, resObj.m_CloneObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3); } }
/// <summary> /// 异步对象加载 /// </summary> /// <param name="path"></param> /// <param name="fealFinish"></param> /// <param name="priority"></param> /// <param name="setSceneObject"></param> /// <param name="param1"></param> /// <param name="param2"></param> /// <param name="param3"></param> /// <param name="bClear"></param> public long InstantiateObjectAsync(string path, OnAsyncObjFinish dealFinish, ELoadResPriority priority, bool setSceneObject = false, object param1 = null, object param2 = null, object param3 = null, bool bClear = true) { if (string.IsNullOrEmpty(path)) { return(0); } uint crc = CRC32.GetCRC32(path); ResourceObj resObj = GetObjectFromPool(crc); if (resObj != null) { if (setSceneObject) { resObj.m_CloneObj.transform.SetParent(SceneTrs, false); } if (dealFinish != null) { dealFinish(path, resObj.m_CloneObj, param1, param2, param3); } return(resObj.m_Guid); } long guid = ResourceManager.Instance.CreateGuid(); m_AsyncResObjs.Add(guid, resObj); resObj = m_ResourceObjClassPool.Spawn(true); resObj.m_Crc = crc; resObj.m_SetSceneParent = setSceneObject; resObj.m_bClear = bClear; resObj.m_DealFinis = dealFinish; resObj.m_Param1 = param1; resObj.m_Param2 = param2; resObj.m_Param3 = param3; //调用ResourceManager的异步加载接口 ResourceManager.Instance.AsyncLoadResource(path, resObj, OnLoadResourceObjFinish, priority); return(guid); }
/// <summary> /// resobj加载完成后回调 /// </summary> /// <param name="path">路径</param> /// <param name="resObj">中间类</param> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> /// <param name="param3">参数3</param> protected void OnLoadResourceObjFinish(string path, ResourceObj resObj) { if (resObj == null) { return; } if (resObj.m_ResourceItem.m_obj == null) { #if UNITY_EDITOR Debug.Log("异步加载的资源为空!" + path); #endif } else { resObj.m_CloneObj = GameObject.Instantiate(resObj.m_ResourceItem.m_obj) as GameObject; resObj.m_OffineData = resObj.m_CloneObj.GetComponent <OffineData>(); } //加载完成后就可以从正在加载列表移除 if (m_AsyncResObjs.ContainsKey(resObj.m_Guid)) { m_AsyncResObjs.Remove(resObj.m_Guid); } if (resObj.m_SetSceneParent) { resObj.m_CloneObj.transform.SetParent(SceenTrs, false); } //resObj.m_OffineData.ResetProp();//还原 //调回调 if (resObj.m_DealFinish != null) { long tempID = resObj.m_CloneObj.GetInstanceID(); if (!m_ResourceObjDic.ContainsKey(tempID)) { m_ResourceObjDic.Add(tempID, resObj); } resObj.m_DealFinish(path, resObj.m_CloneObj, resObj.m_Param1, resObj.m_Param2, resObj.m_Param3); } }
/// <summary> /// 异步加载 /// </summary> /// <param name="path"></param> /// <param name="dealFinish"></param> /// <param name="priority"></param> /// <param name="setSceneObject"></param> /// <param name="param1"></param> /// <param name="param2"></param> /// <param name="param3"></param> /// <param name="bClear"></param> public long InstantiateObject(string path, OnAsyncObjFinish dealFinish, LoadResPriority priority, bool setSceneObject = false, object param1 = null, object param2 = null, object param3 = null, bool bClear = true) { if (string.IsNullOrEmpty(path)) { return(0); } uint crc = Crc.GetCRC32(path); ResourceObj resObj = GetObjectFromPool(crc);//检查缓存中是否存在 if (resObj != null) { if (setSceneObject) { resObj.m_CloneObj.transform.SetParent(SceenTrs); } if (dealFinish != null) { dealFinish(path, resObj.m_CloneObj, param1, param2, param3); } return(resObj.m_Guid); } long guid = ResourceManger.Instance.CreatGuid(); //不存在则创建 resObj = m_ResourceObjClassPool.Spawn(); resObj.m_Crc = crc; resObj.m_DealFinish = dealFinish; resObj.m_bClear = bClear; resObj.m_SetSceneParent = setSceneObject; resObj.m_Param1 = param1; resObj.m_Param2 = param2; resObj.m_Param3 = param3; //resMgr异步加载 ResourceManger.Instance.AsyncLoadResource(path, resObj, OnLoadResourceObjFinish, priority); return(guid); }
/// <summary> /// 查询资源池中是否有对应资源,取得对象 /// </summary> /// <param name="crc"></param> /// <returns></returns> protected ResourceObj GetObjectFromPool(uint crc) { //查询是否已经缓存了资源,如果有直接返回 List <ResourceObj> resourceObjs = null; if (m_ObjectPoolDic.TryGetValue(crc, out resourceObjs) && resourceObjs != null && resourceObjs.Count > 0) { //resMgr引用计数 ResourceManger.Instance.IncreaseResourceRef(crc); //取得缓存的obj ResourceObj resObj = resourceObjs[0]; resourceObjs.RemoveAt(0); GameObject obj = resObj.m_CloneObj; //校验是否为null,比obj == null还快。 if (!System.Object.ReferenceEquals(obj, null)) { resObj.m_Already = false; if (resObj.m_OffineData != null) { resObj.m_OffineData.ResetProp();//还原 } //if(!obj.activeSelf) // obj.SetActive(true); #if UNITY_EDITOR //编辑器模式下为了方便查看,改个名,如果是实机模式下改名消耗gc,所以不改名。 if (obj.name.EndsWith("(Recycle)")) { obj.name = obj.name.Replace("(Recycle)", ""); } #endif } return(resObj); } return(null); }
protected ResourceObj GetObjectFromPool(uint crc) { List <ResourceObj> st = null; if (m_ObjectPoolDict.TryGetValue(crc, out st) && st != null && st.Count > 0) { ResourceObj resObj = st[0]; st.RemoveAt(0); GameObject obj = resObj.m_CloneObj; if (!System.Object.ReferenceEquals(obj, null))//这个比==快 { #if UNITY_EDITOR if (obj.name.EndsWith("(Recycle)")) { obj.name = obj.name.Replace("(Recycle)", ""); } #endif } return(resObj); } return(null); }
/// <summary> /// 资源释放 /// </summary> /// <param name="obj">释放对象</param> /// <param name="maxCacheCount">最大缓冲数量,默认-1无限数量</param> /// <param name="destroyCache">是否清理掉缓存,默认否</param> /// <param name="recycleParent">是否重新放回到回收节点下</param> public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destroyCache = false, bool recycleParent = true) { if (System.Object.ReferenceEquals(obj, null)) { return; } ResourceObj resObj = null; int tempID = obj.GetInstanceID(); if (!m_ResourceObjDic.TryGetValue(tempID, out resObj)) { Debug.Log(obj.name + "对象不是ObjectManager创建的!"); return; } if (resObj == null) { Debug.LogError("缓存的Resourceobj为空"); } if (resObj.m_Already) { Debug.LogError("该对象已经放回对象池了,检查自己是否清空引用!"); return; } #if UNITY_EDITOR obj.name += "(Recycle)"; #endif List <ResourceObj> st = null; if (maxCacheCount == 0) { m_ResourceObjDic.Remove(tempID); ResourceManager.Instance.ReleaseResource(resObj, destroyCache); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } else { if (!m_ObjectPoolDic.TryGetValue(resObj.m_Crc, out st) || st == null) { st = new List <ResourceObj>(); m_ObjectPoolDic.Add(resObj.m_Crc, st); } if (resObj.m_CloneObj) { if (recycleParent) { resObj.m_CloneObj.transform.SetParent(RecyclePoolTrs); } else { resObj.m_CloneObj.SetActive(false); } } if (maxCacheCount < 0 || st.Count < maxCacheCount) { st.Add(resObj); resObj.m_Already = true; ResourceManager.Instance.DecreaseResourceRes(resObj); } else { m_ResourceObjDic.Remove(tempID); ResourceManager.Instance.ReleaseResource(resObj, destroyCache); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } } }
/// <summary> /// 该对象是否是对象池创建的 /// </summary> /// <returns></returns> public bool IsObjectManagerCreate(GameObject obj) { ResourceObj resObj = m_ResourceObjDic[obj.GetInstanceID()]; return(resObj == null ? false : true); }
/// <summary> /// 异步加载 /// ?一直在运行 /// </summary> /// <returns></returns> IEnumerator AsyncLoadCor() { long lastYiledTime = System.DateTime.Now.Ticks; List <AsyncCallBack> callBacks = null; bool hadYiled = false; while (true) { //上一次yield的时间 for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++) { List <AsyncLoadResParam> loadingList = m_LoadingAssetList[i]; if (loadingList.Count <= 0) { continue; } AsyncLoadResParam loadingItem = loadingList[0]; loadingList.RemoveAt(0); callBacks = loadingItem.m_CallBackList; Object obj = null; ResourceItem item = null; #if UNITY_EDITOR if (!m_LoadFromAssetBundle) { obj = LoadAssetByEditor <Object>(loadingItem.m_Path); //模拟异步加载 yield return(new WaitForSeconds(0.5f)); item = AssetBundleManager.Instance.FindResourceItem(loadingItem.m_Crc); } #endif if (obj == null) { item = AssetBundleManager.Instance.LoadResourceAssetBundle(loadingItem.m_Crc); if (item != null && item.m_AssetBundle) { AssetBundleRequest abRequest = null; if (loadingItem.m_Sprite) { abRequest = item.m_AssetBundle.LoadAssetAsync <Sprite>(item.m_AssetName); } else { abRequest = item.m_AssetBundle.LoadAssetAsync(item.m_AssetName); } yield return(abRequest); if (abRequest.isDone) { obj = abRequest.asset; } lastYiledTime = System.DateTime.Now.Ticks; } } CacheResource(loadingItem.m_Path, ref item, loadingItem.m_Crc, obj, callBacks.Count); for (int j = 0; j < callBacks.Count; j++) { AsyncCallBack callBack = callBacks[j]; if (callBack != null && callBack.m_DealFinish != null && callBack.m_ResObj != null) { ResourceObj tempResObj = callBack.m_ResObj; tempResObj.m_ResItem = item; callBack.m_DealFinish(loadingItem.m_Path, tempResObj, tempResObj.m_Param1, tempResObj.m_Param2, tempResObj.m_Param3); callBack.m_DealFinish = null; tempResObj = null; } if (callBack != null && callBack.m_DealObjFinish != null) { callBack.m_DealObjFinish(loadingItem.m_Path, obj, callBack.m_Param1, callBack.m_Param2, callBack.m_Param3); callBack.m_DealObjFinish = null; } callBack.Reset(); m_AsyncCallBackPool.Recycle(callBack); } obj = null; callBacks.Clear(); m_LoadingAssetDic.Remove(loadingItem.m_Crc); loadingItem.Reset(); m_AsyncLoadResParamPool.Recycle(loadingItem); if (System.DateTime.Now.Ticks - lastYiledTime > MAXLOADRESTIME) { yield return(null); lastYiledTime = System.DateTime.Now.Ticks; hadYiled = true; } } if (hadYiled || System.DateTime.Now.Ticks - lastYiledTime > MAXLOADRESTIME) { lastYiledTime = System.DateTime.Now.Ticks; yield return(null); } } }