项目框架——场景管理器【GameSceneManager】

        其实Unity自身的SceneManager已经继承了很多内容,为什么这里面我们要重新写一套场景管理器呢,其目的是为了更方便的管理场景已经线性打开切换场景,怎么样做到线性,就是不使用脚本驱动,使用生成顺序控制实例化的先后而达到Awake的运行先后。

        可能上面说的有点笼统,下面我们来详细解释一下。

        第一个考虑:自身的场景管理,能更好的输出场景切换进度;

        第二个考虑:动态场景加载;

        第三个考虑:统一的切换规则以及开始规则管理。

        第一个不难理解了,尤其是在场景比较大的时候,这样的做法能很清晰的知道我们场景加载到哪一个步骤了,然后直接了当的在进度当中表现出来。

        第二个其实也不难理解,目的就是想要动态的加载一个场景,而不是每次都把新场景打包到首包和添加到buildsetting当中。

        第三个也是这个的框架的重点之一,场景切换的时候,上一个场景退出的时候,我们需要做什么,目标场景进来的时候,我们需要做什么,这些那个在前面,那个在后面,都有严格的规定,就好像Mono的生命周期一样。

        目前场景管理当中,我们仅仅提供了两个接口,一个是获取当前场景,一个是切换场景。

        其他的都是封装内容,接下来我们主要来描述一下一个场景。

        目前框架当中,我们一共可以有三种场景,普通场景,Lua控制场景和拼接场景,其中后面两个场景内容是由第一个场景派生出来的。

        IScene:普通场景。

        首先,普通场景,其实就是一系列的prefab集合,场景的打开和销毁均不涉及真正的unity场景,而是通过加载prefab并且实例化进去运行形成的新场景,所以这个时候我们需要的是每一个prefab对应的世界信息,当然,为了更方便简洁,在场景prefab制作的时候就应该统一世界信息,通过子节点或者必要的节点进行世界信息偏移达到目标效果。这个类当中,我们需要带参数的构造方法,初始化数据、加载场景、清除数据和移除场景内容。

        前面的两个方法,是进入场景的时候调用的,后面两个方法,是退出场景的时候调用的。

        基本上这些内容,我们都可以进去查看一下,非常简单。

        ISceneWithLua:Lua控制的场景内容。

        直接继承IScene来的一个场景内容控制,他也是一系列的prefab集合,只是有些需要的参数和内容是通过lua进行控制和返回的,说白了,也就是多了一个luatable,其他的没什么区别。

        ISceneWithAdditive:拼接场景。

        这个场景也是继承自IScene,但它是拼接场景,也就是说在unity里面,它的表现形式是unity的scene内容。那么就有人问,为什么不直接使用unity的scenemanager直接加载,因为我们这个设定,第一点、第二点和第三点都没有实现,其实不然,我们巧妙的运用了场景的打包和动态加载就实现了进度控制和动态场景以及统一的规范管理。

        说到打包,这里连带将场景打包内容一并讲解。

        

        这个就是我们场景打包的界面,当中需要选择平台和需要打包的场景所在的目录,然后选择需要打包的场景,最后打包即可。

        这个就是打包的流程,打包完成之后会直接将场景ab包拷贝到editor测试运行目录下面,可以直接测试使用,具体打包的内容可以参照之前的资源加载,当中有关于ab包思路的,当然只是思路,代码肯定不一样的,打包prefab和unity3d还是有区别的,详细的网上搜索一下就可以了。

        使用这个拼接场景的目的最主要的是解决LightMapping的动态加载和大场景的分割加载。

        这里需要提一下的是ISceneWithAdditive的场景是叠加的,对于navmesh是无效的,所以目前没有解决这个问题,而且根据资料显示,目前静态的navmesh还不能使用场景叠加,只能是一个完整的,但是网上有很多动态的navmesh框架,后续可能会集成进来。

        以上就是目前框架当中关于场景管理的一些笼统和简要说明,想要知道详细代码的可以去GitHub个人项目当中下载查看,有问题或者更好的建言随时留言沟通交流。

 

 

项目GitHub地址

https://github.com/FengFaming/ClientEngine

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章