UI基類BasePanel
負(fù)責(zé)幫助我們通過代碼快速的找到所有的子控件,方便我們?cè)谧宇愔刑幚磉壿?,?jié)約找控件的工作量。文章來源:http://www.zghlxwxcb.cn/news/detail-636677.html
public class BasePanel : MonoBehaviour
{
//通過里式轉(zhuǎn)換原則 來存儲(chǔ)所有的控件
private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();
// Use this for initialization
protected virtual void Awake () {
FindChildrenControl<Button>();
FindChildrenControl<Image>();
FindChildrenControl<Text>();
FindChildrenControl<Toggle>();
FindChildrenControl<Slider>();
FindChildrenControl<ScrollRect>();
FindChildrenControl<InputField>();
}
/// <summary>
/// 顯示自己
/// </summary>
public virtual void ShowMe()
{
}
/// <summary>
/// 隱藏自己
/// </summary>
public virtual void HideMe()
{
}
protected virtual void OnClick(string btnName)
{
}
protected virtual void OnValueChanged(string toggleName, bool value)
{
}
/// <summary>
/// 得到對(duì)應(yīng)名字的對(duì)應(yīng)控件腳本
/// </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( int i = 0; i <controlDic[controlName].Count; ++i )
{
if (controlDic[controlName][i] is T)
return controlDic[controlName][i] as T;
}
}
return null;
}
/// <summary>
/// 找到子對(duì)象的對(duì)應(yīng)控件
/// </summary>
/// <typeparam name="T"></typeparam>
private void FindChildrenControl<T>() where T:UIBehaviour
{
T[] controls = this.GetComponentsInChildren<T>();
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] });
//如果是按鈕控件
if(controls[i] is Button)
{
(controls[i] as Button).onClick.AddListener(()=>
{
OnClick(objName);
});
}
//如果是單選框或者多選框
else if(controls[i] is Toggle)
{
(controls[i] as Toggle).onValueChanged.AddListener((value) =>
{
OnValueChanged(objName, value);
});
}
}
}
}
UI管理模塊UIManager
管理所有顯示的面板,提供給外部 顯示和隱藏等等方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-636677.html
/// <summary>
/// UI層級(jí)
/// </summary>
public enum E_UI_Layer
{
Bot,
Mid,
Top,
System,
}
/// <summary>
/// UI管理器
/// 1.管理所有顯示的面板
/// 2.提供給外部 顯示和隱藏等等接口
/// </summary>
public class UIManager : BaseManager<UIManager>
{
public Dictionary<string, BasePanel> panelDic = new Dictionary<string, BasePanel>();
private Transform bot;
private Transform mid;
private Transform top;
private Transform system;
//記錄我們UI的Canvas父對(duì)象 方便以后外部可能會(huì)使用它
public RectTransform canvas;
public UIManager()
{
//創(chuàng)建Canvas 讓其過場(chǎng)景的時(shí)候 不被移除
GameObject obj = ResMgr.GetInstance().Load<GameObject>("UI/Canvas");
canvas = obj.transform as RectTransform;
GameObject.DontDestroyOnLoad(obj);
//找到各層
bot = canvas.Find("Bot");
mid = canvas.Find("Mid");
top = canvas.Find("Top");
system = canvas.Find("System");
//創(chuàng)建EventSystem 讓其過場(chǎng)景的時(shí)候 不被移除
obj = ResMgr.GetInstance().Load<GameObject>("UI/EventSystem");
GameObject.DontDestroyOnLoad(obj);
}
/// <summary>
/// 通過層級(jí)枚舉 得到對(duì)應(yīng)層級(jí)的父對(duì)象
/// </summary>
/// <param name="layer"></param>
/// <returns></returns>
public Transform GetLayerFather(E_UI_Layer layer)
{
switch(layer)
{
case E_UI_Layer.Bot:
return this.bot;
case E_UI_Layer.Mid:
return this.mid;
case E_UI_Layer.Top:
return this.top;
case E_UI_Layer.System:
return this.system;
}
return null;
}
/// <summary>
/// 顯示面板
/// </summary>
/// <typeparam name="T">面板腳本類型</typeparam>
/// <param name="panelName">面板名</param>
/// <param name="layer">顯示在哪一層</param>
/// <param name="callBack">當(dāng)面板預(yù)設(shè)體創(chuàng)建成功后 你想做的事</param>
public void ShowPanel<T>(string panelName, E_UI_Layer layer = E_UI_Layer.Mid, UnityAction<T> callBack = null) where T:BasePanel
{
if (panelDic.ContainsKey(panelName))
{
panelDic[panelName].ShowMe();
// 處理面板創(chuàng)建完成后的邏輯
if (callBack != null)
callBack(panelDic[panelName] as T);
//避免面板重復(fù)加載 如果存在該面板 即直接顯示 調(diào)用回調(diào)函數(shù)后 直接return 不再處理后面的異步加載邏輯
return;
}
ResMgr.GetInstance().LoadAsync<GameObject>("UI/" + panelName, (obj) =>
{
//把他作為 Canvas的子對(duì)象
//并且 要設(shè)置它的相對(duì)位置
//找到父對(duì)象 你到底顯示在哪一層
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;
}
//設(shè)置父對(duì)象 設(shè)置相對(duì)位置和大小
obj.transform.SetParent(father);
obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one;
(obj.transform as RectTransform).offsetMax = Vector2.zero;
(obj.transform as RectTransform).offsetMin = Vector2.zero;
//得到預(yù)設(shè)體身上的面板腳本
T panel = obj.GetComponent<T>();
// 處理面板創(chuàng)建完成后的邏輯
if (callBack != null)
callBack(panel);
panel.ShowMe();
//把面板存起來
panelDic.Add(panelName, panel);
});
}
/// <summary>
/// 隱藏面板
/// </summary>
/// <param name="panelName"></param>
public void HidePanel(string panelName)
{
if(panelDic.ContainsKey(panelName))
{
panelDic[panelName].HideMe();
GameObject.Destroy(panelDic[panelName].gameObject);
panelDic.Remove(panelName);
}
}
/// <summary>
/// 得到某一個(gè)已經(jīng)顯示的面板 方便外部使用
/// </summary>
public T GetPanel<T>(string name) where T:BasePanel
{
if (panelDic.ContainsKey(name))
return panelDic[name] as T;
return null;
}
/// <summary>
/// 給控件添加自定義事件監(jiān)聽
/// </summary>
/// <param name="control">控件對(duì)象</param>
/// <param name="type">事件類型</param>
/// <param name="callBack">事件的響應(yīng)函數(shù)</param>
public static void AddCustomEventListener(UIBehaviour control, EventTriggerType type, UnityAction<BaseEventData> callBack)
{
EventTrigger trigger = control.GetComponent<EventTrigger>();
if (trigger == null)
trigger = control.gameObject.AddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = type;
entry.callback.AddListener(callBack);
trigger.triggers.Add(entry);
}
}
-
測(cè)試代碼
public class LoginPanel : BasePanel
{
public void InitData() {
Debug.Log("初始化信息!");
}
// Start is called before the first frame update
void Start()
{
//GetControl<Button>("btnLogin").onClick.AddListener(()=> {
// Debug.Log("我被點(diǎn)擊了");
//});
// GetControl<Button>("btnExit").onClick.AddListener(()=> {
// Debug.Log("我要退出了");
// this.gameObject.SetActive(false);
// });
UIManager.AddCustomEventListener(GetControl<Button>("btnExit"), EventTriggerType.PointerEnter, (data) =>
{
Debug.Log("我要進(jìn)入了");
});
UIManager.AddCustomEventListener(GetControl<Button>("btnExit"), EventTriggerType.PointerExit, (data) =>
{
Debug.Log("我要退出了");
});
}
protected override void OnClick(string btnName)
{
switch (btnName)
{
case "btnLogin":
Debug.Log("我被點(diǎn)擊了");
break;
case "btnExit":
Debug.Log("我要退出了");
break;
default:
break;
}
}
public override void ShowMe()
{
Debug.Log("我顯示出來了!");
}
public override void HideMe()
{
Debug.Log("我要隱藏了!");
}
// Update is called once per frame
void Update()
{
}
}
public class UITest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
UIManager.GetInstance().ShowPanel<LoginPanel>("LoginPanel", E_UI_Layer.Mid, showPanel);
}
void showPanel(LoginPanel loginPanel)
{
loginPanel.InitData();
}
// Update is called once per frame
void Update()
{
}
}
到了這里,關(guān)于程序框架——UI管理模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!