/// <summary> /// 同步加载资源 /// </summary> /// <param name="ResObj">资源实例</param> private void LoadResource(ResObj resource) { //找配置 ResPackInfo packInfo = GetResPackInfo(resource); if (packInfo != null) { if (packInfo.GetPackType() == (byte)ResPackType.ResPackTypeBundle) { BundlePackInfo pi = packInfo as BundlePackInfo; //跟随Resource if (!pi.Outside && pi.IsNoBundle()) { // load from Resources resource.Load(); } else { // load from bundle // load bundle BundleService.GetInstance().LoadSync(pi); // load asset from bundle AssetBundle bundle = BundleService.GetInstance().GetBundle(packInfo.Path); if (bundle != null) { if (string.IsNullOrEmpty(resource.Ext)) { resource.Ext = pi.GetResExt(resource.Path); } resource.Load(bundle); } else { JW.Common.Log.LogE("Loading bundle failed for path:{0}, bundle path:{1}", resource.Path, packInfo.Path); } } } else { //二进制类型 直接根据文件路径 获取 resource.Load(packInfo.Path, packInfo.IsOutside(resource.Path)); } } else { //不从属于任何资源包, 从Resources目录下读取 Editor模式 或者保护为未打包的 resource.Load(); } }
/// <summary> /// 异步加载资源 /// </summary> /// <param name="path">资源路径</param> /// <returns></returns> public ResObjRequest GetResourceAsync(string path) { if (string.IsNullOrEmpty(path)) { return(null); } // request ResObjRequest rr = new ResObjRequest(); // complete loading Action <ResObj> complete = (ResObj r) => { // try repaire //if (r.Content is GameObject) //{ // _repaireMachine.Repaire(r.Content as GameObject); //} rr.isDone = true; rr.resource = r; }; // loading progress Action <float> progress = (float prog) => { rr.progress = prog; }; // cache ResObj resource = _resCache.Add(path); if (resource.Content != null) { //cache包含直接返回 complete(resource); return(rr); } // real loading ResPackInfo packInfo = GetResPackInfo(resource); if (packInfo != null) { //打包的资源AssetBundle if (packInfo.GetPackType() == (byte)ResPackType.ResPackTypeBundle) { //AssetBundle 信息 BundlePackInfo pi = packInfo as BundlePackInfo; //补充扩展名 if (string.IsNullOrEmpty(resource.Ext)) { resource.Ext = pi.GetResExt(resource.Path); } // AssetBundle 缓存 AssetBundle bundle = BundleService.GetInstance().GetBundle(packInfo.Path); if (bundle == null) { //不在外且跟随Resource出档了 if (!pi.Outside && pi.IsNoBundle()) { // in Resources StartCoroutine(resource.LoadAsync(complete, progress)); } else { // load bundle first StartCoroutine(BundleService.GetInstance().LoadAsync(pi, delegate(BundleRef bundleRef) { if (bundleRef != null && bundleRef.Bundle != null) { bundle = bundleRef.Bundle; //从asset bundle 加载 StartCoroutine(resource.LoadAsync(bundle, complete, progress)); } else { JW.Common.Log.LogE("Async loading bundle failed, resource:{0}, bundle:{1}", path, packInfo.Path); complete(null); _resCache.Remove(resource, true); } }, delegate(BundlePackInfo failedPackInfo, string error) { JW.Common.Log.LogE("Load bundle failed, error:{0}", error); complete(null); _resCache.Remove(resource, true); })); } } else { // bundle is exists // 增加引用计数 BundleService.GetInstance().LoadSync(pi); // 加载 StartCoroutine(resource.LoadAsync(bundle, complete, progress)); } } else { //二进制文件包异步获取 StartCoroutine(resource.LoadAsync(packInfo.Path, packInfo.IsOutside(resource.Path), complete, progress)); } } else { // 非IFS 打包资源,从Resources目录异步读取 //JW.Common.Log.LogD("Load From Resource Async:"+ path); StartCoroutine(resource.LoadAsync(complete, progress)); } return(rr); }