using System.IO; using Thousandto.Update.Enum; using Thousandto.Update.Log; using Thousandto.Update.Trans; namespace Thousandto.Update.Flow { /// /// 1. 转移obb资源, android only /// public class Flow1TransResourceExOBB : BaseFlow { //平台类型 private PlatformType _platformType; //资源转移功能实例 TransResource _transInstance; private string _obbFileFullPath = ""; public void SetExternalData(string sourcePath, PlatformType type, Thousandto.Update.Delegate.TransResourceFinishCallback transFinishCallback = null) { _platformType = type; switch (_platformType) { case PlatformType.Android: _transInstance = new TransAndroidResource(); break; case PlatformType.IOS: _transInstance = new TransIOSResource(); break; case PlatformType.Windows: _transInstance = new TransPCResource(); break; default: _transInstance = new TransPCResource(); break; } _obbFileFullPath = GetObbFullPath(sourcePath); UpdateLog.DEBUG_LOG("Obb full path:" + _obbFileFullPath); //全转移 _transInstance.IsUnZipObb = true; _transInstance.SetUnzipPath(_obbFileFullPath, _storeDir, transFinishCallback); } public void ReInitTransData() { if (_transInstance != null) _transInstance.ReInit(); } //强制转移资源,因为要更新资源,不管是基础资源还是补丁资源 public void ForceTransWhenNeedUpdate() { } //强制做资源释放, 在ios通过游戏内更新分段资源时调用 public void SetForceUnzip() { } public override void OnEnter(BaseFlow oldFlow) { base.OnEnter(oldFlow); //转移过资源,xml就从storePath取。否则从包内取 ChangeLocalXmlPath(HasTransedResource()); } public override int Work() { if (!CheckLastFlowResult()) return LastFlowResult; int ret = CodeDefine.RET_INIT; if (!checkNeedTrans()) { ret = CodeDefine.RET_SUCCESS; } else { if (!string.IsNullOrEmpty(_obbFileFullPath) && File.Exists(_obbFileFullPath)) { //转移资源完成后调用 _transInstance.SetInternalCallback(() => { File.Delete(_obbFileFullPath); }); _transInstance.StartUnzipByThread(); bool success = _transInstance.GetTransReslult(); ret = success ? CodeDefine.RET_SUCCESS : CodeDefine.RET_FAIL_TRANS_FAIL; _transInstance.CallFinish(success); } else ret = CodeDefine.RET_SUCCESS; } return ret; } public override void Uninitialize() { LocalXml = null; } public override void GetCurDownInfo(out string url, out int total, out int downloaded) { base.GetCurDownInfo(out url, out total, out downloaded); url = ""; total = _transInstance.GetTotalValue(); downloaded = _transInstance.GetCurrentProgress(); } public void TransResourceFinish(bool result) { } //判断是否需要转移资源 private bool checkNeedTrans() { bool ret = false; if (_platformType != PlatformType.Android) return ret; return !string.IsNullOrEmpty(_obbFileFullPath) && File.Exists(_obbFileFullPath); } private string GetObbFullPath(string storePath) { string obbPath = storePath.Replace("/data/", "/obb/").Replace("files/StreamingAssets", ""); UpdateLog.DEBUG_LOG("obb root path:" + obbPath); if(Directory.Exists(obbPath)) { var files = Directory.GetFiles(obbPath, "*.obb"); if (files.Length > 0) return files[0]; } return null; } } }