Ylisar 发表于 2022-9-30 11:13

基于Unity UGUI写一个UIManager框架

引言:

    相信很多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脚本,让我们的开发更加快速,便捷。---------------
页: [1]
查看完整版本: 基于Unity UGUI写一个UIManager框架