简单的UI框架 | 九、开发OnEnter和OnPause的调用以及处理主菜单的OnPause暂停

简单的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方法。

猜你喜欢

转载自blog.csdn.net/m0_64058685/article/details/124640694