您好,登录后才能下订单哦!
Unity3d中提供了场景Scene的概念,Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分!
场景中的游戏对象是任意的,可以是HUD的UI组件,场景地图,模型等等
Unity3d提供了一些切换场景的规则和方法(例如在切换场景时不销毁某些GameObject,同步,异步加载场景API),但是并没有提供一个通用的场景管理的模块(想要做到“通用”是很难的)
在实际开发中,有些开发者摒弃了Scene模块,即整个游戏只有一个Scene,然后自己实现一套“窗口”对象以及“窗口”管理模块,以达到场景管理和通信的目的,这样的好处在于更灵活的控制场景对象;同样,坏处也很明显,即工作量会很大!
我在开发中也做了一套简单的场景管理模块,其主要功能包括:
1.使用一个栈来保存玩家在游戏中场景的载入先后关系(方便Back功能实现以及记录当前场景ID)
2.提供切换场景,压栈场景,出栈场景方法
3.提供异步加载场景,并提供加载进度(用以显示Loading条)
Unity3d将组件设计模式发挥的淋漓尽致,很多开发者都可以方便灵活的制作各种插件,如果足够抽象,便可以为其它项目很方便的使用!Scene Manager就是其中一个,官网地址
Scene Manager提供了2个场景的概念:Screen和Level
Screen:即相互之间没有关联的场景模块(例如登陆场景,主菜单场景,游戏场景之间的关系),其之间并没有严格的先后关系,更接近于Unity3d中Scene的概念
Level:即游戏场景中的关卡模块,有一定的先后关系,并且逻辑相同,Scene Manager为Level提供了一些关卡关系的方法,包括当前关卡,上一个关卡,关卡状态,参考 SMLevelProgress 类
这2个场景的概念在Unity3d看来都是Scene的意义,之所以这样区分是为了将Scene的概念更细化!
其提供了下图的编辑界面,我们只需要创建一个SceneConfiguration来编辑游戏中所有Scene的类别和关系
一旦Scene Configuration创建完成之后,即可以在第一个“Screen场景”中创建出单例类SMGameEnvironment实例,其
其构造方法中完成对SMSceneManager与SMLevelProgress实例的创建:
(注意一定要在Screen场景中实例化SMGameEnvironment,如果是Level场景,则有可能对各个Level之间的关系有错误)
SMSceneManager提供切换场景的接口(包括加载场景,加载关卡,加载第一个关卡)
SMLevelProgress用以保存Level之间的关系(包括当前Level,上一Level,当前Level状态)
SMTransition及其子类,提供了很多方便的切换场景(包括Screen和Level)动画效果,包括 淡入淡出,闪烁,卡通等等
(这些动画效果都作为Prefab保存在SceneManager/Resources/Transitions/下)
SMTransition作为基类,提供了是否异步加载场景,实际调用Unity3d API切换场景方法,但主要提供了一个动画的模板方法 DoTransition(),代码如下: