GameFrameWork框架(Unity3D)使用笔记(四)ProcedureMenu更多的界面

前言:

        上一篇我已经成功将菜单页面加载了出来。

        这一次的主要内容是,完成主菜单上四个按钮的点击事件,并且完成其它俩个菜单界面的加载。

开搞界面:

        既然已经有了菜单主界面的经验,其它几个界面照做就行了。

        (由于本次项目的目的在于较为完整地走完使用GameFormWork的流程, 细节部分就不打磨了,界面里面的内容就做做样子。

1、Setting界面

        先搞一下界面的预制体:

        由于我们这次项目不搞音乐也不搞本地化也不搞,所以。。。设置里面好像暂时没啥好设置的(那就做个样子叭暂时。。。不过那些东西以后肯定会搞的!)

        

然后做成预制体:

 然后写界面的脚本:

同样,继承之前已经写好的UGuiForm类:

写好的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace ShadowU
{
    public class SettingForm :  UGuiForm
    {
        public Button m_ConfirmButton;  //确认按钮
        public Button m_CancelButton;   //取消按钮

        protected override void OnOpen(object userData)
        {
            base.OnOpen(userData);
            //挂一下按钮事件:
            m_ConfirmButton.onClick.AddListener(OnConfirmButtonDown);
            m_CancelButton.onClick.AddListener(OnCancelButtonDown);
        }
        private void OnConfirmButtonDown()
        {
            //StarForce里的逻辑是  判断语言设置是否更改,如果更改了那么就执行下面的部分,如果没有更改只需要Close() 关闭Form即可


            //将设置的值应用到GameEntry.Setting  Sound等地方
            //由于没搞音乐和语言上的这地方暂时没啥东西好写

            UnityGameFramework.Runtime.GameEntry.Shutdown(UnityGameFramework.Runtime.ShutdownType.Restart); //重启!
        }
        private void OnCancelButtonDown()
        {
            Close();//关闭面板
        }
    }
}


然后在inspector里面把按钮拖进去:

 然后设置一下MenuForm.cs:

然后运行!

 

 点击设置按钮:

可以,界面跳换了。

然后再点击取消:

可以 又回来了:

那咱们再进去点击一下确认按钮看看:

可以,红一片。

那么这次是哪里出了问题呢?

先看看报告:

问题原因和解决:

(1)首先是:

Coroutine couldn't be started because the game object xxx is inactive!

(虽然这个报错并不影响运行,花桑的塔防demo也有这个报错)

解决办法很简单,对比StarForce代码,之前我在写ProcedureMenu的时候省略了一点东西:

我把和这个变量有关的内容删了。

而在StarForce里面,这个变量及其相关代码的作用就是在流程退出的时候以关闭这个菜单:

加上后,报错就解决了。(如果把StarForce的删掉后,它也会报错)。(原理就是在框架关闭的时候调用UI模块关闭所有界面的函数之前,即在菜单流程结束的时候,提前关闭这个界面,避免被调用Resume())

或者不用协程实现面板的淡入淡出,也能解决。

或者直接不解决,因为只有在框架shutdown关闭多个面板的时候会出现这个问题,即便报错也没啥影响。

 追溯问题来源后,发现是执行Resume的时候因为Menu是inactive:

但是在父类的Resume里面已经执行过使其为Active的函数了:

即便我这样写:

输出还是False!:

 这就很奇怪。

我把StarForce的菜单流程里关闭菜单界面的代码删掉,这里加上Log输出的信息也是两个False。。。

我花了很久时间看源码和调试,仍然不知道为啥。

后来在大佬群得到了解决:

A GameObject may be inactive because a parent is not active. In that case, calling SetActive will not activate it, but only set the local state of the GameObject, which you can check using GameObject.activeSelf. Unity can then use this state when all parents become active.
 

(来自官方文档) 

而这里如果这么写的话:

 结果就是:

 说明不是SetActive的问题,它确实设置了selfActive为true,但是由于父节点为InActive,所以调用用active是false。

 (2)然后是其它报错。。。。。(xxx组件已存在)

        Game Frame Work Component type xxx is already exist

        这个是框架启动的时候报的错误。

        经过调试发现,点击设置,然后点击确定,可以正常重启。

        但是点击了设置,点击取消;再点击设置,再确定的时候,就重启失败了。

        经过调试发现,按钮的逻辑执行了两次。。。。也就是重复启动了。。。

        然后才知道是因为Open的时候AddListener后要在Close的时候Remove。

        因为框架的界面Close后,并不会消除,只是变为了InActive:

所以下次Open的时候就会重复AddLilstener。 

所以加上以下代码就解决了:

 然后终于完成了设置界面的确认和取消界面切换功能!

(这地方搁了很久,但是确实学到了不少东西)、

2、About界面

        这个界面有点不一样,但是逻辑很简单。

        就是(滚动)显示界面内容,然后检测到鼠标点击则返回主菜单。

        滚动很简单,提前写好内容在界面里面,获取对应UI物体的RectTransform,然后在AboutForm脚本的update里面更新它的position达到滚动屏幕的效果。

        然后我们只需要实现点击屏幕回到主菜单的功能。

        简单,做一个大的隐形按钮挡住界面。

 

退出按钮

很简单,只需要调用框架的shutdown:

总结

至此主菜单及各个界面之间切换的几个功能基本完成。中间鸽了几天用来解决中间遇到的bug了,解决过程中读了大量源码,理解得到了进一步提升。

下一步就开始搞主要的游戏流程的内容了。

        

        

猜你喜欢

转载自blog.csdn.net/HowToPause/article/details/127312954