/// <summary> /// 真正加载的地方 /// </summary> /// <param name="path"></param> /// <param name="dp"></param> /// <param name="cb"></param> /// <param name="obj"></param> /// <returns></returns> void SynLoadAssets(string path, bool dp, object obj, LoadComplete cb) { if (mNameMD5Dic.ContainsKey(path)) { VersionAssetData vad = mNameMD5Dic[path]; string url = GetAssetsFilePath(vad.path, vad.md5); AssetBundle ab = null; if (!dp) { // 作为主资源加载的 AssetsBundleData abd = null; if (mAssetsABDic.ContainsKey(path))//已经被加载过 计数器自增 { abd = mAssetsABDic[path]; abd.depIndex += 1; ab = abd.ab; } else { // 新加载的 ab = AssetBundle.LoadFromFile(url); abd = new AssetsBundleData(); abd.name = path; abd.depIndex = 1; abd.ab = ab; mAssetsABDic.Add(path, abd); } string[] dpAbs = mMainManifest.GetAllDependencies(path); //取这个资源的所有依赖资源 #region if (dpAbs != null && dpAbs.Length == 0) //没有依赖 获取资源 { UnityEngine.Object o = GetObj(ab, path); if (cb != null) { cb.Invoke(o, obj); } } #endregion #region else { //存在依赖资源 #region for (int i = 0; i < dpAbs.Length; i++) { if (mAssetsABDic.ContainsKey(dpAbs[i])) { // 依赖计数器中已经存在了 计数器+1 abd = mAssetsABDic[dpAbs[i]]; abd.depIndex += 1; } else { SynLoadAssets(dpAbs[i], true, obj, cb); } } //依赖都加载完毕了 再看主资源 UnityEngine.Object o = GetObj(ab, path); if (cb != null) { cb.Invoke(o, obj); } #endregion } } #endregion else { // 作为被依赖资源下载 AssetsBundleData abd = null; if (mAssetsABDic.ContainsKey(path)) { abd = mAssetsABDic[path]; abd.depIndex += 1; } else//被依赖的 缓存 { ab = AssetBundle.LoadFromFile(url); abd = new AssetsBundleData(); abd.name = path; abd.depIndex = 1; abd.ab = ab; mAssetsABDic.Add(path, abd); } } } else { Debug.LogError("cannot find:" + path); } }