private void EnterLoader() { if (UILevelLoader == null) { UILevelLoader = GameCloneUtils.CloneNewObject(GameManager.FindStaticPrefabs("UILevelLoader"), "UILevelLoader"); GameManager.UIManager.AttatchViewToCanvas(UILevelLoader.GetComponent <RectTransform>()); LoaderProgressOuter = UILevelLoader.transform.Find("LoaderProgressOuter").GetComponent <RectTransform>(); LoaderError = UILevelLoader.transform.Find("LoaderError").gameObject; LoaderProgress = LoaderProgressOuter.transform.Find("LoaderProgress").GetComponent <RectTransform>(); LoaderProgressImage = LoaderProgress.GetComponent <Image>(); LoaderErrorContent = UILevelLoader.transform.Find("LoaderError/Scroll View/Viewport/LoaderErrorContent").GetComponent <Text>(); BtnContinue = UILevelLoader.transform.Find("LoaderError/Continue").GetComponent <Button>(); BtnQuit = UILevelLoader.transform.Find("LoaderError/Quit").GetComponent <Button>(); BtnQuit.onClick.AddListener(() => QuitLoader()); } LoaderProgress.gameObject.SetActive(true); LoaderError.SetActive(false); UpdateLoaderProgress(0.01f); GameManager.NotifyGameCurrentScenseChanged(GameCurrentScense.LevelLoader); }
public void AddCustomDebugToolItem(string text, GameHandler callbackHandler) { GameObject newGo = GameCloneUtils.CreateEmptyUIObjectWithParent(DebugToolsItemHost.transform, "DebugToolItem"); RectTransform rectTransform = newGo.GetComponent <RectTransform>(); rectTransform.pivot = new Vector2(0, 1); UIAnchorPosUtils.SetUIAnchor(rectTransform, UIAnchor.Stretch, UIAnchor.Top); CustomData customData = newGo.AddComponent <CustomData> (); customData.customData = callbackHandler; Text newText = newGo.AddComponent <Text>(); newText.font = Resources.GetBuiltinResource <Font>("Arial.ttf"); newText.text = text; newText.color = Color.white; newText.fontSize = 11; newText.alignment = TextAnchor.MiddleCenter; ContentSizeFitter contentSizeFitter = newGo.AddComponent <ContentSizeFitter>(); contentSizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize; EventTriggerListener.Get(newGo).onClick = OnCustomDebugToolItemClick; rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, -customDebugToolItemY); customDebugToolItemY += 20; DebugToolsItemHost.sizeDelta = new Vector2(DebugToolsItemHost.sizeDelta.x, customDebugToolItemY); }
/// <summary> /// 添加条目 /// </summary> /// <returns></returns> public CommonListItem AddItem() { CommonListItem newItem = new CommonListItem(); newItem.itemObject = GameCloneUtils.CloneNewObjectWithParent(ItemPrefab, rectTransform.transform); newItem.itemRectTransform = newItem.itemObject.GetComponent <RectTransform>(); newItem.backgroundImage = newItem.itemObject.AddComponent <Image>(); newItem.backgroundImage.type = Image.Type.Sliced; newItem.backgroundImageButton = newItem.itemObject.AddComponent <Button>(); newItem.backgroundImageButton.transition = Selectable.Transition.SpriteSwap; newItem.backgroundImage.sprite = itemBackgroundNormal; newItem.visible = true; newItem.selected = false; SpriteState spriteState = new SpriteState(); spriteState.highlightedSprite = itemBackgroundHover; spriteState.selectedSprite = itemBackgroundSelected; spriteState.pressedSprite = itemBackgroundPressed; spriteState.disabledSprite = itemBackgroundPressed; newItem.backgroundImageButton.spriteState = spriteState; EventTriggerListener.Get(newItem.itemObject).onClick = (g) => OnItemClicked(newItem); List.Add(newItem); needRelayout = 10; return(newItem); }
private void StartDebugCore(GameObject basePrefab) { GameManager.SetGameBaseCameraVisible(false); GameCloneUtils.CloneNewObjectWithParent(basePrefab, GameManager.GameRoot.transform, "DebugFloor"); GameManager.GameMediator.CallAction(GamePartName.CamManager, "CamStart"); ResetEnergy(); }
private IEnumerator LoadLevel(string levelFullPath) { GameLevel currentLevel = GameManager.ModManager.FindLevel(levelFullPath); if (currentLevel == null) { LoadeErrorFail("加载关卡失败:\n未找到文件:" + levelFullPath + ",请确保关卡文件已放在 Levels 文件夹下。"); yield break; } //加载关卡中的模组 yield return(new WaitUntil(GameManager.ModManager.IsNoneModLoading)); UpdateLoaderProgress(0.1f); //通知模组加载 GameManager.GameMediator.DispatchGlobalEvent(GameEventNames.EVENT_ENTER_LEVEL_LOADER, "*", (ILevelLoader)this); //加载关卡本体 yield return(StartCoroutine(currentLevel.Load())); UpdateLoaderProgress(0.2f); if (currentLevel.LoadStatus != ModBase.GameModStatus.InitializeSuccess) { LoadeErrorFail("加载关卡 " + currentLevel.Name + " 失败:\n错误信息:" + currentLevel.LoadError); yield break; } //加载基础prefab if (string.IsNullOrEmpty(currentLevel.BasePrefab)) { LoadeErrorFail("加载关卡失败:\nBasePrefab 不能为空"); yield break; } currentLevelPrefab = currentLevel.LevelAssetBundle.LoadAsset <GameObject>(currentLevel.BasePrefab); if (currentLevelPrefab == null) { LoadeErrorFail("加载关卡失败:\n未找到 BasePrefab :" + currentLevel.BasePrefab); yield break; } currentLevelPrefab = GameCloneUtils.CloneNewObjectWithParent(currentLevelPrefab, transform, currentLevel.Name); UpdateLoaderProgress(0.23f); yield break; }
public void ShowExceptionDialog(string title, string message, LogType type) { if (showedExceptionDialogs.Count >= 10) { GameManager.UIManager.GlobalToast(title + "\n发生的错误过多,请打开控制台查看\n\n" + (message.Length > 50 ? (message.Substring(0, 40) + "\n... (" + (message.Length - 50) + " more)") : message)); } RectTransform debugRectTransform = GameCloneUtils.CloneNewObjectWithParent(GameManager.FindStaticPrefabs("UIErrorAlertDialog"), GameManager.UIManager.UIRoot.transform).GetComponent <RectTransform>(); UIWindow errWindow = GameManager.UIManager.CreateWindow(title, debugRectTransform); errWindow.CanClose = true; errWindow.CanResize = true; errWindow.CanDrag = true; errWindow.SetMinSize(300, 200); errWindow.Show(); errWindow.onClose = (id) => showedExceptionDialogs.Remove(id); showedExceptionDialogs.Add(errWindow.GetWindowId()); debugRectTransform.Find("UIButtonCopy").GetComponent <Button>().onClick.AddListener(() => { GUIUtility.systemCopyBuffer = message; GameManager.UIManager.GlobalToast("错误信息已复制到剪贴板!"); }); debugRectTransform.Find("UIButtonClose").GetComponent <Button>().onClick.AddListener(() => errWindow.Close()); Image ico = debugRectTransform.Find("UIErrorImage").GetComponent <Image>(); Text text = debugRectTransform.Find("UIScrollView/Viewport/Content").GetComponent <Text>(); text.text = message; switch (type) { case LogType.Error: ico.sprite = ico_error_big; break; case LogType.Exception: ico.sprite = ico_error_big; break; case LogType.Assert: ico.sprite = ico_warning2_big; break; case LogType.Warning: ico.sprite = ico_warning_big; break; case LogType.Log: ico.sprite = ico_info_big; break; } }
private void AddLogItem(GameLogger.LogData data) { if (logDestroyed) { return; } GameObject newGo = GameCloneUtils.CloneNewObjectWithParent(UIDebugTextItem, DebugCmdContent.transform, "Text"); GameObject newT = newGo.transform.Find("Text").gameObject; Image newI = newGo.transform.Find("Image").gameObject.GetComponent <Image>(); Text newText = newT.GetComponent <Text>(); CustomData customData = newGo.GetComponent <CustomData>(); customData.customData = data; if (data.Data.Length > 32767)//字符过长Text无法显示 { data.Data = data.Data.Substring(0, 32766); } switch (data.Type) { case GameLogger.LogType.Text: newText.text = data.Data + " "; newI.sprite = ico_success; break; case GameLogger.LogType.Error: newText.text = "<color=#FF2400>" + data.Data + "</color> "; newI.sprite = ico_error; break; case GameLogger.LogType.Assert: newText.text = "<color=#FF0000>" + data.Data + "</color> "; newI.sprite = ico_error; break; case GameLogger.LogType.Info: newText.text = "<color=#70DBDB>" + data.Data + "</color> "; newI.sprite = ico_info; break; case GameLogger.LogType.Warning: newText.text = "<color=#FF7F00>" + data.Data + "</color> "; newI.sprite = ico_warning; break; } RectTransform newGoRectTransform = newGo.GetComponent <RectTransform>(); RectTransform newTextRectTransform = newT.GetComponent <RectTransform>(); newGoRectTransform.anchoredPosition = new Vector2(newGoRectTransform.anchoredPosition.x, -currentLogY); Vector2 textSize = UIContentSizeUtils.GetContentSizeFitterPreferredSize(newTextRectTransform, newT.GetComponent <ContentSizeFitter>()); currentLogY += 12; if (textSize.x + 2 > currentLogX) { currentLogX = textSize.x + 2; } DebugCmdContent.sizeDelta = new Vector2(currentLogX, currentLogY + 6); EventTriggerListener.Get(newT).onClick = SetCurrentActiveLogItem; if (lastActiveLogItem == null || lastActiveLogItem == lastLogItem) { SetCurrentActiveLogItem(newT); DebugCmdScrollViewScrollRect.verticalNormalizedPosition = 0; } lastLogItem = newT; }
private void InitDebugWindow() { RectTransform debugRectTransform = GameCloneUtils.CloneNewObjectWithParent(GameManager.FindStaticPrefabs("UIDebugWindow"), GameManager.UIManager.UIRoot.transform).GetComponent <RectTransform>(); debugWindow = GameManager.UIManager.CreateWindow("Debug console window", debugRectTransform); UIDebugToolBar = GameCloneUtils.CloneNewObjectWithParent(GameManager.FindStaticPrefabs("UIDebugToolBar"), GameManager.UIManager.UIRoot.transform, "GameUIDebugToolBar"); debugWindow.CloseAsHide = true; debugWindow.SetSize(450, 330); debugWindow.SetMinSize(420, 270); debugWindow.MoveToCenter(); debugWindow.Hide(); ico_warning2_big = GameManager.FindStaticAssets <Sprite>("ico_warning2_big"); ico_warning_big = GameManager.FindStaticAssets <Sprite>("ico_warning_big"); ico_info_big = GameManager.FindStaticAssets <Sprite>("ico_info_big"); ico_error_big = GameManager.FindStaticAssets <Sprite>("ico_error_big"); ico_success_big = GameManager.FindStaticAssets <Sprite>("ico_success_big"); ico_warning = GameManager.FindStaticAssets <Sprite>("ico_warning"); ico_info = GameManager.FindStaticAssets <Sprite>("ico_info"); ico_error = GameManager.FindStaticAssets <Sprite>("ico_error"); ico_success = GameManager.FindStaticAssets <Sprite>("ico_success"); box_round_light = GameManager.FindStaticAssets <Sprite>("box_round_grey"); background_transparent = GameManager.FindStaticAssets <Sprite>("background_transparent"); GameManager.UIManager.RegisterWindow(debugWindow); UIDebugToolBar.SetActive(true); DebugTextFPS = UIDebugToolBar.transform.Find("DebugTextFPS").GetComponent <Text>(); DebugTextErrors = debugRectTransform.transform.Find("DebugToolErrors/Text").GetComponent <Text>(); DebugTextWarnings = debugRectTransform.transform.Find("DebugToolWarnings/Text").GetComponent <Text>(); DebugTextInfos = debugRectTransform.transform.Find("DebugToolInfos/Text").GetComponent <Text>(); DebugCmdContent = debugRectTransform.transform.Find("DebugCmdScrollView/Viewport/DebugCmdContent").GetComponent <RectTransform>(); DebugInputCommand = debugRectTransform.transform.Find("DebugInputCommand").GetComponent <InputField>(); DebugToggleInfo = debugRectTransform.transform.Find("DebugToggleInfo").GetComponent <Toggle>(); DebugToggleWarning = debugRectTransform.transform.Find("DebugToggleWarning").GetComponent <Toggle>(); DebugToggleError = debugRectTransform.transform.Find("DebugToggleError").GetComponent <Toggle>(); DebugItemContent = debugRectTransform.transform.Find("DebugDetailsScrollView/Viewport/DebugItemContent").GetComponent <Text>(); Toggle DebugToggleStackTrace = debugRectTransform.transform.Find("DebugToggleStackTrace").GetComponent <Toggle>(); DebugCmdScrollView = debugRectTransform.transform.Find("DebugCmdScrollView").GetComponent <RectTransform>(); DebugCmdScrollViewScrollRect = DebugCmdScrollView.GetComponent <ScrollRect>(); DebugDetailsScrollView = debugRectTransform.transform.Find("DebugDetailsScrollView").GetComponent <RectTransform>(); DebugToolsItem = UIDebugToolBar.transform.Find("DebugToolsItem").gameObject; DebugToolsItemHost = UIDebugToolBar.transform.Find("DebugToolsItem/Viewport/DebugToolsItemHost").GetComponent <RectTransform>(); UIDebugTextItem = GameManager.FindStaticPrefabs("UIDebugTextItem"); fPSManager = GameCloneUtils.CreateEmptyObjectWithParent(GameManager.GameRoot.transform, "FPSManager").AddComponent <FPSManager>(); fPSManager.FpsText = DebugTextFPS; EventTriggerListener.Get(UIDebugToolBar.transform.Find("DebugToolCmd").gameObject).onClick = (g) => { if (debugWindow.GetVisible()) { debugWindow.Hide(); } else { debugWindow.Show(); ForceReloadLogList(); } }; EventTriggerListener.Get(UIDebugToolBar.transform.Find("DebugTools").gameObject).onClick = (g) => { DebugToolsItem.SetActive(!DebugToolsItem.activeSelf); }; EventTriggerListener.Get(debugRectTransform.transform.Find("DebugButtonRun").gameObject).onClick = (g) => { if (RunCommand(DebugInputCommand.text)) { DebugInputCommand.text = ""; } }; EventTriggerListener.Get(debugRectTransform.transform.Find("DebugButtonClear").gameObject).onClick = (g) => { ClearLogs(); }; DebugInputCommand.onEndEdit.AddListener((s) => { ClearCurrentActiveLogItem(); if (RunCommand(s)) { DebugInputCommand.text = ""; } }); DebugToggleError.onValueChanged.AddListener((b) => { SetShowLogTypes(GameLogger.LogType.Error, b); SetShowLogTypes(GameLogger.LogType.Assert, b); ForceReloadLogList(); }); DebugToggleWarning.onValueChanged.AddListener((b) => { SetShowLogTypes(GameLogger.LogType.Warning, b); ForceReloadLogList(); }); DebugToggleInfo.onValueChanged.AddListener((b) => { SetShowLogTypes(GameLogger.LogType.Text, b); SetShowLogTypes(GameLogger.LogType.Info, b); ForceReloadLogList(); }); DebugToggleStackTrace.onValueChanged.AddListener((b) => { DebugDetailsScrollView.gameObject.SetActive(b); if (!b) { UIAnchorPosUtils.SetUILeftBottom(DebugCmdScrollView, UIAnchorPosUtils.GetUILeft(DebugCmdScrollView), 30); } else { UIAnchorPosUtils.SetUILeftBottom(DebugCmdScrollView, UIAnchorPosUtils.GetUILeft(DebugCmdScrollView), 100); } }); GameLogger.RegisterLogCallback(HandleLog); ForceReloadLogList(); }
private void InitModManagementWindow() { mod_icon_not_load = GameManager.FindStaticAssets <Sprite>("mod_icon_not_load"); mod_icon_default = GameManager.FindStaticAssets <Sprite>("mod_icon_default"); mod_icon_failed = GameManager.FindStaticAssets <Sprite>("mod_icon_failed"); mod_icon_bad = GameManager.FindStaticAssets <Sprite>("mod_icon_bad"); modManagerView = GameCloneUtils.CloneNewObjectWithParent(GameManager.FindStaticPrefabs("UIModManagement"), UIManager.UIRoot.transform).GetComponent <RectTransform>(); modManageWindow = UIManager.CreateWindow("模组管理", modManagerView); modManageWindow.SetSize(500, 300); modManageWindow.SetMinSize(400, 250); modManageWindow.CloseAsHide = true; modManageWindow.Hide(); modManageWindow.MoveToCenter(); modManageWindow.onHide += (windowId) => { SaveModEnableStatusList(); }; modManageWindow.onShow += (windowId) => { FlushModList(); }; modList = modManagerView.transform.Find("UIScrollView/Viewport/Content").gameObject.GetComponent <UICommonList>(); TextModCount = modManagerView.transform.Find("TextModCount").GetComponent <Text>(); hideCoreMod = settings.GetBool("modmgr.hideCoreMod", true); UIToggleHideCoreMod = modManagerView.transform.Find("UIToggleHideCoreMod").GetComponent <Toggle>(); UIToggleHideCoreMod.isOn = hideCoreMod; UIToggleHideCoreMod.onValueChanged.AddListener((b) => { hideCoreMod = b; FlushModList(); }); GameManager.GameMediator.RegisterEventHandler(GameEventNames.EVENT_MOD_REGISTERED, "ModDebug", (evtName, param) => { OnModAdded((GameMod)param[1]); return(false); }); GameManager.GameMediator.RegisterEventHandler(GameEventNames.EVENT_MOD_UNLOAD, "ModDebug", (evtName, param) => { OnModRemoved((GameMod)param[1]); return(false); }); GameManager.GameMediator.RegisterEventHandler(GameEventNames.EVENT_MOD_LOAD_FAILED, "ModDebug", (evtName, param) => { GameMod m = (GameMod)param[1]; UpdateModListItemInfos(modList.GetItemById(m.Uid), m); return(false); }); GameManager.GameMediator.RegisterEventHandler(GameEventNames.EVENT_MOD_LOAD_SUCCESS, "ModDebug", (evtName, param) => { GameMod m = (GameMod)param[1]; UpdateModListItemInfos(modList.GetItemById(m.Uid), m); return(false); }); GameManager.GameMediator.RegisterEventHandler(GameEventNames.EVENT_GLOBAL_ALERT_CLOSE, "ModDebug", (evtName, param) => { if (currentModConfirm != null) { int id = (int)param[0]; bool confirm = (bool)param[1]; if (confirm) { if (id == unloadModConfirmUid) { UnLoadGameMod(currentModConfirm); currentModConfirm = null; } else if (id == initModConfirmUid) { currentModConfirm.Load(this); currentModConfirm = null; } } } return(false); }); InitModList(); }
//加载主函数 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); } }
private UILayout BuildLayoutByTemplateInternal(string name, XmlNode templateXml, Dictionary <string, GameHandler> handlers, UILayout parent, UILayout root, string[] initialProps) { //实例化UI预制体 string prefabName = templateXml.Name; GameObject prefab = UIManager.FindRegisterElementPrefab(prefabName); if (prefab == null) { GameLogger.Log(TAG, "BuildLayoutByTemplate failed, not found prefab {0}", prefabName); GameErrorManager.LastError = GameError.PrefabNotFound; return(null); } //获取预制体上的脚本 UILayout ilayout = prefab.GetComponent <UILayout>(); if (ilayout == null) //该方法必须实例化UI容器 { GameLogger.Error(TAG, "BuildLayoutByTemplate with prefab {0} failed, root must be a container", prefabName); GameErrorManager.LastError = GameError.MustBeContainer; return(null); } GameObject newCon = GameCloneUtils.CloneNewObjectWithParent(prefab, parent == null ? UIManager.UIRoot.transform : parent.RectTransform); ilayout = newCon.GetComponent <UILayout>(); ilayout.DoCallStart(); ilayout.LayoutLock(); ilayout.RectTransform = newCon.GetComponent <RectTransform>(); UIAnchorPosUtils.SetUIPivot(ilayout.RectTransform, UIPivot.TopCenter); ilayout.RectTransform.anchoredPosition = Vector2.zero; if (root == null) { root = ilayout; root.IsRootLayout = true; } GameObject newEle = null; UIElement uIElement = null; //子元素 for (int i = 0, c = templateXml.ChildNodes.Count; i < c; i++) { string eleName = ""; //xml 属性读取 XmlNode eleNode = templateXml.ChildNodes[i]; foreach (XmlAttribute a in eleNode.Attributes) { if (a.Name.ToLower() == "name") { eleName = a.Value; } } //预制体 prefab = UIManager.FindRegisterElementPrefab(eleNode.Name); if (prefab == null) { GameLogger.Error(TAG, "BuildLayoutByTemplate failed, not found prefab {0}", prefabName); continue; } if (prefab.GetComponent <UILayout>() != null) //这是UI容器 { UILayout newLayout = BuildLayoutByTemplateInternal(eleName, eleNode, handlers, ilayout, root, initialProps); //递归构建 uIElement = newLayout; uIElement.rootContainer = root; uIElement.Name = eleName; } else { //构建子元素 newEle = GameCloneUtils.CloneNewObjectWithParent(prefab, ilayout.RectTransform, eleName); uIElement = newEle.GetComponent <UIElement>(); uIElement.RectTransform = newEle.GetComponent <RectTransform>(); uIElement.DoCallStart(); uIElement.Init(eleNode); uIElement.rootContainer = root; uIElement.Name = eleName; } //初始化 InitiazeChildElement(uIElement, handlers, initialProps); //添加元素 ilayout.AddElement(uIElement, false); } ilayout.Init(templateXml); //容器的XML读取 InitiazeChildElement(ilayout, handlers, initialProps); ilayout.LayoutUnLock(); ilayout.PostDoLayout(); if (root == ilayout) { ilayout.DoLayout(); } return(ilayout); }