| using UnityEngine; | 
| using System.Collections; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.IO; | 
|   | 
| public class LaunchInHot : SingletonMonobehaviour<LaunchInHot> | 
| { | 
|     static int step = 0; | 
|     public static LaunchStage m_CurrentStage = LaunchStage.None; | 
|     public static LaunchProgressInfo progressInfo { get; private set; } | 
|   | 
|     float timer = 0f; | 
|     Queue<LaunchTask> tasks = new Queue<LaunchTask>(); | 
|     LaunchTask currentTask = null; | 
|     bool launchComplete = false; | 
|     float surplusProgress = 0f; | 
|     float surplusTime = 0f; | 
|   | 
|     public Action OnApplicationOut = null; | 
|   | 
|   | 
|     void Start() | 
|     { | 
|         System.Net.ServicePointManager.DefaultConnectionLimit = 100;//设置http最大连接数 | 
|         Application.backgroundLoadingPriority = ThreadPriority.High; | 
|         Screen.sleepTimeout = SleepTimeout.NeverSleep; | 
|   | 
|         SDKUtils.Instance.Init();  //原sdk接口 | 
|         if (!AssetSource.isUseAssetBundle) | 
|         { | 
|             InitSystemMgr(); | 
|   | 
|             //  这里还没开始加载配置 但是提前加载了供LaunchWin使用 | 
|             PriorLanguageConfig.LazyInit(); | 
|             InitialFunctionConfig.LazyInit(); | 
|   | 
|             UIManager.Instance.OpenWindow<LaunchWin>(); | 
|         } | 
|   | 
|   | 
|         var builtInAssetCopyTask = new BuiltInAssetCopyTask(); | 
|         var requestPermissionStart = new RequestPermissionStart(); | 
|         var initSettingTask = new InitSettingTask(); | 
|         var sdkInitedTask = new SDKInitedTask(); | 
|         //var assetCopyTask = new AssetCopyTask(); | 
|         //var assetDecompressTask = new AssetDecompressTask(); | 
|         var getVersionInfoTask = new GetVersionInfoTask(); | 
|         var checkAssetValidTask = new CheckAssetValidTask(); | 
|         var downLoadAssetTask = new DownLoadAssetTask(); | 
|         var assetBundleInitTask = new AssetBundleInitTask(); | 
|         var configInitTask = new ConfigInitTask(); | 
|         var launchFadeOutTask = new LaunchFadeOutTask(); | 
|   | 
|         tasks.Enqueue(builtInAssetCopyTask); | 
|         tasks.Enqueue(requestPermissionStart); | 
|         tasks.Enqueue(initSettingTask); | 
|   | 
|   | 
|         if (!Application.isEditor) | 
|         { | 
|             tasks.Enqueue(sdkInitedTask); | 
|         } | 
|   | 
|         switch (Application.platform) | 
|         { | 
|             case RuntimePlatform.OSXEditor: | 
|             case RuntimePlatform.WindowsEditor: | 
|                 tasks.Enqueue(getVersionInfoTask); | 
|                 break; | 
|             case RuntimePlatform.Android: | 
|                 tasks.Enqueue(getVersionInfoTask); | 
|                 //tasks.Enqueue(assetCopyTask); | 
|                 //tasks.Enqueue(assetDecompressTask); | 
|                 break; | 
|             case RuntimePlatform.IPhonePlayer: | 
|                 tasks.Enqueue(getVersionInfoTask); | 
|                 //tasks.Enqueue(assetCopyTask); | 
|                 break; | 
|             case RuntimePlatform.WindowsPlayer: | 
|                 //tasks.Enqueue(assetCopyTask); | 
|                 tasks.Enqueue(getVersionInfoTask); | 
|                 break; | 
|         } | 
|   | 
|         tasks.Enqueue(checkAssetValidTask); | 
|         tasks.Enqueue(downLoadAssetTask); | 
|         tasks.Enqueue(assetBundleInitTask); | 
|          | 
|         tasks.Enqueue(configInitTask); | 
|         tasks.Enqueue(launchFadeOutTask); | 
|   | 
|         CalculateExpectTotalTime(); | 
|   | 
|     } | 
|   | 
|     public void InitSystemMgr() | 
|     { | 
|         ResManager.Instance.Init(); | 
|         UIManager.Instance.Init(); | 
|         StageManager.Instance.Init(); | 
|         LoginManager.Instance.Init(); | 
|     } | 
|   | 
|     void Update() | 
|     { | 
|         if (!launchComplete) | 
|         { | 
|             if (currentTask == null) | 
|             { | 
|                 if (tasks.Count > 0) | 
|                 { | 
|                     currentTask = tasks.Dequeue(); | 
|                     currentTask.Begin(); | 
|                 } | 
|                 else | 
|                 { | 
|                     launchComplete = true; | 
|                 } | 
|             } | 
|   | 
|             if (currentTask != null) | 
|             { | 
|                 currentTask.Update(); | 
|             } | 
|   | 
|             if (currentTask != null && currentTask.done) | 
|             { | 
|                 currentTask.End(); | 
|                 CalculateExpectTotalTime(); | 
|                 currentTask = null; | 
|             } | 
|   | 
|             if (m_CurrentStage == LaunchStage.DownLoad) | 
|             { | 
|                 progressInfo = new LaunchProgressInfo(m_CurrentStage, 1, progressInfo.totalProgress, 0f); | 
|             } | 
|             else | 
|             { | 
|                 timer += Time.deltaTime; | 
|                 var progress = progressInfo.totalProgress + surplusProgress * (Time.deltaTime / surplusTime); | 
|                 progress = Mathf.Clamp(progress, 0, 0.98f); | 
|   | 
|                 var partProgress = 0f; | 
|                 if (currentTask == null) | 
|                 { | 
|                     partProgress = 0f; | 
|                 } | 
|                 else | 
|                 { | 
|                     var temp = currentTask.timer / Mathf.Min(2f, currentTask.duration); | 
|                     step = (int)temp + 1; | 
|                     partProgress = temp - (int)temp; | 
|                 } | 
|   | 
|                 progressInfo = new LaunchProgressInfo(m_CurrentStage, step, Mathf.Clamp01(progress), partProgress); | 
|             } | 
|         } | 
|   | 
|         // Debug.LogError("currentTask is null " + (currentTask == null).ToString() + " isLaunchComplete " + launchComplete.ToString()); | 
|   | 
|         // if (currentTask != null) | 
|         // { | 
|              | 
|             if (launchComplete) | 
|             { | 
|                 UnityEngine.Debug.LogFormat("启动耗时:{0}", timer); | 
|                 progressInfo = new LaunchProgressInfo(m_CurrentStage, 1, 1f, 1f); | 
|                 this.enabled = false; | 
|   | 
|                 Main.Init(); | 
|                 // StageLoad.Instance.PushSceneLoadCommand(new StageLoad.StageLoadCommand() | 
|                 // { | 
|                 //     toMapId = 1, | 
|                 //     toLineId = 0, | 
|                 //     needEmpty = false, | 
|                 //     needLoadResource = true, | 
|                 //     serverType = ServerType.Main, | 
|                 //     isClientLoadMap = true | 
|                 // }); | 
|             } | 
|         // } | 
|     } | 
|   | 
|     public static int GetLaunchStage() | 
|     { | 
|         return (int)m_CurrentStage; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 计算总的预期时间 | 
|     /// </summary> | 
|     void CalculateExpectTotalTime() | 
|     { | 
|         surplusTime = 0f; | 
|         foreach (var item in tasks) | 
|         { | 
|             surplusTime += item.expectTime; | 
|         } | 
|   | 
|         surplusProgress = 1 - progressInfo.totalProgress; | 
|     } | 
|   | 
|   | 
|     private void OnApplicationQuit() | 
|     { | 
|         OnApplicationOut?.Invoke(); | 
|     } | 
|   | 
|   | 
| } |