UI框架

    xiaoxiao2022-07-03  164

    使用UGUI,想要panel依次显示,退出,更好的管理各种UI界面,使用栈的方式管理所有的想要加载的UI界面。 码源:链接: https://pan.baidu.com/s/1Poc2CMaO_FRDxIAdCdzi_w 提取码: t8gx

    /**************************************************** 文件:UiType.cs 作者:唐孝辉 邮箱: 1351105506@qq.com 日期:#CreateTime# 功能:UIPanel类型 *****************************************************/ public enum UiPanelType:byte { MessagePanel, KnapsackPanel, MainMenuPanel, ShopPanel, SkillPanel, SystemPanel, TaskPanel, } [ { "type": "MessagePanel", "path": "UIPanel/ItemMessagePanel" }, { "type": "KnapsackPanel", "path": "UIPanel/KnapsackPanel" }, { "type": "MainMenuPanel", "path": "UIPanel/MainMenuPanel" }, { "type": "ShopPanel", "path": "UIPanel/ShopPanel" }, { "type": "SkillPanel", "path": "UIPanel/SkillPanel" }, { "type": "SystemPanel", "path": "UIPanel/SystemPanel" }, { "type": "TaskPanel", "path": "UIPanel/TaskPanel" } ] /**************************************************** 文件:UiManager.cs 作者:唐孝辉 邮箱: 1351105506@qq.com 日期:#CreateTime# 功能:ui管理器解析josn文件,和管理Panel路径和prefabs以及panel显示和隐藏和方法的类UIManager *****************************************************/ using System; using System.Collections.Generic; using System.IO; using LitJson; using UnityEngine; public class UiManager { private UiManager() { InitUiPanelJson(); canvas = GameObject.FindGameObjectWithTag("Canvas").GetComponent<Transform>(); } private static UiManager _instance=null; public static UiManager instance { get { if (_instance==null) { _instance = new UiManager(); } return _instance; } } //保存面板prefabs的路径 private Dictionary<UiPanelType,string> panelPathDictionary=new Dictionary<UiPanelType, string>(); //保存BasePanel面板 private Dictionary<UiPanelType,BasePanel> basePanelDictionary=new Dictionary<UiPanelType, BasePanel>(); //保存所有显示的BasePanel面板 private Stack<BasePanel> basePanelStack=new Stack<BasePanel>(); private Transform canvas; //解析uipanelJson文件添加到字典里 private void InitUiPanelJson() { string jsonPath = Application.dataPath + "/Resources/UiPanelType.json"; if (!File.Exists(jsonPath)) { Debug.Log("UiPanelType的json路径不存在" + jsonPath); } using (StreamReader reader = new StreamReader(jsonPath)) { string str = reader.ReadToEnd(); JsonData data=JsonMapper.ToObject(str); foreach (JsonData item in data) { string type = item["type"].ToString(); UiPanelType uiPanelType=(UiPanelType)Enum.Parse(typeof(UiPanelType), type); string path = item["path"].ToString(); panelPathDictionary.Add(uiPanelType,path); } } } //获取UiPanel GameObject的脚本,以及初始化位置的方法 private BasePanel GetBasePanel(UiPanelType type) { BasePanel basePanel =basePanelDictionary.GetTvalue<UiPanelType,BasePanel>(type); if (basePanel==null) { string path=panelPathDictionary.GetTvalue<UiPanelType, string>(type); GameObject gameObject=Resources.Load<GameObject>(path); GameObject go=GameObject.Instantiate(gameObject); basePanel = go.GetComponent<BasePanel>(); basePanelDictionary.Add(type, basePanel); } basePanel.transform.SetParent(canvas); basePanel.transform.GetComponent<RectTransform>().localPosition = Vector3.zero; basePanel.transform.GetComponent<RectTransform>().localScale = Vector3.one; return basePanel; } //入栈操作 public void PushPanel(UiPanelType type) { //界面暂停,弹出来其他界面 if (basePanelStack.Count > 0) { BasePanel basePanel1 = basePanelStack.Peek(); basePanel1.PausePanel(); } //弹出来的新界面显示出来并入栈 BasePanel basePane2 = GetBasePanel(type); basePanelStack.Push(basePane2); basePane2.EnterPanel(); } //出栈操作 public void PopPanel() { if (basePanelStack.Count<=0) { return; } //关闭当前界面出栈 //如果有暂停的界面让其重新启动 BasePanel basePanel=basePanelStack.Pop(); basePanel.ExitPanel(); if (basePanelStack.Count <=0) { return; } BasePanel basePanel2 = basePanelStack.Peek(); basePanel2.ResumePanel(); } } /**************************************************** 文件:GameRoot.cs 作者:唐孝辉 邮箱: 1351105506@qq.com 日期:#CreateTime# 功能:UI的启动 *****************************************************/ using UnityEngine; public class GameRoot : MonoBehaviour { private GameRoot() { } private static GameRoot _instance; private UiManager uiManager; private Transform canvas; public static GameRoot instance { get { return _instance; } } void Awake() { _instance = this; DontDestroyOnLoad(this); uiManager = UiManager.instance; canvas = this.transform.Find("Canvas").GetComponent<Transform>(); } void Start() { InitPanel(); } //初始化 void InitPanel() { uiManager.PushPanel(UiPanelType.MainMenuPanel); } } /**************************************************** 文件:BasePanel.cs 作者:唐孝辉 邮箱: 1351105506@qq.com 日期:#CreateTime# 功能:面板公共基类 *****************************************************/ using UnityEngine; public class BasePanel : MonoBehaviour { public virtual void EnterPanel() { } public virtual void PausePanel() { } public virtual void ResumePanel() { } public virtual void ExitPanel() { } } /**************************************************** 文件:MainMenuPanel.cs 作者:唐孝辉 邮箱: 1351105506@qq.com 日期:#CreateTime# 功能:Nothing *****************************************************/ using System; using UnityEngine; public class MainMenuPanel : BasePanel { private CanvasGroup canvasGroup; void Awake() { canvasGroup = this.GetComponent<CanvasGroup>(); } public void ClickBtn(string str) { UiPanelType type=(UiPanelType)Enum.Parse(typeof(UiPanelType), str); UiManager.instance.PushPanel(type); } public override void EnterPanel() { canvasGroup.blocksRaycasts =true; canvasGroup.alpha = 1; canvasGroup.interactable = true; } public override void PausePanel() { canvasGroup.blocksRaycasts = false; canvasGroup.interactable = false; } public override void ResumePanel() { canvasGroup.blocksRaycasts = true; canvasGroup.alpha = 1; canvasGroup.interactable = true; } public override void ExitPanel() { canvasGroup.blocksRaycasts =false; canvasGroup.interactable = false; UiManager.instance.PopPanel(); } } using UnityEngine; using System.Collections; using DG.Tweening; public class KnapsackPanel : BasePanel { private CanvasGroup canvasGroup; void Start() { if (canvasGroup == null) canvasGroup = GetComponent<CanvasGroup>(); } public override void OnEnter() { if (canvasGroup == null) canvasGroup = GetComponent<CanvasGroup>(); canvasGroup.alpha = 1; canvasGroup.blocksRaycasts = true; Vector3 temp = transform.localPosition; temp.x = 600; transform.localPosition = temp; transform.DOLocalMoveX(0, .5f); } public override void OnExit() { //canvasGroup.alpha = 0; canvasGroup.blocksRaycasts = false; transform.DOLocalMoveX(600, .5f).OnComplete(()=>canvasGroup.alpha = 0); } public override void OnPause() { canvasGroup.blocksRaycasts = false; } public override void OnResume() { canvasGroup.blocksRaycasts = true; } public void OnClosePanel() { UIManager.Instance.PopPanel(); } public void OnItemButtonClick() { UIManager.Instance.PushPanel(UIPanelType.ItemMessage); } } /**************************************************** 文件:SkillPanel.cs 作者:唐孝辉 邮箱: 1351105506@qq.com 日期:#CreateTime# 功能:Nothing *****************************************************/ using UnityEngine; public class SkillPanel : BasePanel { private CanvasGroup canvasGroup; void Awake() { canvasGroup = this.GetComponent<CanvasGroup>(); } public override void EnterPanel() { canvasGroup.blocksRaycasts = true; canvasGroup.alpha = 1; canvasGroup.interactable = true; } public override void PausePanel() { canvasGroup.interactable = false; } public override void ResumePanel() { canvasGroup.alpha = 1; canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true; } public override void ExitPanel() { canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; canvasGroup.alpha = 0; } public void ClosePanel() { UiManager.instance.PopPanel(); } } using UnityEngine; using System.Collections; using DG.Tweening; public class ItemMessagePanel : BasePanel { private CanvasGroup canvasGroup; void Start() { if (canvasGroup == null) canvasGroup = GetComponent<CanvasGroup>(); } public override void OnEnter() { if (canvasGroup == null) canvasGroup = GetComponent<CanvasGroup>(); canvasGroup.alpha = 1; canvasGroup.blocksRaycasts = true; transform.localScale = Vector3.zero; transform.DOScale(1, .5f); } public override void OnExit() { //canvasGroup.alpha = 0; canvasGroup.blocksRaycasts = false; transform.DOScale(0, .5f).OnComplete(() => canvasGroup.alpha = 0); } public void OnClosePanel() { UIManager.Instance.PopPanel(); } }
    最新回复(0)