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

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>
            日韩视频在线观看国产| 国产一区二区激情| 精品999在线观看| 午夜精品福利在线| 欧美一级大片在线免费观看| 欧美女人交a| 亚洲大胆人体视频| 国产精品国产三级国产普通话三级 | 亚洲精选一区二区| 激情欧美日韩| 性久久久久久久久| 午夜精品免费在线| 欧美韩日高清| a91a精品视频在线观看| 欧美日韩一区精品| 欧美一级一区| 亚洲精品偷拍| 亚洲狼人综合| 亚洲图片欧洲图片日韩av| 国产精品不卡在线| 一区二区三区国产| 午夜精品久久久久久久久| 国产视频一区三区| 媚黑女一区二区| 久久成人国产| 99在线热播精品免费99热| 一区二区三区日韩精品视频| 亚洲日本欧美在线| 久久午夜视频| 欧美11—12娇小xxxx| 久久一区精品| 欧美成人自拍视频| 亚洲午夜久久久久久尤物| 亚洲国产成人在线视频| 亚洲高清网站| 亚洲视频电影图片偷拍一区| 亚洲欧美日本视频在线观看| 欧美日韩亚洲在线| 久久精品国产综合| 欧美主播一区二区三区美女 久久精品人 | 国产亚洲一二三区| 老司机午夜精品视频| 欧美视频在线观看一区二区| 久久久亚洲国产美女国产盗摄| 亚洲视频在线一区| 午夜视频一区在线观看| 亚洲淫性视频| 久久亚洲一区| 最新日韩精品| 欧美综合激情网| 欧美大片免费看| 亚洲日本一区二区| 一个人看的www久久| 欧美一区二区国产| 香蕉免费一区二区三区在线观看 | 欧美日韩一区二区三区四区五区| 99在线热播精品免费| 午夜精品久久久久久99热软件 | 久久xxxx| 尤物九九久久国产精品的分类| 国产精品你懂的在线| 亚洲高清资源| 欧美亚洲专区| 亚洲午夜精品在线| 欧美日韩一区不卡| 亚洲一区二区在线视频| 日韩视频永久免费观看| 欧美不卡高清| 亚洲成人资源| 亚洲黄色在线| 亚洲看片一区| 小嫩嫩精品导航| 在线一区视频| 国产精品免费看久久久香蕉| 亚洲一区中文| 欧美高清视频在线| 国产精品一二一区| 久久激情中文| 欧美久久久久久| 欧美亚洲日本一区| 亚洲欧美在线观看| 欧美日韩精品中文字幕| 亚洲图片你懂的| 亚洲午夜精品视频| 一区二区三区久久精品| 亚洲国产你懂的| 国产精品区一区| 香港久久久电影| 欧美一区二区网站| 在线观看不卡| 欧美一区二区精美| 亚洲高清免费| 中国av一区| 国户精品久久久久久久久久久不卡| 亚洲国产综合在线看不卡| 国产精品porn| 久久久久久自在自线| 国产精品一区二区三区久久久| 久久久久国产精品人| 黄色成人av网站| 亚洲日本va午夜在线影院| 极品中文字幕一区| 欧美va天堂| 国产专区欧美精品| 亚洲视频精选| 亚洲欧美日韩国产中文| 亚洲欧美另类国产| 久久乐国产精品| 亚洲国产高清在线| 国产日韩欧美视频| 欧美一级久久| 这里只有精品在线播放| 欧美高清免费| 亚洲欧美电影在线观看| 国产一本一道久久香蕉| 久久男人av资源网站| 久久亚洲春色中文字幕| 亚洲福利电影| 欧美日韩国产一区精品一区 | 亚洲人体影院| 亚洲伊人伊色伊影伊综合网| 中文一区二区在线观看| 欧美另类一区| 中文在线资源观看视频网站免费不卡| 亚洲一区在线直播| 激情国产一区二区| 欧美粗暴jizz性欧美20| 亚洲免费黄色| 亚洲欧美另类国产| 一区二区欧美精品| 亚洲激情第一页| 国产精品毛片高清在线完整版| 久久青草福利网站| 欧美电影在线观看完整版| 亚洲在线观看| 亚洲精品三级| 在线观看91精品国产入口| 国产精品美女久久久浪潮软件| 久久久国产精彩视频美女艺术照福利 | 美日韩丰满少妇在线观看| 国产一区成人| 欧美精品一区二区蜜臀亚洲| 另类综合日韩欧美亚洲| 亚洲图色在线| 午夜视频精品| 久久精品一区四区| 亚洲线精品一区二区三区八戒| 亚洲桃色在线一区| 亚洲综合日韩| 亚洲视频日本| 亚洲盗摄视频| 亚洲日本久久| 欧美中文字幕| 久久成人免费网| 久久一区二区视频| 老牛影视一区二区三区| 亚洲一级二级| 久久久免费观看视频| 欧美成人免费网站| 国产在线不卡精品| 国产精品最新自拍| 日韩亚洲成人av在线| 亚洲在线一区二区| 老司机久久99久久精品播放免费| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲成人资源网| 亚洲一区日韩在线| 欧美二区视频| 国产精品久久91| 亚洲国产精品久久久久秋霞不卡 | 欧美一区二区三区视频| 欧美大片免费观看| 欧美日韩中文字幕日韩欧美| 亚洲高清久久久| 午夜精品视频在线| 亚洲日本在线观看| 欧美一区二区视频在线观看2020| 久久综合久久综合久久| 欧美日韩三级| 香蕉久久夜色精品国产使用方法| 久久精品视频99| 欧美涩涩视频| 一区二区三区免费观看| 亚洲国产日韩欧美在线99 | 亚洲天堂av电影| 欧美va亚洲va日韩∨a综合色| 亚洲少妇在线| 韩国成人福利片在线播放| 亚洲精品国产精品国自产观看浪潮| 欧美中文字幕久久| 久久国产精品亚洲77777| 国产精品欧美经典| 国产日韩欧美高清免费| 欧美激情2020午夜免费观看| 性欧美超级视频| 亚洲视频在线观看免费| 亚洲经典在线| 国产亚洲精品7777| 亚洲第一区在线观看| 欧美激情va永久在线播放|