unity3d 5.6版的 加载不放在BuildSetting场景的一些总结

来源:互联网 发布:北京网页游戏编程培训 编辑:程序博客网 时间:2024/05/19 18:17

 需求分析

        因项目需求,我们需要加载自定义的场景,这里的自定义是指,场景不会放在buildSetting里的场景,当然,不放在buildSetting里的场景,不算真的场景,只能是算半个,说白了就跟普通的assetBundle没啥区别,既然跟普通的加载方式没啥区别,那为何不叫加载资源呢,我们分析得出,既然是场景,肯定会有一些不同的地方,比如渲染设置(跟烘焙有关系的),环境设置,等等,这些就可跟一般的加载场景是有所区别的了。所以我们要做的是在加载资源的基础上,还原场景里面的设置。那就差不多等于是我们自己的加载场景了,这里用差不多,这几个字眼,其实我们是不可能百分百还原场景的设定的,因为官方没有在运行时提供相应的场景设置API。如图所示,给我们提供的API少得可怜,我们只能是提供多少就还原多少了。



       按上面的说话,既然场景打包可以这样搞,那我们就可以在加载资源或者叫加载场景的时候,分为两种方式

1,加载下一个场景的时候,可以把上一个场景的资源全部删掉,再重新设置下,下一个场景的场景设置,这样,就相当于切换场景了。

2,加载下一个场景的时候,调用官方提供的API,如图,然后再场景切换完成事件里,再加载下一个场景的资源和设定,听起来很麻烦,执行起来,更麻烦,我们现在就是用这种方法,发现一路都是坑,所以,强烈推荐第一种。下面我就说说我们用第一种遇到的坑


    我的做法就是,用Notepad++ 打开保存好的场景文件,细看里面的一些设置。场景烘焙打包,烘焙贴图打包是网上也有流程和方法,这里就不细说。如果有打开场景文件出现乱码的话,选择红线的方式即可。如图该设置可以在菜单Edit>ProjectSetting>Editor找到。可以看到场景文件无非就是记录场景里面的物体信息,每个物体的组件,组件里的参数,这些我们不用可以记下来,打包资源的时候,设定的参数都会随着资源一起打包出去,加载的时候直接加载就好了,比如旋转,缩放,位置等等,都不用我们操心。好了,那我们就好好的看看场景文件里面的带有setting的一些设置,

比如LithtmapSettings,还有RenderSettings等,其实我们按照场景文件所记录的设置,加载的时候设置好相应的参数就可以了,可惜,想法很美好!场景文件记录的参数有些不能够在发布后运行时设置,比如m_RenderSettings,还有LightmapSetting的很多参数,还有LightDataAssets,该资源就算你打包了,也没办法发布后运行时load进来然后解析设置参数,因为官方没有提供相应的API文档,所就如前面所说的,只能算是半个场景的打包,残次品,希望官方以后能够提供更多的关于场景打包方面的API给我们吧。所以,目前只能是API提供多少接口,我们就还原多少。


开发中遇到的坑

       5.6版本的跟5.3的SceneManager对比,有了蛮大的改动,5.6增加了几个事件,

一个是场景改变,一个是场景加载,一个是卸载后的,还有就是不能同步卸载场景了,只能异步卸载场景,不知道unity官方出于什么考虑才这样,感觉用起来麻烦了很多,或许我的这个需求太特别,才会用上去觉得很不爽吧。再者SceneManager.SetActiveScene的时候,先注册监听该事件,我是放在Start里




因为是自定义场景加载,所以我们代码创建一个新的场景,然后激活它,


如果你执行完上面的两句代码后创建物体,都会是在当前场景创建,并不会在激活的场景创建。这个坑应该官方提供了一个API解决,SceneManager.activeSceneChanged。 触发这个事件的条件是当场景切换完成的时候,也就是说,正式进入了激活的场景,所以,我们只能在这个事件触发后才可以在激活的场景里创建物体和卸载上一个场景的资源

      然而又来了一个新坑,卸载上一个场景资源是异步的,也就是当前场景加载完成后,如果你执行上一个场景卸载操作,然后把当前场景的烘焙贴图贴上去,很抱歉,unity也会立马当前场景的烘焙贴图删掉,也算是一个小BUG吧,补救办法就是延迟一帧后执行当前场景的烘焙贴图贴赋予的操作,这个操作并严谨,因为异步加载,并不确定什么时候unity会执行删除烘焙贴图的操作。但当我想到之前看到过文章说资源一般会在帧后面释放掉,我想,要是把当前场景的烘焙贴图放在yield return new WaitForEndOfFrame后面贴上去应该就没事了,料想到果真如此

      目前发现runtime全局光是跟LightDataAssets是紧密结合在一起的,当前unity版本LightDataAssets是无法动态加载,所以,实时全局光也不可能还原到,只能折中的利用灯光烘焙的贴图来代替,这是实时运行的API








      



原创粉丝点击