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); } } }