基于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>(&#34;UIPrefab&#34;);//加载UIPrefab文件夹下的所有UI预制体
foreach (Transform view in prefabs)
{
if (!m_views.ContainsKey(view.name))
{
Transform prefab = Instantiate(view,transform);
prefab.name = prefab.name.Replace(&#34;(Clone)&#34;, &#34;&#34;);//去除实例化物体的(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=&#34;T&#34;></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=&#34;T&#34;></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=&#34;T&#34;></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(&#34;SettingButton&#34;).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(&#34;BackButton&#34;).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>(&#34;UIRoot&#34;));//实例化UI根节点
new ViewManager();
}
}以上就是所有有关简易UIManager框架就已经完成了。
如果觉得这对你有用的话麻烦点个赞同呀!感谢观看!!!。
<hr/>------------------后续我会更新选中UI节点自动生成对应的UI脚本,让我们的开发更加快速,便捷。---------------
页:
[1]