using UnityEngine; using System.Text; using CommonUI_Unity3D.Impl; namespace CommonUnity3D.XMUnity.LoadUtil { public class XMUnityAssetBundleLoader : XMUnityLoadIml { public enum XMUnityLoadType { MPQ, WWW } private static XMUnityLoadType mLoadType = XMUnityLoadType.WWW; private AssetBundle mAB = null; private string mErrorLog = null; private bool mHasDone = false; //System.Diagnostics.Stopwatch sw; #region 3w模式. private WWW m3W = null; private string url; #endregion #region MPQ模式. private AssetBundleCreateRequest mABRequest = null; #endregion public static void SetLoadType(XMUnityLoadType type) { mLoadType = type; } public override float GetProgress() { if(mHasDone) { return 1; } switch(mLoadType) { case XMUnityLoadType.WWW: return m3W.progress; case XMUnityLoadType.MPQ: if(!mLoadAsync) { if(mAB != null) { return 1; } else { return 0; } } else { return mABRequest.progress; } } return 0; } public override bool IsLoadFinish() { if(mHasDone) { return mHasDone; } switch(mLoadType) { case XMUnityLoadType.WWW: if(m3W.isDone) { OnLoadFinish(); return true; } break; case XMUnityLoadType.MPQ: if(!mLoadAsync) { return mHasDone; } else { if(mABRequest != null && mABRequest.isDone) { OnLoadFinish(); return true; } } break; } return false; } public override void Load(string url) { //sw = System.Diagnostics.Stopwatch.StartNew(); this.url = url; StringBuilder sb = new StringBuilder(); sb.Length = 0; sb.Append("mpq://"); sb.Append(url); switch(mLoadType) { case XMUnityLoadType.WWW: m3W = new WWW(url); break; case XMUnityLoadType.MPQ: url = sb.ToString(); if(!mLoadAsync) { mAB = UnityDriver.UnityInstance.LoadAssetBundleImmediate(url); mHasDone = true; if(mAB == null) { mErrorLog = "LoadAssetBundleImmediate Error"; } } else { mABRequest = UnityDriver.UnityInstance.LoadAssetBundle(url); if(mABRequest == null) { mErrorLog = "LoadAssetBundle Error: " + url; mHasDone = true; } } break; } } public override string GetErrorLog() { return mErrorLog; } public override bool IsLoadError() { if(!string.IsNullOrEmpty(mErrorLog)) { return true; } switch(mLoadType) { case XMUnityLoadType.WWW: if(m3W.error != null) { mErrorLog = m3W.error.ToString() + m3W.url; mHasDone = true; } return !string.IsNullOrEmpty(mErrorLog); case XMUnityLoadType.MPQ: return !string.IsNullOrEmpty(mErrorLog); } return false; } public override AssetBundle GetAssetBundle() { switch(mLoadType) { case XMUnityLoadType.WWW: return mAB; case XMUnityLoadType.MPQ: return mAB; } return null; } public override void Dispose() { mHasDone = true; if(m3W != null) { m3W.Dispose(); m3W = null; } if(mABRequest != null) { mABRequest = null; } mAB = null; } protected virtual void OnLoadFinish() { if(!string.IsNullOrEmpty(mErrorLog)) { mAB = null; m3W.Dispose(); } else { switch(mLoadType) { case XMUnityLoadType.WWW: mAB = m3W.assetBundle; m3W.Dispose(); break; case XMUnityLoadType.MPQ: if(mLoadAsync) { mAB = mABRequest.assetBundle as AssetBundle; } break; } } //sw.Stop(); //Debug.LogError("[yyyyyyyyyyyyyyyy] " + url.ToString() + " "+sw.ElapsedMilliseconds/1000f); mHasDone = true; } } }