305 lines
7.6 KiB
C#
305 lines
7.6 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using DG.Tweening;
|
||
using System;
|
||
using AFeijia.UI;
|
||
|
||
public class PanelBasic : UITool
|
||
{
|
||
/// <summary>
|
||
/// UI类型
|
||
/// </summary>
|
||
public string panel_type;
|
||
public int id;
|
||
/// <summary>
|
||
/// 主界面,执行动画
|
||
/// </summary>
|
||
public Image main_panel_image;
|
||
///// <summary>
|
||
///// 遮罩背景
|
||
///// </summary>
|
||
public Image mask_back_ground;
|
||
|
||
/// <summary>
|
||
/// 弹窗关闭调用事件
|
||
/// </summary>
|
||
private Action<bool> on_popup_end_callback;
|
||
/// <summary>
|
||
/// 弹窗处理结果
|
||
/// </summary>
|
||
private bool on_popup_end_result;
|
||
/// <summary>
|
||
/// 界面栈,用于返回上一个关闭的页面
|
||
/// </summary>
|
||
public static Stack<PanelBasic> panel_stack = new Stack<PanelBasic>();
|
||
/// <summary>
|
||
/// 当前页面
|
||
/// </summary>
|
||
public static PanelBasic current_panel;
|
||
/// <summary>
|
||
/// 界面路径,从main_panel到current_panel的路由
|
||
/// </summary>
|
||
public Stack<PanelBasic> panel_route = new Stack<PanelBasic>();
|
||
/// <summary>
|
||
/// 是否初始化
|
||
/// </summary>
|
||
private bool inited;
|
||
|
||
protected override void Awake()
|
||
{
|
||
if (!inited)
|
||
{
|
||
base.Awake();
|
||
inited = true;
|
||
}
|
||
}
|
||
|
||
public void Init_Awake()
|
||
{
|
||
if (!inited)
|
||
{
|
||
base.Awake();
|
||
inited = true;
|
||
}
|
||
}
|
||
|
||
#region 弹窗
|
||
|
||
/// <summary>
|
||
/// 启用弹窗
|
||
/// </summary>
|
||
/// <param name="_main_panel"></param>
|
||
/// <param name="_mask"></param>
|
||
/// <param name="_callback"></param>
|
||
public virtual void OnPopup(Action<bool> _callback = null)
|
||
{
|
||
if (PanelEnable())
|
||
{
|
||
if (main_panel_image != null)
|
||
{
|
||
Sequence sequence = DOTween.Sequence();
|
||
sequence.Append(main_panel_image.transform.DOScale(new Vector3(1.1f, 1.1f, 1.1f), 0.2f));
|
||
sequence.Append(main_panel_image.transform.DOScale(new Vector3(1, 1, 1), 0.1f).SetDelay(0.025f));
|
||
}
|
||
|
||
if (mask_back_ground != null)
|
||
mask_back_ground.DOColor(new Color(0, 0, 0, 0.5f), 0.2f);
|
||
|
||
on_popup_end_callback = _callback;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 弹窗关闭
|
||
/// </summary>
|
||
/// <param name="_result"> 弹窗处理结果</param>
|
||
public virtual void OnPopupEnd(bool _result = false)
|
||
{
|
||
on_popup_end_result = _result;
|
||
if (main_panel_image != null)
|
||
{
|
||
Sequence sequence = DOTween.Sequence();
|
||
sequence.Append(main_panel_image.transform.DOScale(new Vector3(1.1f, 1.1f, 1.1f), 0.1f));
|
||
sequence.Append(main_panel_image.transform.DOScale(new Vector3(0, 0, 0), 0.2f).SetDelay(0.025f)).OnComplete(() => { PanelDisable(OnPopupEndCallback); });
|
||
}
|
||
else
|
||
{
|
||
PanelDisable(OnPopupEndCallback);
|
||
}
|
||
|
||
if (mask_back_ground != null)
|
||
mask_back_ground.DOColor(new Color(0, 0, 0, 0f), 0.2f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 弹窗处理回调
|
||
/// </summary>
|
||
private void OnPopupEndCallback()
|
||
{
|
||
on_popup_end_callback?.Invoke(on_popup_end_result);
|
||
on_popup_end_callback = null;
|
||
}
|
||
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 若开启,则关闭;若关闭,则开启
|
||
/// </summary>
|
||
public virtual void OnSwitch()
|
||
{
|
||
if (gameObject.activeSelf)
|
||
OnNagetive();
|
||
else
|
||
OnActive();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 启用界面
|
||
/// </summary>
|
||
/// <param name="_main_panel"></param>
|
||
/// <param name="_mask"></param>
|
||
/// <param name="_callback"></param>
|
||
public virtual void OnActive(Image _main_panel = null, Image _mask = null, Action _callback = null)
|
||
{
|
||
PanelEnable();
|
||
if (_main_panel == null)
|
||
_main_panel = main_panel_image;
|
||
if (_main_panel != null)
|
||
{
|
||
Sequence sequence = DOTween.Sequence();
|
||
sequence.Append(_main_panel.transform.DOScale(new Vector3(1.1f, 1.1f, 1.1f), 0.2f));
|
||
sequence.Append(_main_panel.transform.DOScale(new Vector3(1, 1, 1), 0.1f).SetDelay(0.025f));
|
||
}
|
||
|
||
if (_mask == null)
|
||
_mask = mask_back_ground;
|
||
if (_mask != null)
|
||
_mask.DOColor(new Color(0, 0, 0, 0.5f), 0.2f);
|
||
_callback?.Invoke();
|
||
OnPanelOpened();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 启用界面
|
||
/// </summary>
|
||
/// <param name="_nagetive_panel"> 关闭的界面 </param>
|
||
public virtual void OnActive(PanelBasic _nagetive_panel)
|
||
{
|
||
//关闭其他界面
|
||
if (_nagetive_panel != null)
|
||
{
|
||
_nagetive_panel.OnNagetive();
|
||
panel_stack.Push(_nagetive_panel);
|
||
}
|
||
|
||
//打开自己界面
|
||
OnActive(null, null, null);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关闭界面
|
||
/// </summary>
|
||
/// <param name="_main_panel"> 执行动画的载体</param>
|
||
/// <param name="_mask"> 遮罩</param>
|
||
/// <param name="_callback"> 回调事件</param>
|
||
public virtual void OnNagetive(Image _main_panel = null, Image _mask = null, Action _callback = null)
|
||
{
|
||
|
||
if (_main_panel == null)
|
||
_main_panel = main_panel_image;
|
||
if (_main_panel != null)
|
||
{
|
||
Sequence sequence = DOTween.Sequence();
|
||
sequence.Append(_main_panel.transform.DOScale(new Vector3(1.1f, 1.1f, 1.1f), 0.1f));
|
||
sequence.Append(_main_panel.transform.DOScale(new Vector3(0, 0, 0), 0.2f).SetDelay(0.025f)).OnComplete(PanelDisable);
|
||
}
|
||
else
|
||
{
|
||
PanelDisable();
|
||
}
|
||
|
||
if (_mask == null)
|
||
_mask = mask_back_ground;
|
||
if (_mask != null)
|
||
_mask.DOColor(new Color(0, 0, 0, 0f), 0.2f);
|
||
_callback?.Invoke();
|
||
OnPanelClosed();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关闭界面
|
||
/// </summary>
|
||
/// <param name="_active_last_panel"> 是否启用上一个关闭的界面 </param>
|
||
public virtual void OnNagetive(bool _active_last_panel)
|
||
{
|
||
if (_active_last_panel)
|
||
{
|
||
if (panel_stack.Count > 0)
|
||
panel_stack.Pop().OnActive();
|
||
}
|
||
OnNagetive(null, null, null);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加收起的面板
|
||
/// </summary>
|
||
public virtual PanelBasic PushPanel()
|
||
{
|
||
panel_stack.Push(this);
|
||
return this;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 返回上一个Panel
|
||
/// </summary>
|
||
public virtual PanelBasic PopPanel()
|
||
{
|
||
PanelBasic _panel = null;
|
||
if (panel_stack.Count > 0)
|
||
_panel = panel_stack.Pop();
|
||
return _panel;
|
||
}
|
||
|
||
protected virtual void OnPanelClosed()
|
||
{
|
||
|
||
}
|
||
|
||
protected virtual void OnPanelOpened()
|
||
{
|
||
|
||
}
|
||
|
||
protected virtual void OnEnable()
|
||
{
|
||
current_panel = this;
|
||
}
|
||
|
||
protected virtual void OnDisable()
|
||
{
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 显示面板
|
||
/// </summary>
|
||
private bool PanelEnable()
|
||
{
|
||
if (!gameObject.activeSelf)
|
||
{
|
||
gameObject.SetActive(true);
|
||
return true;
|
||
}
|
||
else
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 显示面板
|
||
/// </summary>
|
||
private void PanelEnable(Action _callback)
|
||
{
|
||
gameObject.SetActive(true);
|
||
_callback?.Invoke();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 隐藏面板
|
||
/// </summary>
|
||
private void PanelDisable()
|
||
{
|
||
gameObject.SetActive(false);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 隐藏面板
|
||
/// </summary>
|
||
private void PanelDisable(Action _callback)
|
||
{
|
||
gameObject.SetActive(false);
|
||
_callback?.Invoke();
|
||
}
|
||
}
|