学习日记#03
Unity
BasePanel
public virtual void OnEnter() {
}
public virtual void OnResume() {
}
public virtual void On
UIManager
// 存储实例化后的界面
private Dictionary<UIPanelType, BasePanel> _panelDic = new Dictionary<UIPanelType, BasePanel>();
//
private Transform canvasTrans;
public Transform CanvasTrans
{
get
{
if (null == canvasTrans)
{
canvasTrans = GameObject.Instantiate(Resources.Load<GameOjbect>());
}
}
}
// 实例化界面
public void GetPanel(UIPanelType uIPanelType)
{
BasePanel panel;
panelDic.TryGetValue(uIPanelType, out panel);
if (null == panel)
{
// 界面未被实例化
string path;
panelPathDic.TryGetValue(uIPanelType, out path);
if (null == path)
{
throw $"路径错误,{uIPanelType} 路径找不到";
}
else
{
GameObject instancePanel = GameObject.Instantiate(Resources.Load<GameObject>(path));
instancePanel.transform.SetParent(CanvasTrans, false);
AddScriptComponent(uIpanelType, panel);
panelDic.Add(uIpanelType, GetAndAddComponent<BasePanel>(instancePanel));
}
}
else // 界面已实例化
{
}
}
// 反射用于动态添加脚本非常好用,可以使用字符串,这样就只需要脚本有命名规范
public void AddScriptComponent(UIPanelType uIPanelType, GameObject go)
{
string str =System.Enum.GetName(uIPanelType.GetType(), uIPanelType);
string scriptName = str + "Panel";
Type scriptType = Type.GetType(scriptName);
if (!go.GetComponent(scriptType))
{
go.AddComponent(scriptType);
}
}
// 检查BasePanel 用于dictionary
public T GetAndAddComponent<T>(GameObject go) where T : Component
{
if(!go.GetComponent<T>())
{
go.AddComponent<T>();
}
return go.GetComponent<T>();
}
MainmenuPanel
private Button taskBtn;
private Button shopBtn;
private Button skillBtn;
private Button systemBtn;
private Button bagBtn;
void Start()
{
// 初始化... Find("path");
// 添加监听 .onClick.AddListener(delegate(){OnClickBtn(UIPanelType uIPanelType)});
}
private void OnClickBtn(UIPanelType uIPanelType)
{
UIManager.Instance.GetPanel(uIPanelType);
}
UI状态解析
栈管理事件触发层级,通过PushPanel方法得到Panel,将GetPanel私有
private Stack<BasePanle> panleStack = new();
public void PushPanel(UIPanelType uIPanelType)
{
if(panelStack.Count > 0){
BasePanel topPanel = panelStack.Peek();
topPanel.OnPause();
}
BasePanel basePanel = GetPanel(uIPanelType);
panel.OnEnter();
panelStack.Push(basePanel);
}
public void PopPanel()
{
if (panelSatck.Count <= 0)
{
return;
}
BasePanel topPanel = panelStack.Pop();
topPanel.OnExit();
if (panelStack.Count <= 0)
{
return;
}
BasePanel newPanel = panelStack.Peek();
newPanel.OnResume();
}
MainmenuPanel
public override void OnEnter()
{
}
public override void OnPause()
{
}
public override void OnResume()
{
}
public override void OnExie()
{
}
public class BasePanel :
{
protected CanvasGroup canvasGroup;
protected Transform closeTrans;
protected Button closeBtn;
public void Awake()
{
}
public OnEnter()
{
canvasGruop
}
}
public override void OnEnter()
{
base.OnEnter();
Vector3 tempPos = transform.localPosition;
tempPos.x = 3000;
transform.localPosion = tempPos;
transform.DOLocalMoveX(0, 1.0f).OnComplete(()=>{
});
}
Canvas Group
Alpha : 透明度
Interactable :可交互性
Blocks Raycasts : 射线检测
Ignore Parent Group: