Unity 基于UGUI的UI框架 (UIFramework)

源码下载地址:https://download.csdn.net/download/f402455894/21356757?spm=1001.2014.3001.5501

 文件结构

PanelInfo

using System;
using System.Collections.Generic;

[Serializable]
public class UIPanelInfo 
{

    public string panelTypeString;
    public string path;


}
[Serializable]
public class UIPanelTypeJson
{
    public List<UIPanelInfo> infoList;
}

 UIPanelType和Json根据项目情况编写(切记:panelTypeString 和UIPanelType中的字符串还有相对应的UI预制体的名称要一致)


public class UIPanelType
{
    public const string Backpacker = "Panel_Backpacker";
    public const string HomePage = "Panel_HomePage";
    public const string Shopping = "Panel_Shopping";
    public const string System = "Panel_System";
    public const string Task = "Panel_Task";

}
{
  "infoList":
  [
    {
      "panelTypeString": "Panel_Backpacker",
      "path": "UI/Panel_Backpacker"
    },
    {
      "panelTypeString": "Panel_HomePage",
      "path": "UI/Panel_HomePage"
    },
    {
      "panelTypeString": "Panel_Shopping",
      "path": "UI/Panel_Shopping"
    },
    {
      "panelTypeString": "Panel_System",
      "path": "UI/Panel_System"
    },
    {
      "panelTypeString": "Panel_Task",
      "path": "UI/Panel_Task"
    }
  ]
}

Manager

using System.Collections.Generic;
using UnityEngine;

public class UIManager
{

    private static UIManager _instance;
    public static UIManager Instance
    {
        get
        {
            if (_instance == null)
                _instance = new UIManager();
            return _instance;
        }
    }
    private UIManager()
    {
        ParseUIPanelTypeJson();
        GetScenesPanel();
    }
    private Dictionary<string, string> panelPathDict;
    private Dictionary<string, BasePanel> panelDict;

    private Stack<BasePanel> panelStack;
    private Transform canvesTransform;
    private BasePanel[] basePanels;
    private Transform CanvesTransform
    {
        get
        {
            if (canvesTransform == null)
            {
                canvesTransform = GameObject.Find("Canvas").transform;
            }
            return canvesTransform;
        }
    }
    /// <summary>
    /// 显示UI
    /// </summary>
    /// <param name="panelType">UI名字</param>
    public void PushPanel(string panelType)
    {
        if (panelStack == null)
            panelStack = new Stack<BasePanel>();

        if (panelStack.Count > 0)
        {
            //取当前栈顶元素
            BasePanel topPanel = panelStack.Peek();
            topPanel.OnPause();
        }
        BasePanel basePanel = GetPanel(panelType);
        //保证加载出来的东西都在UI画布的最上层
        basePanel.transform.SetSiblingIndex(CanvesTransform.childCount-1);
        basePanel.OnEnter();
        //将要显示的UI推入栈里
        panelStack.Push(basePanel);
    }

    /// <summary>
    /// 隐藏UI
    /// </summary>
    public void PopPanel()
    {
        if (panelStack == null)
            panelStack = new Stack<BasePanel>();
        if (panelStack.Count <= 0)
        {
            return;
        }
        //将要隐藏的UI弹出栈
        BasePanel basePanel_1 = panelStack.Pop();
        basePanel_1.OnExit();
        if (panelStack.Count <= 0)
        {
            return;
        }
        //如果栈里还有元素,获取到当前的UI,让这个UI变成活跃的状态
        BasePanel basePanel_2 = panelStack.Peek();
        basePanel_2.OnResume();
    }


    /// <summary>
    /// 获得UI
    /// </summary>
    /// <param name="panelType">UI的名字</param>
    /// <returns></returns>
    private BasePanel GetPanel(string panelType)
    {
        if (panelDict == null)
        {
            panelDict = new Dictionary<string, BasePanel>();
        }
        //取得字典中的value(dictionary扩展方法)
        BasePanel panel = panelDict.TryGet(panelType);

        //BasePanel panel;
        //panelDict.TryGetValue(panelType, out panel);

        if (panel == null)
        {

            string path = panelPathDict.TryGet(panelType);
            GameObject instPanel = GameObject.Instantiate(Resources.Load(path), CanvesTransform, false) as GameObject;
            instPanel.name = panelType;
            if (panelDict.ContainsKey(panelType))
                Debug.LogError("Key值已经存在");
            else
                panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
            return instPanel.GetComponent<BasePanel>();
        }
        else
        {
            return panel;
        }
    }
    /// <summary>
    /// 解析Json,将UI的名称和路径存入字典中。
    /// </summary>
    private void ParseUIPanelTypeJson()
    {
        panelPathDict = new Dictionary<string, string>();
        TextAsset ta = Resources.Load<TextAsset>("UIJson/UIPanelType");

        UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);

