using UnityEngine;
namespace XFramework
{
///
/// 所有UI的父类
/// 用来控制UI的状态
/// 通过构造函数注入参数时 只能在该面板首次弹出时生效 后续只能通过Change 函数实现 因此除非确保构造函数使用的参数不会发生变化 否则不建议使用有参构造
///
public abstract class BasePanel
{
private Transform activePanel;
private UIManager uiManager;
private UIType ui;
protected GameMain Game { get => GameMain.Instance; }
///
/// 当前活动面板
///
public Transform ActivePanel { get => activePanel; set => activePanel = value; }
public UIType UI { get => ui;}
//更新面板数据类
public BasePanel(UIType ui)
{
this.ui = ui;
}
///
/// 初始化面板管理器
///
///
public void Initializa(UIManager manager)
{
uiManager = manager;
}
///
/// 推入一个面板
/// 重复推入的面板 只保留首次推入的实例引用
///
///
public BasePanel Push(BasePanel newPanel)
{
return uiManager?.Push(newPanel);
}
///
/// 隐藏一个面板
///
public void Pop()
{
uiManager?.Pop();
}
///
/// 用于初始化
/// 在UI销毁之前只会执行一次
/// 默认UI不会销毁该方法只执行一次
/// 可重写OnDestory实现销毁改变本方法执行时机
///
protected abstract void InitEvent();
///
/// 每次推出一个面板执行的操作 被push时执行
///
public virtual void OnStart()
{
activePanel.PanelAppearance(true);
activePanel.SetSiblingIndex(activePanel.parent.childCount - 1);
if (!ui.Init)
{
InitEvent();
ui.Init = true;
}
}
///
/// 退出时执行的操作 被pop时执行
/// isDestroy默认值为false,表示不销毁对象
/// 频繁销毁和生成是比较消耗性能的,如果非必要情况建议使isDestroy为false
///
/// 是否销毁
public virtual void OnDestroy(bool isDestroy = false)
{
uiManager?.DestroyUI(ui, isDestroy);
}
///
/// 每次激活时执行的操作
/// 只有被覆盖后 接触覆盖才会执行
///
public virtual void OnEnable()
{
activePanel.GetOrAddComponent().blocksRaycasts = true;
}
///
/// 每次失去激活时执行的操作
/// 比如新推出了一个面板导致本面板被覆盖,当前面板就会执行此方法
///
public virtual void OnDisable()
{
activePanel.GetOrAddComponent().blocksRaycasts = false;
}
///
/// 改变该面板的变量
/// 如果在执行OnDestroy时isDestroy值为false
/// 并且有些Panel类需要在new的时候传递参数
/// 那么就需要使用此方法将新new的类的参数传递给以前的类
///
///
/// 新的面板
public virtual void Change(object newData)
{
}
///
/// 引用类型的数据 避免拆装箱
///
///
public virtual void Change(float newData)
{
}
///
/// 当一个面板可能有多种参数且多种参数发生变化时间不一致时 使用该方法指定参数类型
///
///
///
public virtual void Change(string msgType, object value)
{
}
/////
///// 为下一面板注入参数时调用
/////
/////
//public virtual void ChangeNextPanel(float data)
//{
// uiManager.ChangePanel(data);
//}
//public virtual void ChangeNextPanel(object data)
//{
// uiManager.ChangePanel(data);
//}
///
/// 显示提示文字
///
/// 文字信息
/// 文字颜色
/// 文字位置---当前预制件以屏幕中心为锚点
public virtual void ShowPromoptText(string text,Color textColor,Vector2 anchorePos)
{
ResourcesCreater.InstantiatePrefab("Text_dynamicPrompt",activePanel.transform).GetComponent().ShowPromptText(text,textColor, anchorePos);
}
}
}