protected override void Init(string url, params object[] args) { #if UNITY_5 PreLoadManifest(); #endif base.Init(url); _loaderMode = (LoaderMode)args[0]; if (NewAssetBundleLoaderEvent != null) { NewAssetBundleLoaderEvent(url); } RelativeResourceUrl = url; KResourceManager.LogRequest("AssetBundle", RelativeResourceUrl); var resMgr = AppFacade.Instance.GetManager <KResourceManager>(); if (resMgr != null) { resMgr.StartCoroutine(LoadAssetBundle(url)); } }
private IEnumerator _Init(string path, LoaderMode loaderMode) { IsLoadAssetBundle = EngineConfig.instance.IsLoadAssetBundle; Object getAsset = null; if (IsEditorLoadAsset) { #if UNITY_EDITOR if (path.EndsWith(".unity")) { // scene getAsset = AppFacade.Instance.GetManager <KResourceManager>(); Log.LogWarning("Load scene from Build Settings: {0}", path); } else { getAsset = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/" + EngineConfig.instance.ResourcesBuildDir + "/" + path, typeof(UnityEngine.Object)); if (getAsset == null) { Log.Error("Asset is NULL(from {0} Folder): {1}", EngineConfig.instance.ResourcesBuildDir, path); } } #else Log.Error("`IsEditorLoadAsset` is Unity Editor only"); #endif OnFinish(getAsset); } else if (!IsLoadAssetBundle) { string extension = Path.GetExtension(path); path = path.Substring(0, path.Length - extension.Length); // remove extensions getAsset = Resources.Load <Object>(path); if (getAsset == null) { Log.Error("Asset is NULL(from Resources Folder): {0}", path); } OnFinish(getAsset); } else { _bundleLoader = AssetBundleLoader.Load(path, null, loaderMode); while (!_bundleLoader.IsCompleted) { if (IsReadyDisposed) // 中途释放 { _bundleLoader.Release(); OnFinish(null); yield break; } yield return(null); } if (!_bundleLoader.IsSuccess) { Log.Error("[AssetFileLoader]Load BundleLoader Failed(Error) when Finished: {0}", path); _bundleLoader.Release(); OnFinish(null); yield break; } var assetBundle = _bundleLoader.Bundle; DateTime beginTime = DateTime.Now; #if UNITY_5 // Unity 5 下,不能用mainAsset, 要取对象名 var abAssetName = Path.GetFileNameWithoutExtension(Url).ToLower(); if (!assetBundle.isStreamedSceneAssetBundle) { if (loaderMode == LoaderMode.Sync) { getAsset = assetBundle.LoadAsset(abAssetName); Debuger.Assert(getAsset); } else { var request = assetBundle.LoadAssetAsync(abAssetName); while (!request.isDone) { yield return(null); } Debuger.Assert(getAsset = request.asset); } } else { // if it's a scene in asset bundle, did nothing // but set a fault Object the result getAsset = AppFacade.Instance.GetManager <KResourceManager>(); } #else // 经过AddWatch调试,.mainAsset这个getter第一次执行时特别久,要做序列化 //AssetBundleRequest request = assetBundle.LoadAsync("", typeof(Object));// mainAsset //while (!request.isDone) //{ // yield return null; //} try { Debuger.Assert(getAsset = assetBundle.mainAsset); } catch { Log.Error("[OnAssetBundleLoaded:mainAsset]{0}", path); } #endif KResourceManager.LogLoadTime("AssetFileBridge", path, beginTime); if (getAsset == null) { Log.Error("Asset is NULL: {0}", path); } } if (Application.isEditor) { if (getAsset != null) { KResoourceLoadedAssetDebugger.Create(getAsset.GetType().Name, Url, getAsset as Object); } // 编辑器环境下,如果遇到GameObject,对Shader进行Fix if (getAsset is GameObject) { var go = getAsset as GameObject; foreach (var r in go.GetComponentsInChildren <Renderer>(true)) { RefreshMaterialsShaders(r); } } } if (getAsset != null) { // 更名~ 注明来源asset bundle 带有类型 getAsset.name = String.Format("{0}~{1}", getAsset, Url); } OnFinish(getAsset); }
private IEnumerator CoLoad(string url) { var resMgr = AppFacade.Instance.GetManager <KResourceManager>(); if (resMgr == null) { yield break; } var getResPathType = KResourceManager.GetResourceFullPath(url, _loaderMode == LoaderMode.Async, out _fullUrl); if (getResPathType == KResourceManager.GetResourceFullPathType.Invalid) { if (EngineConfig.instance.IsDebugMode) { Log.Error("[HotBytesLoader]Error Path: {0}", url); } OnFinish(null); yield break; } if (_loaderMode == LoaderMode.Sync) { // 存在应用内的,StreamingAssets内的,同步读取;否则去PersitentDataPath if (getResPathType == KResourceManager.GetResourceFullPathType.InApp) { if (Application.isEditor) // Editor mode : 读取Product配置目录 { var loadSyncPath = Path.Combine(KResourceManager.BundlesPathWithoutFileProtocol, url); Bytes = File.ReadAllBytes(loadSyncPath); } else // product mode: read streamingAssetsPath { Bytes = KResourceManager.LoadSyncFromStreamingAssets(KResourceManager.BundlesPathRelative + url); } } else { Bytes = File.ReadAllBytes(_fullUrl); } } else { _wwwLoader = KWWWLoader.Load(_fullUrl); while (!_wwwLoader.IsCompleted) { Progress = _wwwLoader.Progress; yield return(null); } if (!_wwwLoader.IsSuccess) { //if (AssetBundlerLoaderErrorEvent != null) //{ // AssetBundlerLoaderErrorEvent(this); //} Log.Error("[HotBytesLoader]Error Load WWW: {0}", url); OnFinish(null); yield break; } Bytes = _wwwLoader.Www.bytes; } OnFinish(Bytes); }
/// <summary> /// 协和加载Assetbundle,加载完后执行callback /// </summary> /// <param name="url">资源的url</param> /// <param name="callback"></param> /// <param name="callbackArgs"></param> /// <returns></returns> private IEnumerator CoLoad(string url) { KResourceManager.LogRequest("WWW", url); System.DateTime beginTime = System.DateTime.Now; // 潜规则:不用LoadFromCache~它只能用在.assetBundle Www = new WWW(url); BeginLoadTime = Time.time; WWWLoadingCount++; //设置AssetBundle解压缩线程的优先级 Www.threadPriority = Application.backgroundLoadingPriority; // 取用全局的加载优先速度 while (!Www.isDone) { Progress = Www.progress; yield return(null); } yield return(Www); WWWLoadingCount--; Progress = 1; if (IsReadyDisposed) { Log.Error("[KWWWLoader]Too early release: {0}", url); OnFinish(null); yield break; } if (!string.IsNullOrEmpty(Www.error)) { if (Application.platform == RuntimePlatform.Android) { // TODO: Android下的错误可能是因为文件不存在! } string fileProtocol = KResourceManager.GetFileProtocol(); if (url.StartsWith(fileProtocol)) { string fileRealPath = url.Replace(fileProtocol, ""); Log.Error("File {0} Exist State: {1}", fileRealPath, System.IO.File.Exists(fileRealPath)); } Log.Error("[KWWWLoader:Error]{0} {1}", Www.error, url); OnFinish(null); yield break; } else { KResourceManager.LogLoadTime("WWW", url, beginTime); if (WWWFinishCallback != null) { WWWFinishCallback(url); } Desc = string.Format("{0}K", Www.bytes.Length / 1024f); OnFinish(Www); } // 预防WWW加载器永不反初始化, 造成内存泄露~ if (Application.isEditor) { while (GetCount <KWWWLoader>() > 0) { yield return(null); } yield return(new WaitForSeconds(5f)); while (!IsReadyDisposed) { Log.Error("[KWWWLoader]Not Disposed Yet! : {0}", this.Url); yield return(null); } } }