//加载GameInit模块 private IEnumerator GameInitPackages(string GameInitTable) { StringSpliter sp = new StringSpliter(GameInitTable, '\n'); if (sp.Count >= 1) { int loadedCount = 0; string[] args; GameLogger.Log(TAG, "Gameinit table : {0}", sp.Count); foreach (string ar in sp.Result) { if (ar.StartsWith(":")) { continue; } bool required = false; string packageName = ""; GameModRunMask mask = GameModRunMask.GameBase; args = ar.Split(':'); if (args.Length >= 3) { required = args[2] == "Required"; packageName = args[0]; System.Enum.TryParse(args[1], out mask); } bool modNeedRun = (mask & currentLoadMask) != GameModRunMask.None; //状态 loadedCount++; GameInitSetUIProgressValue(loadedCount / (float)sp.Count * 0.6f); UIProgressText.text = "Loading " + packageName; //加载 GameMod mod = ModManager.LoadGameModByPackageName(packageName, modNeedRun); if (mod != null) { mod.IsModInitByGameinit = true; yield return(new WaitUntil(mod.IsLoadComplete)); } if ((mod == null || (modNeedRun && mod.LoadStatus != GameModStatus.InitializeSuccess)) && required) { GameErrorManager.ThrowGameError(GameError.GameInitPartLoadFailed, "加载模块 " + packageName + " 时发生错误"); } } } UIProgressText.text = "Loading"; GameInitSetUIProgressValue(0.6f); }
//加载主函数 private IEnumerator GameInitCore() { GameLogger.Log(TAG, "Gameinit start"); yield return(new WaitUntil(IsGameInitUILoaded)); //播放音乐和动画 if (GameManager.Mode == GameMode.Game) { IntroAnimator.Play("IntroAnimation"); IntroAudio.Play(); } //选择加载包模式 switch (GameManager.Mode) { case GameMode.Game: currentLoadMask = GameModRunMask.GameBase; break; case GameMode.Level: currentLoadMask = GameModRunMask.Level | GameModRunMask.LevelLoader; break; case GameMode.LevelEditor: currentLoadMask = GameModRunMask.LevelEditor | GameModRunMask.Level; break; case GameMode.MinimumDebug: currentLoadMask = GameModRunMask.GameBase; break; case GameMode.LoaderDebug: currentLoadMask = GameModRunMask.Level | GameModRunMask.LevelLoader; break; case GameMode.CoreDebug: currentLoadMask = GameModRunMask.GameCore; break; } UIProgressText.text = "Loading"; //加载 core.gameinit.txt 获得要加载的模块 string gameInitTxt = ""; #if UNITY_EDITOR // 编辑器中直接加载 TextAsset gameInitEditorAsset = null; if (DebugSettings.Instance.GameInitLoadInEditor && (gameInitEditorAsset = UnityEditor.AssetDatabase.LoadAssetAtPath <TextAsset>( GamePathManager.DEBUG_MOD_FOLDER + "/core.gameinit.txt")) != null) { gameInitTxt = gameInitEditorAsset.text; GameLogger.Log(TAG, "Load gameinit table in Editor : \n" + gameInitTxt); } #else if (false) { } #endif else { //加载 gameinit string gameinit_txt_path = GamePathManager.GetResRealPath("gameinit", ""); UnityWebRequest request = UnityWebRequest.Get(gameinit_txt_path); yield return(request.SendWebRequest()); if (!string.IsNullOrEmpty(request.error)) { GameErrorManager.ThrowGameError(GameError.GameInitReadFailed, "加载 GameInit.txt " + gameinit_txt_path + " 时发生错误:" + request.error); yield break; } gameInitTxt = request.downloadHandler.text; } //加载包 yield return(StartCoroutine(GameInitPackages(gameInitTxt))); //加载模组 yield return(StartCoroutine(GameInitUserMods())); //加载关卡信息 yield return(StartCoroutine(GameInitLevels())); UIProgressText.text = "Loading"; //加载游戏内核管理器 GameManager.RegisterManager(typeof(LevelLoader), false); GameManager.RegisterManager(typeof(LevelManager), false); GameManager.ICManager = (ICManager)GameManager.RegisterManager(typeof(ICManager), false); BaseManager ballManager = GameCloneUtils.CloneNewObjectWithParent( GameManager.FindStaticPrefabs("BallManager"), GameManager.GameRoot.transform).GetComponent <BaseManager>(); BaseManager camManager = GameCloneUtils.CloneNewObjectWithParent( GameManager.FindStaticPrefabs("CamManager"), GameManager.GameRoot.transform).GetComponent <BaseManager>(); GameManager.RegisterManager(ballManager, false); GameManager.RegisterManager(camManager, false); //初始化管理器 GameManager.RequestAllManagerInitialization(); //正常情况下,等待动画播放完成 if (GameManager.Mode == GameMode.Game) { yield return(new WaitUntil(IsGameInitAnimPlayend)); //hide cp GameManager.UIManager.UIFadeManager.AddFadeOut(GameObject.Find("GlobalCopyrightText").GetComponent <Text>(), 1.3f, true); IntroAnimator.Play("IntroAnimationHide"); IntroAudio.Stop(); yield return(new WaitForSeconds(0.8f)); } yield return(new WaitUntil(GameManager.IsManagersInitFinished)); //初始化模组启动代码(游戏初始化完成) ModManager.ExecuteModEntry(GameModEntryCodeExecutionAt.AtStart); yield return(new WaitUntil(GameManager.IsManagersInitFinished)); //分发接管事件 int hC = GameManager.GameMediator.DispatchGlobalEvent(GameEventNames.EVENT_GAME_INIT_TAKE_OVER_CONTROL, "*", (BooleanDelegate)GameInitContinueInit); if (hC == 0)//无接管 { if (GameInitContinueInit()) { //正常模式,加载menulevel GameManager.NotifyGameCurrentScenseChanged(GameCurrentScense.MenuLevel); yield return(new WaitUntil(ModManager.IsNoneModLoading)); int initEventHandledCount = GameManager.GameMediator.DispatchGlobalEvent(GameEventNames.EVENT_ENTER_MENULEVEL, "*"); GameManager.GameMediator.UnRegisterGlobalEvent(GameEventNames.EVENT_ENTER_MENULEVEL); if (initEventHandledCount == 0) { GameErrorManager.ThrowGameError(GameError.HandlerLost, "未找到 EVENT_ENTER_MENULEVEL 的下一步事件接收器\n此错误出现原因可能是配置不正确"); GameLogger.Warning(TAG, "None EVENT_GAME_INIT_FINISH handler was found, the game will not continue."); } else { GameInitHideGameInitUi(true); } } } else { GameInitHideGameInitUi(true); } }