using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Threading; public class AssetDeCompressTask { public static string assetDeCompressVersion { get { return LocalSave.GetString("AssetDeCompressVersion"); } set { LocalSave.SetString("AssetDeCompressVersion", value); } } public static bool assetDeCompressCompleted { get { if (string.IsNullOrEmpty(assetDeCompressVersion)) { return false; } else { return assetDeCompressVersion == VersionConfig.Get().version; } } } public static DecompressProgress DecompressAync(string path) { var progress = new DecompressProgress(); // var files = new List(); // FileExtersion.GetAllDirectoryFileInfos(path, files); // for (var i = files.Count - 1; i >= 0; i--) // { // var fullName = files[i].FullName; // if (!fullName.EndsWith(".7z")) // { // files.RemoveAt(i); // } // } // var total = files.Count; // if (total == 0) // { // progress.progress = 1f; // progress.done = true; // return progress; // } // ThreadPool.QueueUserWorkItem((object a) => // { // var index = 0; // foreach (var item in files) // { // var fullName = item.FullName; // if (fullName.EndsWith(".7z")) // { // SevenZipUtility.DeCompress(fullName, Path.GetDirectoryName(fullName)); // index++; // progress.progress = index / (float)total; // } // } // progress.done = true; // }); progress.done = true; return progress; } public class DecompressProgress { object progressLock = new object(); float m_Progress = 0f; public float progress { get { return m_Progress; } set { lock (progressLock) { m_Progress = value; } } } object doneLock = new object(); bool m_Done = false; public bool done { get { return m_Done; } set { lock (doneLock) { m_Done = value; } } } } } public class AssetDecompressTask : LaunchTask { public override float expectTime { get { return LocalSave.GetFloat("AssetDecompressTask_ExpectTime", 5f); } protected set { LocalSave.SetFloat("AssetDecompressTask_ExpectTime", value); } } AssetDeCompressTask.DecompressProgress deCompressProgress = null; float waitTimer = 0f; public override void Begin() { LaunchInHot.m_CurrentStage = LaunchStage.AssetDecompress; duration = Mathf.Max(0.5f, expectTime); if (!AssetDeCompressTask.assetDeCompressCompleted) { deCompressProgress = AssetDeCompressTask.DecompressAync(ResourcesPath.Instance.ExternalStorePath); done = false; } else { done = true; } } public override void End() { AssetDeCompressTask.assetDeCompressVersion = VersionConfig.Get().version; } public override void Update() { if (done) { return; } timer += Time.deltaTime; progress = timer / duration; if (deCompressProgress == null || deCompressProgress.done) { waitTimer += Time.deltaTime; if (waitTimer > 2f) { done = true; } } } }