| 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 void Decompress(string path) | 
|     { | 
|         var files = new List<FileInfo>(); | 
|         FileExtersion.GetAllDirectoryFileInfos(path, files); | 
|         foreach (var item in files) | 
|         { | 
|             var fullName = item.FullName; | 
|             if (fullName.EndsWith(".7z")) | 
|             { | 
|                 SevenZipUtility.DeCompress(fullName, Path.GetDirectoryName(fullName)); | 
|             } | 
|         } | 
|     } | 
|   | 
|     public static DecompressProgress DecompressAync(string path) | 
|     { | 
|         var progress = new DecompressProgress(); | 
|         var files = new List<FileInfo>(); | 
|         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; | 
|         }); | 
|   | 
|         return progress; | 
|     } | 
|   | 
|     public static void Delete7zFiles(string path) | 
|     { | 
|         var files = new List<FileInfo>(); | 
|         FileExtersion.GetAllDirectoryFileInfos(path, files); | 
|   | 
|         for (var i = files.Count - 1; i >= 0; i--) | 
|         { | 
|             var fullName = files[i].FullName; | 
|             if (fullName.EndsWith(".7z")) | 
|             { | 
|                 files[i].Delete(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     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; | 
|         AssetDeCompressTask.Delete7zFiles(ResourcesPath.Instance.ExternalStorePath); | 
|     } | 
|   | 
|     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; | 
|             } | 
|         } | 
|     } | 
|   | 
| } |