UI框架

使用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vtiger UI框架是一种用于开发和设计用户界面的工具集。它提供了一套可重复使用的组件和模板,使开发者能够快速构建现代化和美观的用户界面。 vtiger UI框架具有以下特点: 1. 响应式设计:vtiger UI框架支持响应式设计,可以自动适应不同的屏幕尺寸和设备类型。这样,用户无论使用台式机、笔记本电脑、平板电脑还是手机浏览网页,都能获得良好的用户体验。 2. 可自定义性:vtiger UI框架提供了丰富的样式和布局选项,开发者可以根据自己的需求进行定制。无论是调整颜色、字体还是布局方式,都可以通过简单的配置来实现。 3. 组件丰富:vtiger UI框架提供了各种常用的UI组件,如按钮、表单、标签页等。这些组件具有一致的设计风格和交互方式,方便开发者在项目中进行使用。 4. 轻量级:vtiger UI框架注重性能优化,使用了轻量级的CSS和JavaScript代码,以确保快速加载和响应。 5. 跨浏览器兼容性:vtiger UI框架经过充分测试,可以在各种现代浏览器上稳定运行,如Chrome、Firefox、Safari等。 使用vtiger UI框架,开发者可以更加高效地构建用户友好的界面,提升用户体验。同时,VTiger UI框架也提供了详细的文档和示例代码,方便开发者学习和使用。无论是开发Web应用程序,还是设计企业级软件界面,vtiger UI框架都是一个强大的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值