找回密码
 立即注册
查看: 244|回复: 0

基于Unity UGUI写一个UIManager框架

[复制链接]
发表于 2022-9-30 11:13 | 显示全部楼层 |阅读模式
引言:

    相信很多Unity初学者在做UI的时候都遇到过UI界面管理杂乱无章,有时候自己都找不到自己程序和界面在哪里,导致焦头烂额,想要放弃。所以我写了一个简易的UIManager框架供有需要的人参考。
Unity部分:



我这边统一把所有UI界面用Resources动态加载的方式读取,目的是为了方便管理。然后给相应的UI界面预制体下挂载对应的UI脚本,这边建议脚本名称和UI界面预制体名称一样(规范命名,便于管理以及后期维护)。




这边是我测试了两个简单UI界面例子,当点击设置按钮时打开UISetting界面且关闭当前界面;点击返回按钮时回到UIMain界面且关闭当前界面。
c#脚本部分:

  1.UIRoot.cs
using System.Collections.Generic;
using UnityEngine;

public class UIRoot : MonoBehaviour
{
    public static Dictionary<string,View> m_views = new Dictionary<string, View>(); //定义一个字典存储所有UI界面
    private void Awake()
    {
        var prefabs = Resources.LoadAll<Transform>("UIPrefab");//加载UIPrefab文件夹下的所有UI预制体
        foreach (Transform view in prefabs)
        {
            if (!m_views.ContainsKey(view.name))
            {
                Transform prefab = Instantiate(view,transform);
                prefab.name = prefab.name.Replace("(Clone)", "");//去除实例化物体的(Clone)后缀,和预制体名字统一
                m_views.Add(prefab.name, prefab.GetComponent<View>());//存入字典
            }
        }
    }
}
2.View.cs

using UnityEngine;

public abstract class View : MonoBehaviour
{
    public abstract void Init();//定义一个抽象方法使得每个UI界面继承该脚本都必须实现Init方法
    public virtual void Hide() => gameObject.SetActive(false);//设置当前物体隐藏
    public virtual void Show() => gameObject.SetActive(true);.//设置当前物体显示
}3.UIManager.cs

using System.Collections.Generic;
public class UIManager
{
    public static Dictionary<string,View> viewsDic = new Dictionary<string,View>();//接收所有UIPrefab
    public UIManager()
    {
        viewsDic = UIRoot.m_views;//赋值
        Initilization();
    }
    /// <summary>
    /// 初始化赋值
    /// </summary>
    private static void Initilization()
    {
        foreach (var view in viewsDic)
        {
            view.Value.Init();
            view.Value.Hide();
        }
        Show<UIMain>();
    }
    /// <summary>
    /// 获取当前UI视图
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static T GetView<T>() where T : View
    {
        foreach (var itemView in viewsDic)
        {
            if (itemView.Value is T tView)
            {
                return tView;
            }
        }
        return null;
    }
    /// <summary>
    /// 显示UI视图
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public static void Show<T>() where T : View
    {
        foreach (var itemView in viewsDic)
        {
            if (itemView.Value is T)
            {
                itemView.Value.Show();
            }
        }
    }
    /// <summary>
    /// 关闭UI视图
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public static void Close<T>() where T : View
    {
        foreach (var itemView in viewsDic)
        {
            if (itemView.Value is T)
            {
                itemView.Value.Hide();
            }
        }
    }
}
3.UIMain.cs

using UnityEngine.UI;

public class UIMain : View
{
    private Button settingButton;
    public override void Init()
    {
        settingButton = transform.Find("SettingButton").GetComponent<Button>();
        settingButton.onClick.AddListener(() =>
        {
            ViewManager.Show<UISetting>();
            ViewManager.Close<UIMain>();
        });
    }
}4.UISetting.cs

using UnityEngine.UI;

public class UISetting : View
{
    private Button backButton;
    public override void Init()
    {
        backButton = transform.Find("BackButton").GetComponent<Button>();
        backButton.onClick.AddListener(() =>
        {
            ViewManager.Show<UIMain>();
            ViewManager.Close<UISetting>();
        });
    }
}5.测试加载UI界面

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

public class Booster : MonoBehaviour
{
    void Awake()
    {
        Instantiate(Resources.Load<GameObject>("UIRoot"));//实例化UI根节点
        new ViewManager();
    }

}以上就是所有有关简易UIManager框架就已经完成了。
如果觉得这对你有用的话麻烦点个赞同呀!感谢观看!!!。
<hr/>------------------后续我会更新选中UI节点自动生成对应的UI脚本,让我们的开发更加快速,便捷。---------------

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 07:37 , Processed in 0.119872 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表