简单的UI框架
开发OnEnter和OnPause的调用
处理主菜单的OnPause暂停
一、开发OnEnter和OnPause的调用
OnEnter方法表示让界面显示出来的方法。
OnPause方法表示弹出了一个界面,让其他界面暂停,即与鼠标不交互。
首先我们要将这两个方法定义在我们的基类上,即BasePanel上。
/// <summary>
/// 界面被显示出来
/// </summary>
public virtual void OnEnter()
{
}
/// <summary>
/// 界面暂停
/// </summary>
public virtual void OnPause()
{
}
这里我们在基类定义为虚函数,它与非虚函数的主要区别在于它的实现可以在派生类中进行重写,我们后面会在他的派生类中重写,所以定义为虚函数。
当我们把一个界面入栈的时候,应该触发OnEnter方法,所以我们在UIManager脚本中的PushPanel方法加入
public void PushPanel(UIType panelType)
{
if(panelStack == null)
panelStack = new Stack<BasePanel>();
BasePanel panel = GetPanel(panelType);
panel.OnEnter();
panelStack.Push(panel);
}
当我们往栈里面加入一个新的界面的时候,如果这个栈里面已经有界面了,我们应该把已有的界面暂停掉,再去添加新的界面。
所以我们在添加页面之前,先判断一下栈里面是否有页面。
public void PushPanel(UIType panelType)
{
if(panelStack == null)
panelStack = new Stack<BasePanel>();
///判断一下栈里面是否有页面
if (panelStack.Count > 0)
{
}
BasePanel panel = GetPanel(panelType);
panel.OnEnter();
panelStack.Push(panel);
}
如果这个栈里面有界面的话,我们应该取到栈顶的界面,让栈顶界面暂停。
public void PushPanel(UIType panelType)
{
if(panelStack == null)
panelStack = new Stack<BasePanel>();
///判断一下栈里面是否有页面
if (panelStack.Count > 0)
{
BasePanel topPanel = panelStack.Peek();
topPanel.OnPause();
}
BasePanel panel = GetPanel(panelType);
panel.OnEnter();
panelStack.Push(panel);
}
这里我们用到了栈里面的Peek方法,他表示只取出栈顶的界面。
我们取出之后调用OnPause方法就可以了。
二、处理主菜单的OnPause暂停
我们需要在MainMenuPanel脚本中重写这个OnPause方法。
public override void OnPause()
{
}
override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数,使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)就是自己定义方法的作用比如object类的tostring()方法,你可以重写让他输出你想要的内容。
我们怎么让界面暂停呢,就是让我们的界面不再与鼠标交互。
在MainMenuPanel上加入一个新的组件CanvasGroup。
红色箭头所指的为是否与鼠标交互,取消勾选就代表不与鼠标交互,所以我们直接在脚本中控制这个组件即可。
我们回到MainMenuPanel脚本。
首先定义一个参数控制这个组件,再通过Start方法获得这个组件。
private CanvasGroup canvasGroup;
void Start()
{
canvasGroup = GetComponent<CanvasGroup>();
}
在重写的OnPause方法中控制这个组件的功能。
private CanvasGroup canvasGroup;
void Start()
{
canvasGroup = GetComponent<CanvasGroup>();
}
public override void OnPause()
{
canvasGroup.blocksRaycasts = false;//当弹出新的面板的时候,让主菜单面板不再和鼠标交互
}
我们运行后发现,比如我们点开任务界面,我们主界面上的东西就控制不了了。
总结
今天我们基本上处理完毕OnEnter方法和OnPause方法,接下来我们还要处理,界面继续OnResume方法,界面关闭OnExit方法。