[Unity3d]场景管理插件-SceneManager

Unity3d中提供了场景Scene的概念,Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分!

场景中的游戏对象是任意的,可以是HUD的UI组件,场景地图,模型等等

Unity3d提供了一些切换场景的规则和方法(例如在切换场景时不销毁某些GameObject,同步,异步加载场景API),但是并没有提供一个通用的场景管理的模块(想要做到“通用”是很难的)

在实际开发中,有些开发者摒弃了Scene模块,即整个游戏只有一个Scene,然后自己实现一套“窗口”对象以及“窗口”管理模块,以达到场景管理和通信的目的,这样的好处在于更灵活的控制场景对象;同样,坏处也很明显,即工作量会很大!

我在开发中也做了一套简单的场景管理模块,其主要功能包括:

1.使用一个栈来保存玩家在游戏中场景的载入先后关系(方便Back功能实现以及记录当前场景ID)

2.提供切换场景,压栈场景,出栈场景方法

3.提供异步加载场景,并提供加载进度(用以显示Loading条)

Unity3d将组件设计模式发挥的淋漓尽致,很多开发者都可以方便灵活的制作各种插件,如果足够抽象,便可以为其它项目很方便的使用!Scene Manager就是其中一个,官网地址

1.功能

Scene Manager提供了2个场景的概念:Screen和Level

Screen:即相互之间没有关联的场景模块(例如登陆场景,主菜单场景,游戏场景之间的关系),其之间并没有严格的先后关系,更接近于Unity3d中Scene的概念

Level:即游戏场景中的关卡模块,有一定的先后关系,并且逻辑相同,Scene Manager为Level提供了一些关卡关系的方法,包括当前关卡,上一个关卡,关卡状态,参考 SMLevelProgress 类

这2个场景的概念在Unity3d看来都是Scene的意义,之所以这样区分是为了将Scene的概念更细化!

其提供了下图的编辑界面,我们只需要创建一个SceneConfiguration来编辑游戏中所有Scene的类别和关系

2.实现

(1)SMSceneManager

一旦Scene Configuration创建完成之后,即可以在第一个“Screen场景”中创建出单例类SMGameEnvironment实例,其

其构造方法中完成对SMSceneManager与SMLevelProgress实例的创建:

(注意一定要在Screen场景中实例化SMGameEnvironment,如果是Level场景,则有可能对各个Level之间的关系有错误)

SMSceneManager提供切换场景的接口(包括加载场景,加载关卡,加载第一个关卡)

SMLevelProgress用以保存Level之间的关系(包括当前Level,上一Level,当前Level状态)

(2)SMTransition

SMTransition及其子类,提供了很多方便的切换场景(包括Screen和Level)动画效果,包括 淡入淡出,闪烁,卡通等等

(这些动画效果都作为Prefab保存在SceneManager/Resources/Transitions/下)

SMTransition作为基类,提供了是否异步加载场景,实际调用Unity3d API切换场景方法,但主要提供了一个动画的模板方法 DoTransition(),代码如下:

[csharp] view
plain
copyprint?

  1. protected virtual IEnumerator DoTransition() {  
  2.         // 第一部分:之前场景退出动画  
  3.         state = SMTransitionState.Out;  
  4.         Prepare();  
  5.         float time = 0;  
  6.           
  7.         while(Process(time)) {  
  8.             time += Time.deltaTime;  
  9.             // wait for the next frame  
  10.             yield return 0;  
  11.         }  
  12.           
  13.         // wait another frame...  
  14.         yield return 0;  
  15.           
  16.         // 第二部分:保证SMTransition对象不被销毁(完成后续动画)  
  17.         state = SMTransitionState.Hold;  
  18.         DontDestroyOnLoad(gameObject);  
  19.   
  20.   
  21.         // wait another frame...  
  22.         yield return 0;  
  23.           
  24.         IEnumerator loadLevel = DoLoadLevel();  
  25.         while (loadLevel.MoveNext()) {  
  26.             yield return loadLevel.Current;  
  27.         }  
  28.            
  29.         // wait another frame...  
  30.         yield return 0;  
  31.   
  32.   
  33.         // 第三部分:新场景载入动画  
  34.         state = SMTransitionState.In;  
  35.         Prepare();  
  36.         time = 0;  
  37.   
  38.   
  39.         while(Process(time)) {  
  40.             time += Time.deltaTime;  
  41.             // wait for the next frame  
  42.             yield return 0;  
  43.         }  
  44.   
  45.   
  46.         // wait another frame...  
  47.         yield return 0;  
  48.           
  49.         Destroy(gameObject);  
  50.     }  

在SMTransition的子类中,分别实现Prepare()虚方法和Process(float elapsedTime)抽象方法

例如 SMFadeTransition 类中,通过传入参数elapsedTime与配置淡入淡出参数duration计算得到当前进度,正交化进度,得到当前遮盖的alpha值,并在OnGUI绘制,代码如下:

[csharp] view
plain
copyprint?

  1. protected override bool Process(float elapsedTime) {  
  2.         float effectTime = elapsedTime;  
  3.         // invert direction if necessary  
  4.         if (state == SMTransitionState.In) {  
  5.             effectTime = duration - effectTime;  
  6.         }  
  7.           
  8.         progress = SMTransitionUtils.SmoothProgress(0, duration, effectTime);  
  9.           
  10.         return elapsedTime < duration;  
  11.     }  

[csharp] view
plain
copyprint?

  1. public void OnGUI() {  
  2.         GUI.depth = 0;  
  3.         Color c = GUI.color;  
  4.         GUI.color = new Color(1, 1, 1, progress);  
  5.         GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), overlayTexture);  
  6.         GUI.color = c;  
  7.     }  