        foreach (UIPanelInfo info in jsonObject.infoList)
        {
            if (panelPathDict.ContainsKey(info.panelTypeString))
                Debug.LogError("Key值重复");
            else
                panelPathDict.Add(info.panelTypeString, info.path);
        }

        basePanels = CanvesTransform.GetComponentsInChildren<BasePanel>();


    }
    /// <summary>
    /// 获取到场景中挂载的UI,防止再次从Resources里加载
    /// </summary>
    private void GetScenesPanel()
    {
        if (panelDict == null)
        {
            panelDict = new Dictionary<string, BasePanel>();
        }
        foreach (BasePanel panel in basePanels)
        {
            if (panelDict.ContainsKey(panel.name))
                Debug.LogError("Key值已经存在");
            else
                panelDict.Add(panel.name, panel);
        }
    }


}

将这个脚本挂场景上,场景里建一个Canves

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameRoot : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        UIManager.Instance.PushPanel(UIPanelType.HomePage);

    }

}

Base

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CanvasGroup))]
public class BasePanel : MonoBehaviour
{
    public virtual void Start()
    {

    }
    /// <summary>
    /// UI每次显示
    /// </summary>
    public virtual void OnEnter()
    {
 
    }
    /// <summary>
    /// UI进入失活状态
    /// </summary>
    public virtual void OnPause()
    {

    }
    /// <summary>
    /// UI被激活
    /// </summary>
    public virtual void OnResume()
    {

    }
    /// <summary>
    /// UI关闭
    /// </summary>
    public virtual void OnExit()
    {

    }
}

Extension

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class DictionaryExtension 
{
    /// <summary>
    /// Dictionary扩展方法,获取对应Key的Value值
    /// </summary>
    /// <typeparam name="Tkey"></typeparam>
    /// <typeparam name="Tvalue"></typeparam>
    /// <param name="dict"></param>
    /// <param name="tkey"></param>
    /// <returns></returns>
    public static Tvalue TryGet<Tkey,Tvalue>(this Dictionary<Tkey, Tvalue> dict,Tkey tkey)
    {
        Tvalue tvalue;
        dict.TryGetValue(tkey, out tvalue);
        return tvalue;
    }
}

PanelUI 实例

根据具体项目情况编写

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Panel_System : BasePanel
{
    public CanvasGroup canvasGroup;

    public override void OnEnter()
    {
        canvasGroup.alpha = 1;
        canvasGroup.blocksRaycasts = true;
    }
    public override void OnExit()
    {
        canvasGroup.alpha = 0;
        canvasGroup.blocksRaycasts = false;
    }

    public void OnClosePanel()
    {
        UIManager.Instance.PopPanel();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Panel_HomePage : BasePanel
{
    public CanvasGroup canvasGroup;
    public override void OnPause()
    {
        canvasGroup.blocksRaycasts = false;
    }
    public override void OnResume()
    {
        canvasGroup.blocksRaycasts = true;
    }
    public void OnPushPanel(string str)
    {
       
        UIManager.Instance.PushPanel(str);
    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity UI框架是一种用于创建用户界面(UI)的工具集和组件集合。它提供了丰富的UI元素和功能,可以帮助开发者轻松地构建交互性和可视化的界面。 Unity UI框架可以通过Unity Asset Store进行下载。打开Unity编辑器,点击"Window"菜单,选择"Asset Store"选项,会打开Asset Store窗口。在搜索栏中输入"Unity UI框架",可以找到很多可用的UI框架。 在选择和下载UI框架之前,开发者应该了解项目的需求并进行评估。可以根据项目的规模、复杂度和用户需求来选择合适的UI框架。一些常用的UI框架包括:"TextMeshPro"、"DOTween" 和 "UGUI"等。开发者可以根据自己的需要选择适合的框架。 下载UI框架后,可以将其导入到Unity项目中。在Asset Store或者Unity Package Manager中选择合适的UI框架,点击"Download" 或者 "Import"按钮进行安装。安装完成后,可以在Unity编辑器的"Assets"文件夹中找到导入的UI框架。 使用UI框架时,可以在Unity编辑器中创建UI元素,如按钮、文本、滑动条等,并对其进行布局和样式设置。可以通过脚本代码来实现交互性功能,如按钮的点击事件、输入框的文本处理等。UI框架还提供了很多可定制的功能和效果,如动画、过渡和绘制等,可以增强用户界面的视觉效果和交互体验。 总之,Unity UI框架是一个方便使用的工具集,可以帮助开发者快速构建用户界面。通过下载合适的UI框架,开发者可以轻松地创建、布局和管理UI元素,提供良好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值