using System; using System.Collections.Generic; using System.IO; using UnityEngine; public class AssetCopyTask : LaunchTask { int completedCount = 0; int totalCount = -1; List copyTasks = new List(); public override float expectTime { get { return LocalSave.GetFloat("AssetCopyTask_ExpectTime", 70f); } protected set { LocalSave.SetFloat("AssetCopyTask_ExpectTime", value); } } public override void Begin() { LaunchInHot.m_CurrentStage = LaunchStage.AssetCopy; duration = Mathf.Max(0.5f, expectTime); outTime = 50f; if (Application.isEditor) { done = true; } else { switch (Application.platform) { case RuntimePlatform.Android: AndroidCopyAsset(); break; case RuntimePlatform.IPhonePlayer: IOSCopyAsset(); break; case RuntimePlatform.WindowsPlayer: StandaloneCopyAsset(); break; } } } public override void End() { expectTime = timer; Debug.LogFormat("{0}执行时长:{1};", this.GetType().Name, timer); if (!Application.isEditor) { switch (Application.platform) { case RuntimePlatform.Android: AndroidProcessCopyComplete(); break; case RuntimePlatform.IPhonePlayer: IOSProcessCopyComplete(); break; } } } public override void Update() { if (done) { return; } timer += Time.deltaTime; if (!Application.isEditor) { switch (Application.platform) { case RuntimePlatform.Android: AndroidWaitCopyAssetComplete(); break; case RuntimePlatform.IPhonePlayer: case RuntimePlatform.WindowsPlayer: IOSorStandaloneWaitCopyAssetComplete(); break; } } ExceptionReport(); } private void AndroidCopyAsset() { switch (VersionConfig.Get().assetAccess) { case InstalledAsset.FullAsset: case InstalledAsset.HalfAsset: case InstalledAsset.IngoreDownLoad: if (!SDKUtils.Instance.AssetCopyFinished) { SDKUtils.Instance.CopyAsset(); done = false; progress = 0f; } else { done = true; } break; case InstalledAsset.NullAsset: done = true; break; } } private void IOSCopyAsset() { if (VersionUtility.Instance.versionInfo != null && VersionUtility.Instance.versionInfo.downAsset == 1) { switch (VersionConfig.Get().assetAccess) { case InstalledAsset.FullAsset: case InstalledAsset.HalfAsset: case InstalledAsset.IngoreDownLoad: if (!SDKUtils.Instance.AssetCopyFinished) { copyTasks = new List(); FileExtersion.GetAllDirectoryFileInfos(ResourcesPath.Instance.StreamingAssetPath, copyTasks); for (var i = copyTasks.Count - 1; i >= 0; i--) { var fileInfo = copyTasks[i]; var destPath = fileInfo.FullName.Replace(ResourcesPath.Instance.StreamingAssetPath, ResourcesPath.Instance.ExternalStorePath); if (File.Exists(destPath)) { copyTasks.RemoveAt(i); } } completedCount = 0; totalCount = copyTasks.Count; } if (totalCount > 0) { done = false; progress = 0f; } else { done = true; } break; case InstalledAsset.NullAsset: done = true; break; } } else { done = true; } } private void StandaloneCopyAsset() { if (VersionUtility.Instance.versionInfo != null && VersionUtility.Instance.versionInfo.downAsset == 1) { switch (VersionConfig.Get().assetAccess) { case InstalledAsset.FullAsset: case InstalledAsset.HalfAsset: case InstalledAsset.IngoreDownLoad: copyTasks = new List(); FileExtersion.GetAllDirectoryFileInfos(ResourcesPath.Instance.StreamingAssetPath, copyTasks); for (var i = copyTasks.Count - 1; i >= 0; i--) { var fileInfo = copyTasks[i]; var destPath = fileInfo.FullName.Replace(ResourcesPath.Instance.StreamingAssetPath, ResourcesPath.Instance.ExternalStorePath); if (File.Exists(destPath)) { copyTasks.RemoveAt(i); } } completedCount = 0; totalCount = copyTasks.Count; if (totalCount > 0) { done = false; progress = 0f; } else { done = true; } break; case InstalledAsset.NullAsset: done = true; break; } } else { done = true; } } private void AndroidWaitCopyAssetComplete() { if (!SDKUtils.Instance.AssetCopyFinished) { done = false; progress = timer / duration; } else { done = true; } } private void IOSorStandaloneWaitCopyAssetComplete() { if (totalCount > 0) { if (completedCount < totalCount) { var fileInfo = copyTasks[0]; var destPath = fileInfo.FullName.Replace(ResourcesPath.Instance.StreamingAssetPath, ResourcesPath.Instance.ExternalStorePath); var destDirectoryName = Path.GetDirectoryName(destPath); if (!Directory.Exists(destDirectoryName)) { Directory.CreateDirectory(destDirectoryName); } Debug.LogFormat("拷贝文件:{0}", fileInfo.Name); File.Copy(fileInfo.FullName, destPath, true); copyTasks.RemoveAt(0); completedCount++; done = false; progress = (float)completedCount / totalCount; } else { done = true; } } else { done = true; } } private void AndroidProcessCopyComplete() { } private void IOSProcessCopyComplete() { LocalSave.SetString("AssetCopyCompleted_IOSorStandalone", VersionConfig.Get().version); } }