namespace QFramework { using UnityEngine; using System.Collections; using UnityEngine.Networking; public static class LocalAudioResUtil { public static string ToLocalAudioResName(this string selfFilePath) { return string.Format("LocalAudio:{0}", selfFilePath); } } /// /// 本地音频加载器 /// public class LocalAudioRes : Res { private string mFullPath; private string mHashCode; private object mRawAsset; UnityWebRequest request; public static LocalAudioRes Allocate(string name) { var res = SafeObjectPool.Instance.Allocate(); if (res != null) { res.AssetName = name; res.SetUrl(name.Substring(11)); } return res; } public void SetDownloadProgress(int totalSize, int download) { } public string LocalResPath { get { return string.Format("{0}{1}", AssetBundlePathHelper.PersistentDataPath4Photo, mHashCode); } } public virtual object RawAsset { get { return mRawAsset; } } public bool NeedDownload { get { return RefCount > 0; } } public string Url { get { return mFullPath; } } public int FileSize { get { return 1; } } public void SetUrl(string url) { if (string.IsNullOrEmpty(url)) { return; } mFullPath = url; mHashCode = string.Format("Photo_{0}", mFullPath.GetHashCode()); } public override bool UnloadImage(bool flag) { return false; } public override bool LoadSync() { return false; } public override void LoadAsync() { if (!CheckLoadAble()) { return; } if (string.IsNullOrEmpty(mAssetName)) { return; } DoLoadWork(); } private void DoLoadWork() { State = ResState.Loading; OnDownLoadResult(true); //检测本地文件是否存在 /* if (!File.Exists(LocalResPath)) { ResDownloader.S.AddDownloadTask(this); } else { OnDownLoadResult(true); } */ } protected override void OnReleaseRes() { if (mAsset != null) { GameObject.Destroy(mAsset); mAsset = null; } mRawAsset = null; } public override void Recycle2Cache() { SafeObjectPool.Instance.Recycle(this); } public override void OnRecycled() { } public void DeleteOldResFile() { //throw new NotImplementedException(); } public void OnDownLoadResult(bool result) { if (!result) { OnResLoadFaild(); return; } if (RefCount <= 0) { State = ResState.Waiting; return; } ResMgr.Instance.PushIEnumeratorTask(this); } //完全的WWW方式,Unity 帮助管理纹理缓存,并且效率貌似更高 // TODO:persistantPath 用 read public override IEnumerator DoLoadAsync(System.Action finishCallback) { AudioType type = AudioType.MPEG; if (mFullPath.EndsWith("mp3")) { type = AudioType.MPEG; } else if (mFullPath.EndsWith("ogg")) { type = AudioType.OGGVORBIS; } else if (mFullPath.EndsWith("wav")) { type = AudioType.WAV; } using (UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(mFullPath, type)) { yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError(string.Format("Res:{0}, WWW Errors:{1}", mFullPath, request.error)); OnResLoadFaild(); finishCallback(); yield break; } else { // Convert the downloaded data to an AudioClip AudioClip clip = DownloadHandlerAudioClip.GetContent(request); mAsset = clip; } if (RefCount <= 0) { OnResLoadFaild(); finishCallback(); yield break; } } State = ResState.Ready; finishCallback(); } protected override float CalculateProgress() { if (request == null) { return 0; } return request.downloadProgress; } /* public IEnumerator StartIEnumeratorTask2(Action finishCallback) { if (refCount <= 0) { OnResLoadFaild(); finishCallback(); yield break; } WWW www = new WWW("file://" + LocalResPath); yield return www; if (www.error != null) { Log.E("WWW Error:" + www.error); OnResLoadFaild(); finishCallback(); yield break; } if (!www.isDone) { Log.E("NetImageRes WWW Not Done! Url:" + m_Url); OnResLoadFaild(); finishCallback(); www.Dispose(); www = null; yield break; } if (refCount <= 0) { OnResLoadFaild(); finishCallback(); www.Dispose(); www = null; yield break; } TimeDebugger dt = new TimeDebugger("Tex"); dt.Begin("LoadingTask"); Texture2D tex = www.texture; tex.Compress(true); dt.End(); dt.Dump(-1); m_Asset = tex; www.Dispose(); www = null; resState = eResState.kReady; finishCallback(); } */ } }