




已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Unity3D游戲開發(fā)之異步加載 -游戲場景游戲資源進度條 異步任務(wù)相信大家應(yīng)該不會陌生那么本章內(nèi)容將帶領(lǐng)大家學習Unity中的一些異步任務(wù)。在同步加載游戲場景的時候通常會使用方法 Application.LoadLevel(“yourScene”); 這句代碼執(zhí)行完畢后程序會干什么呢如下圖所示這是我隨便找了一個游戲場景 在Hierarchy視圖中我們可以看到該場景中“天生”的所有游戲?qū)ο蟆?天生的意思就是運行程序前該場景中就已經(jīng)存在的所有游戲?qū)ο?。然后這些對象就會在執(zhí)行完 Application.LoadLevel(“yourScene”);方法后加載至內(nèi)存當中。如果該場景中的游戲?qū)ο筮^多那么瞬間將會出現(xiàn)卡一下的情 況因為LoadLevel()方法是同步進行的。把這種加載起個名字叫A形式加載。 下面我說說“后天“加載的游戲?qū)ο蟆R馑际沁@些游戲?qū)ο笫峭ㄟ^腳本動態(tài)的創(chuàng)建出來的。比如常用方法 : GameObject Obj = (GameObject)Instantiate(prefab); 這句代碼執(zhí)行完畢后同樣會在Hierarchy視圖中添加對應(yīng)的游戲?qū)ο?。把這種加載起個名字叫B形式加載。 下面我們學習異步加載游戲場景異步異步顧名思義就是不影響當前游戲場景的前提下加載新場景。通常異步加載的方式分為兩種第一種是異步加載新游戲場景當新場 景加載完成后進入新場景并且銷毀之前的場景。第二種:同樣異步加載新場景新場景加載完畢后保留舊場景的游戲?qū)ο蟛⑶疫M入新場景。 這里加載的內(nèi)容就是上面提到的A形式加載。然后B形式加載不會記入這里的加載。 第一種異步加載游戲場景對應(yīng)的方法是 Application.LoadLevelAsync(yourScene); 第二種異步家在游戲場景對應(yīng)的方法是 Application.LoadLevelAdditiveAsync (yourScene); 這兩種方法加載的方式完全一樣。異步加載其實重要還是應(yīng)用于游戲LOADING界面畢竟LOADING如果采用同步的機制會影響用戶體驗說到這里告訴大家 如何在Unity中制作游戲進度條。我們應(yīng)當在Unity中創(chuàng)建一個專門用于讀取進度的場景假設(shè)A場景到C場景我們應(yīng)當讓A場景先到讀取進度的場景B場景 當異步任務(wù)完成后在進入C場景。 A B - C 在B場景中繪制游戲進度條或讀取動畫。因為B場景僅僅是個顯示LOADING動畫的場景所以讀取該場景是瞬間就完成的。 程序在切換場景時應(yīng)當有一個全全局的靜態(tài)變量來記錄簡要讀取的場景名稱。這里簡單的寫一下。 1. using UnityEngine; 2. using System.Collections; 3. public class Globe 4. 5. /在這里記錄當前切換場景的名稱 6. public static string loadName; 在A場景中通過某些觸發(fā)條件 調(diào)用LoadLevel進入B場景。 /記錄LOADING場景中需要讀取的C場景名稱 Globe.loadName = C; /先進入B場景 Application.LoadLevel (B); OK我們在B場景中異步讀取C場景與 播放讀取動畫Loading.cs 綁定在B場景的攝像機對象身上。當C場景異步讀取完畢后即可直接進入C場景。 1. using UnityEngine; 2. using System.Collections; 3. public class Loading : MonoBehaviour 4. private float fps = 10.0f; 5. private float time; 6. /一組動畫的貼圖在編輯器中賦值。 7. public Texture2D animations; 8. private int nowFram; 9. /異步對象 10. AsyncOperation async; 11. /讀取場景的進度它的取值范圍在0 - 1 之間。 12. int progress = 0; 13. void Start() 14. 15. /在這里開啟一個異步任務(wù) 16. /進入loadScene方法。 17. StartCoroutine(loadScene(); 18. 19. /注意這里返回值一定是 IEnumerator 20. IEnumerator loadScene() 21. 22. /異步讀取場景。 23. /Globe.loadName 就是A場景中需要讀取的C場景名稱。 24. async = Application.LoadLevelAsync(Globe.loadName); 25. /讀取完畢后返回 系統(tǒng)會自動進入C場景 26. yield return async; 27. 28. void OnGUI() 29. 30. /因為在異步讀取場景 31. /所以這里我們可以刷新UI 32. DrawAnimation(animations); 33. 34. void Update() 35. 36. /在這里計算讀取的進度 37. /progress 的取值范圍在0.1 - 1之間 但是它不會等于1 38. /也就是說progress可能是0.9的時候就直接進入新場景了 39. /所以在寫進度條的時候需要注意一下。 40. /為了計算百分比 所以直接乘以100即可 41. progress = (int)(gress *100); 42. /有了讀取進度的數(shù)值大家可以自行制作進度條啦。 43. Debug.Log(xuanyusong +progress); 44. 45. /這是一個簡單繪制2D動畫的方法沒什么好說的。 46. void DrawAnimation(Texture2D tex) 47. 48. time += Time.deltaTime; 49. if(time = 1.0 / fps) 50. nowFram+; 51. time = 0; 52. if(nowFram = tex.Length) 53. 54. nowFram = 0; 55. 56. 57. GUI.DrawTexture(new Rect( 100,100,40,60) ,texnowFram ); 58. /在這里顯示讀取的進度。 59. GUI.Label(new Rect( 100,180,300,60), lOADING! + progress); 60. 61. OK 下面我們繼續(xù)學習在游戲場景中加載對象文章的開始已經(jīng)告訴大家游戲場景中Hierarchy視圖中的所有的對象在切換場景的時候都會加載。其實有一種方法 可以讓某些游戲?qū)ο蟛粫患虞d如下圖所示首先在Hierarchy視圖中選擇一個游戲?qū)ο笤谟覀?cè)監(jiān)測面板視圖中我們可以看到一個 “小對勾”默認情況下是勾選狀態(tài)說明該游戲?qū)ο筇幱诩せ顮顟B(tài)如果點掉的話該對象將被隱藏。這個小功能在開發(fā)中其實用處非常大請大家務(wù)必記住哈。 此時此刻大家相像一個游戲場景默認進入的時候是沒有任何游戲?qū)ο蟮娜缓筮\行游戲時開啟一個異步任務(wù)將它們一個一個的加載顯示出來這種方式適合異步的加載一個比較大的游戲場景,文章出處【狗刨學習網(wǎng)】。 Test.cs 把它掛在攝像機對象中。 1. 2. using UnityEngine; 3. using System.Collections; 4. public class Test : MonoBehaviour 5. /這里是需要加載激活的游戲?qū)ο?6. public GameObject Objects; 7. /當前加載的進度 8. int load_index =0; 9. void Start () 10. 11. /開啟一個異步任務(wù)加載模型。 12. StartCoroutine(loadObject(); 13. 14. IEnumerator loadObject() 15. 16. /便利所有游戲?qū)ο?17. foreach(GameObject obj in Objects) 18. 19. /激活游戲?qū)ο?20. obj.active = true; 21. /記錄當前加載的對象 22. load_index +; 23. /這里可以理解為通知主線程刷新UI 24. yield return 0; 25. 26. /全部便利完畢返回 27. yield return 0; 28. 29. void OnGUI () 30. 31. /顯示加載的進度 32. GUILayout.Box(當前加載的對象ID是 + load_index); 33. 34. 如下圖所示我們把需要加載的游戲?qū)ο笠詳?shù)組的形式放在Objects數(shù)組中因為這些對象屬于未激活狀態(tài)所以不能通過Find 等方法在腳步那種中找到他們。講到這里我們在說說 編輯器賦值與代碼中賦值的區(qū)別編輯器中賦值所消耗的時間都會記在loadlevel ()讀取場景中。而代碼中使用Resource.load()這類方法所消耗的時間會記在腳本中。開發(fā)中還得自行的把握一下把loading加在那里。 當然我們還可以使用Instantiate(prefab);方法來動態(tài)的創(chuàng)建游戲?qū)ο蟆ain.cs 把它掛在攝像機中。 35. using UnityEngine; 36. using System.Collections; 37. public class Main : MonoBehaviour 38. 39. public int count; 40. /在編輯器中預(yù)設(shè)一個游戲?qū)ο?41. public GameObject prefab; 42. void Start () 43. 44. StartCoroutine(loaditem(); 45. 46. void OnGUI() 47. 48. GUILayout.Box(游戲?qū)ο笠呀?jīng)加載到 + count); 49. 50. IEnumerator loaditem() 51. 52. /開始加載游戲?qū)ο?53. for(int i =0; i 1000; i+) 54. 55. Instantiate(prefab); 56. count = i; 57. /可以理解為刷新UI顯示新加載的游戲?qū)ο?58. yield return 0; 59. 60. /結(jié)束 61. yield return 0; 62. 63. 運行游
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外賣騎手關(guān)懷活動方案
- 大武口沙漠團建活動方案
- 多彩農(nóng)村活動方案
- 大邑蛋糕活動方案
- 地產(chǎn)春節(jié)活動方案
- 地磚促銷活動方案
- 夏至文案餐飲活動方案
- 東莞沖浪活動方案
- 東營新開業(yè)商場活動方案
- 個人慈善活動方案
- 國家開放大學行管本科《行政領(lǐng)導(dǎo)學》期末紙質(zhì)考試總題庫2025春期版
- 國家開放大學《課程與教學論》形考任務(wù)1-4參考答案
- 2025年學校意識形態(tài)工作總結(jié)范文(2篇)
- 2025年職業(yè)技能(工業(yè)廢水處理工)專業(yè)技術(shù)及理論知識考試題及答案
- 電大國開2024秋《習近平新時代中國特色社會主義思想》學習行為表現(xiàn)(范文2篇)
- 《市場人員商務(wù)禮儀》課件
- 上海市市轄區(qū)(2024年-2025年小學六年級語文)統(tǒng)編版小升初真題(下學期)試卷及答案
- 第九章新時代中國特色大國外交與構(gòu)建人類命運共同體-2024版研究生新中特教材課件
- 消防演練總結(jié)報告、評估報告
- 19G522-1鋼筋桁架混凝土樓板圖集
- 2023-2024學年廣東省佛山市高二下學期7月期末考試物理試題(解析版)
評論
0/150
提交評論