使用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();
}
}