[GameFramework]Demo2-切换流程和场景

笨木头  2018-03-6 7:48   Game Framework,Unity3D   阅读(4,223)   17条评论

本文 Game Framework 版本:3.0.9

本文 Unity3D 版本:2017.3

更多GF教程和实例:https://github.com/mutouzdl/gameframework_demo.git

转载请注明,原文地址:http://www.benmutou.com/archives/2548
文章来源:笨木头与游戏开发

来自2018.11.20的补充:切换场景时,需要提供完整路径,之前是我疏忽了,误导了大家。

来自2018.12.18的补充:切换场景时,除了需要提供完整路径外,还需要提供后缀名。

这个Demo是为了和大家展示Game Framework切换场景的方式,但是切换场景又涉及到切换流程,所以就一起介绍了。

1.创建初始场景(Demo2

这个Demo需要三个场景:初始场景(永久存在,不卸载)、菜单场景、游戏场景。

我们先来创建初始场景,创建一个项目,新建一个场景,命名为Demo2,然后创建一个Demo2_ProcedureLaunch.cs脚本:

脚本内如如下:

这是一个很简单的流程类,只要继承ProcedureBase,并且重写OnEnter函数即可。

SceneComponent是专门用于处理场景逻辑的框架组件,其实就是我们一直看到的这个东西:

LoadScene就是用于切换场景的函数(Demo2_Menu是另外一个场景,等会再说),ChangeState函数用于切换流程。

按照官方的示例项目,应该是先在OnEnter切换场景,然后在Update里切换流程,而且有一个专门的流程用于处理这些切换。

本Demo仅作演示功能,不代表最佳实践,请不要随意学习。

我们在进入初始场景时,立刻就切换到菜单场景(旁白:那为什么不直接把菜单场景设为初始场景?)

对,为什么不把菜单场景设为初始场景呢?因为初始场景是用来存放框架基础组件的,所以这个场景是不会被卸载的。在切换场景的时候,实际上只是加载了新场景,初始场景并不会消失(否则那些基础组件不就没了)。

2.创建菜单流程

我们的菜单场景只需要一个功能:点击菜单里的一个按钮后,进入到游戏场景。

新建一个场景,命名为Demo2_Menu,然后创建一个Demo2_ProcedureMenu.cs脚本.

脚本的内容如下:

这是一个很简单的流程类,只要继承ProcedureBase,并且重写OnEnter函数即可。

因为只是Demo,我们只在进入这个流程时打印一条日志。

3.创建测试按钮

因为这个Demo仅展示切换流程和场景,所以不进行加载UI的演示,我们直接用Unity本身的方式创建一个按钮(希望大家不要问我是怎么创建的):

然后再创建一个脚本,用来处理按钮事件,我们命名为Demo2_Controller.cs吧:

最后,在场景里创建一个空的GameObject对象,然后把这个Demo2_Controller脚本拖上去:

啊,不对,还有一个最后,那就是给按钮添加一个点击事件:

这个点击事件自然是我们的EnterGame函数。

4.创建游戏流程

用同样的方式,创建一个新的场景,命名为Demo2_Game,然后创建一个游戏流程脚本(Demo2_ProcedureGame.cs):

由于切换流程需要在继承了ProcedureBase的类里操作,而我们的Demo2_Controller类只是一个普通的MonoBehavior类,所以没法在切换场景的时候同时切换流程。

只好作罢,我们下一个Demo再一起看看怎么用框架的方式加载UI,那样就能进行比较完整的流程和场景切换演示了。本Demo不想太复杂,点到即止。

5.测试一下

为了验证创建的流程是否正常,我们按照Demo1的方式,把Demo2_ProcedureLaunch流程设为初始流程:

OK,运行游戏(Demo2场景),正常情况下是这个效果:

留意右边的Hierarchy视图,Demo2场景和Demo2_Menu场景是同时存在的。

证明之前所说的初始化场景Demo2是不会被卸载的。

6.卸载场景

现在,点击进入游戏,我们将切换到Demo2_Game场景,但是,请看下图:

Demo2_Menu场景和Demo2_Game场景竟然同时存在,这是因为框架只加载场景,而不是单纯地切换场景,这不是我们想要的。

虽然我暂时不知道框架有没有直接切换场景的功能,但是,按照官方的示例项目,在切换场景前,需要先卸载场景。

打开我们的Demo2_Controller类,改动如下:

在加载新的场景之前,我们先读取所有已存在的场景,然后主动卸载掉(初始场景会被排除),这样就不会同时出现多个场景了。

OK,本Demo到此结束,由于不想涉及太多内容,所以在某些操作上是不太符合框架的思路的,仅供参考。

 

 

17 评论

  1. Log.Debug(); 方法在3-1-5版本中的所在命名空间改在了UnityGameFramework.Runtime内(3-1-2还在GameFramework);

    另外我用3-1-5加载不出Menu场景,用3-1-2就可以(相同的场景和代码),不知道可能是什么问题呢?

  2. GameFrameworkException: Scene asset ‘Scene2Menu’ is being loaded.(Error输出)
    运行的时候遇上了这个问题,翻译是这个场景正在被加载~
    可是加载Game场景没有类似的输出,这是有问题吗?

    1. 嗯嗯,这个确实没有写,“由于切换流程需要在继承了ProcedureBase的类里操作,而我们的Demo2_Controller类只是一个普通的MonoBehavior类,所以没法在切换场景的时候同时切换流程。

      只好作罢。”

      1. 所以在加载游戏场景后,该在什么时候切换过去,Demo3里继承了UIFormLogic类的脚本就是写关于按钮的操作对吧。

        1. 可以在同一个流程里处理切换场景和流程的操作(比如ProcedureChangeScene),加载场景成功的话会触发LoadSceneSuccessEventArgs事件,在这个事件里再切换流程即可。

          这个在StarForce的官方例子有例子,可以看看~

          1. 去看了下,例子里是根据一个布尔值,点击按钮后改变这个布尔值,在自己流程类的OnUpdate内判断后切换流程的。

            试着用了下LoadSceneSuccessEventArgs事件,menu流程场景看不见,就切到下个流程和场景了;不清楚这个事件订阅针对的是哪个场景的加载成功呢。。

          2. 去看了下,例子里是根据一个布尔值,点击按钮后改变这个布尔值,在自己流程类的OnUpdate内判断后切换流程的。

            试着用了下LoadSceneSuccessEventArgs事件,menu流程场景看不见,就切到下个流程和场景了;不清楚这个事件订阅针对的是哪个场景的加载成功呢。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注