hand
_1_7_137
4
返回栏目
1k
0.2k
0.5k
0.1k
0k
0.2k
0k
0.7k
0k
0k
0.4k
0.1k
4k
0.2k
0.1k
2k
0.2k
0.2k
0k
0k
0.5k
0k
0.9k
0.1k
1k
0.9k
2k
1k
2k
0.9k
1k
0k
1k
0k
1k
1k
1k
1k
0k
1k
1k
1k
0k
3k
1k
0k
0.3k
1k
0.3k
0.9k
0k
8k
9k
6k
2k
1k
2k
1k
1k
2k
0.6k
1k
0.6k
1k
0.5k
0.2k
2k
2k
2k
1k
2k
0k
0.8k
0.8k
1k
0k
0k
0k
0k
0k
0k
0k
0k
0.3k
0.4k
0.8k
0.3k
5k
1k
3k
7k
6k
3k
3k
1k
0.2k
2k
3k
2k
0.4k
0.5k
3k
2k
7k
3k
4k
2k
1k
6k
6k
1k
1k
0.9k
0.2k
0.3k
0.9k
1k
0k
0.8k
2k
0k
0.4k
0.1k
1k
0.9k
0.2k
1k
1k
0.5k
0k
0k
0.4k
4k
0.4k
2k
3k
1k
1k
1k
3k
5k
0k
1k
2k
0.5k
0k
1k
0k
1k
0.5k
0.8k
返回Unity - 游戏引擎栏目
作者:
贺及楼
成为作者
更新日期:2023-09-17 11:01:23
BasePanel.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/// <summary>
/// 通过代码,快速找到所有子控件
/// </summary>
public class BasePanel : MonoBehaviour
{
private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();//里氏转换,所有控件
// Start is called before the first frame update
void Awake()
{
FindChildrenControl<Button>();
FindChildrenControl<Image>();
FindChildrenControl<Toggle>();
FindChildrenControl<Text>();
FindChildrenControl<Scrollbar>();
FindChildrenControl<ScrollRect>();
FindChildrenControl<Slider>();
}
/// <summary>
/// 显示
/// </summary>
public virtual void ShowMe()
{
}
/// <summary>
/// 隐藏
/// </summary>
public virtual void HideMe()
{
}
/// <summary>
/// 得到对应名字的控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="controlName"></param>
/// <returns></returns>
protected T GetControl<T>(string controlName)where T: UIBehaviour
{
if (controlDic.ContainsKey(controlName))
{
//for循环字典
for(int i = 0; i < controlDic[controlName].Count; ++i)
{
if(controlDic[controlName][i] is T)
{
return controlDic[controlName][i] as T;
}
}
}
return null;
}
/// <summary>
/// 找Panel的控件们
/// </summary>
/// <typeparam name="T"></typeparam>
private void FindChildrenControl<T>() where T: UIBehaviour
{
T[] controls = this.GetComponentsInChildren<T>();//Panel所有的Button组件
//循环找所有控件,保存到字典里
for (int i = 0; i < controls.Length; ++i)
{
string objName = controls[i].gameObject.name;//这是控件名字
//字典有就加,没有就新建
if (controlDic.ContainsKey(objName))
controlDic[objName].Add(controls[i]);
else
controlDic.Add(objName, new List<UIBehaviour>() { controls[i] });
}
}
}
UIManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//枚举,UI层级
public enum E_UI_Layer
{
Bot,
Mid,
Top,
System,
}
public class UIManager : BaseManager<UIManager>
{
public Dictionary<string, BasePanel> panelDict = new Dictionary<string, BasePanel>();
//层级
private Transform bot;//获得bot
private Transform mid;//获得mid
private Transform top;//获得top
private Transform system;//获得system
/// <summary>
/// 构造函数:创建Canvas和EventSystem
/// </summary>
public UIManager()
{
GameObject obj = ResourcesManager.GetInstance().Load<GameObject>("UI/Canvas");
Transform canvas = obj.transform;
Object.DontDestroyOnLoad(obj);//过场景不移除
//找到各层
bot = canvas.Find("Bot");
mid = canvas.Find("Mid");
top = canvas.Find("Top");
system = canvas.Find("System");
GameObject es = ResourcesManager.GetInstance().Load<GameObject>("UI/EventSystem");
Object.DontDestroyOnLoad(es);//过场景不移除
}
/// <summary>
/// 显示面板
/// </summary>
/// <typeparam name="T">面板脚本类型</typeparam>
/// <param name="panelName">面板名</param>
/// <param name="layer">层级(可不填)</param>
/// <param name="callBack">创建面板预设成功后做的事(可不填)</param>
public void ShowPanel<T>(string panelName,E_UI_Layer layer = E_UI_Layer.Mid,UnityAction<T> callBack = null)where T:BasePanel
{
if (panelDict.ContainsKey(panelName))
{
panelDict[panelName].ShowMe();
if (callBack != null)
callBack(panelDict[panelName] as T); return;
}
ResourcesManager.GetInstance().LoadAsync<GameObject>("UI/" + panelName, (obj) =>
{
//把它作为canvas的子对象,位置
//确定显示层级
Transform father = bot;
switch (layer)
{
case E_UI_Layer.Mid:
father = mid;
break;
case E_UI_Layer.Top:
father = top;
break;
case E_UI_Layer.System:
father = system;
break;
}
//设置父对象 相对位置 大小
obj.transform.SetParent(father);
obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one;
(obj.transform as RectTransform).offsetMax = Vector3.zero;
(obj.transform as RectTransform).offsetMin = Vector3.zero;
//得到预设体身上的脚本
T panel = obj.GetComponent<T>();
if (callBack != null)
callBack(panel);
//保存在字典里
panelDict.Add(panelName, panel);
});
}
/// <summary>
/// 隐藏
/// </summary>
public void HidePanel(string panelName)
{
if (panelDict.ContainsKey(panelName))
{
panelDict[panelName].HideMe();
GameObject.Destroy(panelDict[panelName].gameObject);
panelDict.Remove(panelName);
}
}
}
Unity - 游戏引擎
整章节共151节
快分享给你的小伙伴吧 ~