青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

(搬運工)場景管理插件Scene Manager

Posted on 2013-10-30 18:40 點點滴滴 閱讀(591) 評論(0)  編輯 收藏 引用 所屬分類: 02 編程語言

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(),代碼如下:

  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繪制,代碼如下:

  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.     }  
  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類中

  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.     }  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩综合在线| 亚洲国产精品久久久久婷婷老年| 欧美视频中文字幕| 欧美屁股在线| 欧美日一区二区在线观看 | 久久这里有精品15一区二区三区| 亚洲一区999| 欧美一区视频在线| 乱人伦精品视频在线观看| 亚洲国产精品日韩| 亚洲一区亚洲二区| 麻豆精品91| 欧美视频免费看| 狠狠狠色丁香婷婷综合久久五月| 亚洲美洲欧洲综合国产一区| 亚洲综合国产激情另类一区| 久久男女视频| 亚洲开发第一视频在线播放| 性欧美大战久久久久久久久| 欧美波霸影院| 国产精品视频xxxx| 亚洲日本成人女熟在线观看| 亚洲综合国产| 亚洲高清久久| 久久av资源网站| 欧美日韩国产电影| 在线视频观看日韩| 午夜精品影院| 日韩图片一区| 蘑菇福利视频一区播放| 国产免费成人在线视频| 在线亚洲欧美专区二区| 欧美高清视频免费观看| 欧美一区二区三区在线播放| 欧美日韩在线视频一区| 亚洲欧洲日本mm| 美女任你摸久久| 欧美一区二区在线观看| 国产精品久久97| 一区二区三区免费网站| 亚洲国产二区| 美日韩在线观看| 99综合电影在线视频| 久热re这里精品视频在线6| 亚洲精品四区| 欧美成人自拍| 亚洲日本欧美在线| 欧美成人小视频| 久久久天天操| 一区福利视频| 免费日韩成人| 久久美女艺术照精彩视频福利播放| 国产精品久久久久久久久果冻传媒| 亚洲免费观看高清完整版在线观看熊| 久久久蜜桃一区二区人| 欧美在线免费播放| 国产精品色网| 久久国产精品网站| 新狼窝色av性久久久久久| 国产精品永久在线| 欧美在线视频播放| 久久狠狠亚洲综合| 影音先锋日韩资源| 欧美电影专区| 欧美另类一区| 亚洲欧美日韩精品一区二区 | 亚洲国产精品久久久久秋霞蜜臀 | 在线观看三级视频欧美| 媚黑女一区二区| 免费日韩av电影| 91久久精品一区二区别| 亚洲三级视频| 国产精品扒开腿做爽爽爽视频| 午夜国产精品影院在线观看 | 宅男精品视频| 国产欧美短视频| 久久亚洲免费| 欧美高清视频一区二区| 亚洲午夜一区二区| 亚洲欧美视频在线| 影音先锋在线一区| 亚洲日本中文字幕免费在线不卡| 国产精品国产a| 久久免费黄色| 欧美精品123区| 久久aⅴ国产紧身牛仔裤| 美女日韩在线中文字幕| 一区二区三区免费在线观看| 午夜影视日本亚洲欧洲精品| 亚洲第一狼人社区| 一本久久精品一区二区| 国产亚洲制服色| 91久久综合亚洲鲁鲁五月天| 国产精品亚发布| 亚洲成色最大综合在线| 国产精品久久久久免费a∨大胸| 久久久久久网| 国产精品xxxav免费视频| 国产亚洲一区二区三区| 在线中文字幕一区| 欧美一区二区三区四区高清| 91久久久久久国产精品| 亚洲免费伊人电影在线观看av| 亚洲第一页在线| 亚洲综合电影一区二区三区| 亚洲日本中文字幕区| 午夜在线精品偷拍| 亚洲图片你懂的| 久久综合狠狠综合久久综合88 | 欧美激情国产日韩| 久久国产一区二区| 欧美日韩在线视频一区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久成人免费日本黄色| 亚洲天堂av综合网| 欧美jizzhd精品欧美巨大免费| 久久国产精品久久久| 欧美日韩在线一区| 亚洲黄色在线| 亚洲国产一区二区a毛片| 欧美在线精品一区| 久久成人免费网| 国产精品手机视频| 亚洲一区二区免费| 亚洲综合电影| 国产精品va在线播放我和闺蜜| 亚洲经典在线| 日韩一级在线观看| 欧美激情一区在线| 亚洲高清网站| 亚洲欧洲日本专区| 欧美成人按摩| 免费久久99精品国产| 国产综合久久久久久鬼色| 亚洲女同精品视频| 欧美一区二区三区在线观看视频| 国产精品成人一区二区三区吃奶| 日韩一级不卡| 亚洲欧美日韩在线| 国产欧美韩国高清| 久久av一区二区三区亚洲| 久久综合电影| 亚洲黄色在线观看| 欧美电影免费网站| 日韩视频一区二区三区| 亚洲欧美日韩视频二区| 国产精品一区二区久久国产| 亚洲欧美日韩专区| 欧美成人精品在线观看| 亚洲欧洲一二三| 欧美日韩综合不卡| 亚洲欧美日韩人成在线播放| 久久久久国内| 亚洲激情电影中文字幕| 欧美日韩视频在线一区二区| 亚洲一级电影| 嫩模写真一区二区三区三州| aa亚洲婷婷| 国产日韩欧美中文| 麻豆成人在线| 亚洲午夜在线| 欧美xart系列在线观看| 亚洲精选国产| 羞羞答答国产精品www一本 | 狠狠综合久久av一区二区老牛| 麻豆国产精品777777在线| 夜夜夜精品看看| 美女黄网久久| 亚洲男人的天堂在线aⅴ视频| 国产一区二区丝袜高跟鞋图片| 久久综合久色欧美综合狠狠| 亚洲精品四区| 麻豆免费精品视频| 亚洲一区精品电影| 在线观看亚洲专区| 国产精品久久久久久超碰| 久久天天狠狠| 亚洲一区二区精品| 亚洲国产精品欧美一二99| 久久精品成人| 宅男66日本亚洲欧美视频| 好吊日精品视频| 欧美日韩亚洲一区二区三区| 久久午夜色播影院免费高清| 亚洲免费视频网站| 亚洲精品国产拍免费91在线| 久久漫画官网| 欧美在线观看视频一区二区| 99精品欧美一区二区蜜桃免费| 国产一区二区三区久久精品| 欧美特黄一级| 欧美日韩精品一区| 女仆av观看一区| 久久精品理论片| 亚洲欧美日本日韩| 亚洲午夜黄色| 亚洲视频图片小说| 一本久久a久久精品亚洲| 亚洲精品视频免费观看| 亚洲黄色影院|