/// <summary> /// 计算资源回调,他们的res和cofig是一样的,只是userdataobj与回调不一样 /// </summary> /// <param name="res"></param> /// <param name="config"></param> /// <param name="callBack"></param> /// <param name="userDataObj"></param> private static void GeneratePrefabCallBack(ResNode res, UnionResConfigData config, System.Action <ResConfigData, ResNode, System.Object> callBack, System.Object userDataObj) { List <AsyncLoadingObject> requestObjList = null; AsyncLoadingObject AnsycObj = BuildCallBackObj(res, config, callBack, userDataObj); if (m_PrefabRequestTable.TryGetValue(res.instanceID, out requestObjList)) { requestObjList.Add(AnsycObj); } else { requestObjList = new List <AsyncLoadingObject>(); requestObjList.Add(AnsycObj); m_PrefabRequestTable.Add(res.instanceID, requestObjList); } }
/// <summary> /// 更新预制体的加载进度 /// </summary> private static void UpdatePrefabAsyncLoadingProgress() { AsyncDependenicesLoadCompleteList.Clear(); AsyncDependenicesLoadInValidList.Clear(); foreach (KeyValuePair <int, List <ResNode> > pair in m_DependenicesRequestTable) { List <ResNode> nodList = pair.Value; bool isLoadFinish = true; bool isHaveInvalidNode = false; foreach (ResNode nod in nodList) { if (!nod.isLoadFinish) { isLoadFinish = false; break; } else { if (!nod.IsValid()) { isHaveInvalidNode = true; } } } if (isLoadFinish) { AsyncDependenicesLoadCompleteList.Add(pair.Key); if (isHaveInvalidNode) { AsyncDependenicesLoadInValidList.Add(pair.Key); } } } foreach (int s in AsyncDependenicesLoadCompleteList) { m_DependenicesRequestTable[s].Clear(); m_DependenicesRequestTable[s] = null; m_DependenicesRequestTable.Remove(s); ////依赖加载完了之后,发现预制已经不需要了,直接卸载依赖 //if (m_NeedToDeletePrefab.Contains(s)) //{ // UnLoadDependenicesAsync(s); // m_NeedToDeletePrefab.Remove(s); // continue; //} List <AsyncLoadingObject> list = m_PrefabRequestTable[s]; if (m_AsyncLoadingDependicensPrefabResNode.ContainsKey(s)) { m_AsyncLoadingDependicensPrefabResNode.Remove(s); } //发现加载的依赖项有无效的资源节点,那么不进行下面的预制体本体加载 //但是,还是要进行回调,因为这个是属于加载失败. if (AsyncDependenicesLoadInValidList.Contains(s)) { m_PrefabRequestTable.Remove(s); UnLoadDependenicesAsync(s); ResNode res = AllocResNode(list[0].loadingResInstanceID); m_PrefabResTable.Add(s, res); res.status = ResNodeStatus.LoadFinish; foreach (AsyncLoadingObject obj in list) { obj.callBack(obj.configData, res, obj.UserDataObj); } list.Clear(); continue; } AsyncLoadingObject alo = list[0]; ResNode loadingResNode = AllocResNode(alo.loadingResInstanceID); UnionResConfigData config = alo.configData as UnionResConfigData; GetPrefabResourceAsync(ref loadingResNode, config, PrefabResourceCallBack, config.priority); list[0] = alo; } }