예제 #1
0
        //加载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);
        }
예제 #2
0
        //加载主函数
        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);
            }
        }