其它SMTransition子类也通过Process(float elapsedTime)实现切换动画效果!

PS: 在异步加载场景中,Scene Manager中并没有提供一个获取当前加载进度的接口,需要自己实现,在SMTransition类中

[csharp] view
plain
copyprint?

  1. protected virtual YieldInstruction LoadLevel() {  
  2.         if (loadAsync) {  
  3.                     AsyncOperation ao = Application.LoadLevelAsync(screenId);  
  4.                     Debug.Log("Progress: " + ao.progress);  
  5.                     return ao;  
  6.                     //return Application.LoadLevelAsync(screenId);  
  7.         } else {  
  8.             Application.LoadLevel(screenId);  
  9.             return null;  
  10.         }  
  11.     }  

转载自:http://blog.csdn.net/onerain88/article/details/12303511

时间: 2024-11-10 19:48:07

[Unity3d]场景管理插件-SceneManager的相关文章

Unity3D 200个插件免费分享

插件清单: 2D_Toolkit_1.51     动画开发插件包 FingerGestures           触摸插件 ORK_Okashi_RPG_Kit       Unity3D角色扮演游戏开发工具包 uScript-Visual-Scripting-Tool-for-UnityEasyMotion2D       脚本插件 Playmaker_1.21                    可视化编程插件 RageSpline EZ GUI 2 GlyphDesigner 142

php强制转换类型和CMS远程管理插件的危险

远程管理插件是十分受WordPress站点管理员欢迎的工具,它们允许用户同时对多个站点执行相同的操作,如,更新到最新的发行版或安装插件.然而,为了实现这些操作,客户端插件需要赋予远程用户很大的权限.因此,确保管理服务器和客户端插件之间的通信安全且不能被攻击者伪造就变得相当重要了.本文将谈及几款可用插件,利用其弱点,攻击者甚至可以完全危及到运行这些插件的站点. ManageWP, InfiniteWP, and CMS Commander 这三个服务有着相同的客户端插件基础代码(目测最初是Mana

php强制转换类型和远程管理插件的危险

  PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型. 允许的强制转换有: (int),(integer) - 转换成整型 (bool),(boolean) - 转换成布尔型 (float),(double),(real) - 转换成浮点型 (string) - 转换成字符串 (array) - 转换成数组 (object) - 转换成对象 注意在括号内允许有空格和制表符 还可以用settype ( mixed var, string type )进行强制

解析PHP强制转换类型及远程管理插件的安全隐患_php技巧

远程管理插件是目前广受WordPress站点管理员欢迎的实用工具,它允许用户同时对多个站点执行相同的操作,如更新到最新的发行版或安装插件等.但是,为了实现这些操作,客户端插件需要赋予远程用户很大的权限.因此,确保管理服务器和客户端插件之间的通信安全且不能被攻击者伪造就变得相当重要了.本文浅析几款可用插件,利用其弱点,攻击者甚至可以完全危及到运行这些插件的站点本身. ManageWP, InfiniteWP, and CMS Commander 这三个服务有着相同的客户端插件基础代码(目测最初是M

Vim技能修炼教程(1) - 使用vundle管理插件

世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它们的地位,比如编辑器界的Sublime Text,Ultra Editor,Notepad++,pspad,Atom,Visual Studio Code,IDE界的Eclipse, IntellJ IDEA, NetBeans等等,但是它们的地位从未动摇过. 写C#的最好IDE一定是Visual

Cydia教程:神级后台管理插件Auxo for iPad版

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   后台管理插件 Auxo 在去年 12 月推出后,凭借智能实用的管理和炫丽的界面迅速成为越狱后必备的 Cydia 应用之一. 不过 Auxo 一直只支持 iPhone,让不少 iPad 用户扼腕叹息.不过现在 iPad 用户无需烦恼了,近日 iPad 版 Auxo 正式推出了.       iPad 版 Auxo,操作使用基本上和 iPhone 版一致,当然,界面

构建插件式的应用程序框架(五)-管理插件

我们现在已经搭建了插件式的应用程序框架,接下来的工作就是要充实框架的内容,提供基本的服务,也就是Service.我想首要的任务就是提供插件的管理服务,我在前面的文章也提到了,要实现动态加载必须要知道插件寄宿在哪里,哪些要加载,哪些不加载,这些就是这篇文章要讨论的问题. 首先解决的就是插件放在什么地方,我采取的传统的方法,将插件放到应用程序所在目录下的制定目录,我会在应用程序所在的目录下创建一个文件夹,命名为Plugins.接下来的工作就是要通知哪些插件是要加载的,哪些是不需要加载的,我会将这些信

关于membership用户管理插件的DeleteUser方法的权限的问题

问题描述 我在创建用户的时候,使用了MembershipUser的CreateUser,并且没有给用户设定权限,在调用membership的修改和查询的方法的时候都没有出现任何问题当我尝试添加删除方法的时候,每次DeleteUser方法的返回值都是false,说明数据并没有被删除在网上查询了很久,没有找到相关的解决方案,都是说在删除的时候调用该方法即可,不知道我出现的这个问题是出于什么原因有什么解决方法没有,先谢谢各位大神了

lua开发中实现MVC框架的简单应用_Lua

       先简单说说MVC,即Model View Controller.Model(模型),一般负责数据的处理:View(视图),一般负责界面的显示:Controller(控制器),一般负责前端的逻辑处理.拿一款手机游戏来说,界面UI的显示.布局等就是View负责:点击了按钮,手势的滑动等操作由Controller来处理:游戏中需要的数据资源就交给Model.        接下来,看看在游戏开发中怎么用,这里用Lua(环境使用cocos code ide)给大家说说.        先来