using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// UI界面基类
///
public class BasePanel : MonoBehaviour
{
///
/// 存储控件的字典,键为控件的完整路径,值为控件列表
///
private readonly Dictionary> controlDic = new Dictionary>();
///
/// 初始化控件字典并添加事件监听器
///
protected virtual void Awake()
{
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
FindChildrenControl();
}
///
/// 根据控件名称获取控件
///
/// 控件类型
/// 控件名称
/// 控件实例
public T GetControl(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;
}
///
/// 查找子控件并添加到字典中,同时添加事件监听器
///
/// 控件类型
public void FindChildrenControl() where T : UIBehaviour
{
T[] controls = GetComponentsInChildren(true);
for (int i = 0; i < controls.Length; i++)
{
string controlPath = controls[i].gameObject.name;
if (controlDic.ContainsKey(controlPath))
{
controlDic[controlPath].Add(controls[i]);
}
else
{
controlDic.Add(controlPath, new List() { controls[i] });
}
if (controls[i] is Button button)
{
button.onClick.AddListener(() =>
{
OnClick(controlPath);
});
}
else if (controls[i] is Toggle toggle)
{
toggle.onValueChanged.AddListener((value) =>
{
OnChangeToggle(controlPath, value);
});
}
else if (controls[i] is Slider slider)
{
slider.onValueChanged.AddListener((value) =>
{
OnChangeSlider(controlPath, value);
});
}
else if (controls[i] is InputField inputField)
{
inputField.onValueChanged.AddListener((value) =>
{
OnInputChange(controlPath, value);
});
}
}
}
///
/// 显示当前面板
///
public async virtual void ShowMe(int time = 0)
{
await UniTask.DelayFrame(time);
gameObject.SetActive(true);
}
///
/// 隐藏当前面板
///
public async virtual void HideMe(int time = 0)
{
await UniTask.DelayFrame(time);
gameObject.SetActive(false);
}
///
/// 按钮点击事件处理
///
/// 按钮的完整路径
protected virtual void OnClick(string btnPath)
{
// 处理按钮点击事件
}
///
/// Toggle切换事件处理
///
/// Toggle的完整路径
/// Toggle的状态
protected virtual void OnChangeToggle(string togglePath, bool isOn)
{
// 处理Toggle切换事件
}
///
/// Slider值变化事件处理
///
/// Slider的完整路径
/// Slider的当前值
protected virtual void OnChangeSlider(string sliderPath, float value)
{
// 处理Slider值变化事件
}
///
/// InputField值变化事件处理
///
/// InputField的完整路径
/// InputField的当前值
protected virtual void OnInputChange(string inputPath, string value)
{
// 处理InputField值变化事件
}
}