




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、unity3d從服務(wù)器端獲取資源動(dòng)態(tài)加載到場景分類: 編程語言/ C語言/ 文章 我們的游戲制作完發(fā)布出去提供給玩家,為了給玩家?guī)砀玫挠螒蝮w驗(yàn),要做各種的優(yōu)化以及設(shè)計(jì),首先,游戲資源的加載就是一個(gè)非常重要的方面(尤其是網(wǎng)頁游戲)。由于我們的游戲資源比較大,不能一下全部加載出來,如果是這樣,可能會(huì)造成玩家長時(shí)間的等待。所以我們應(yīng)該采取動(dòng)態(tài)加載的方式,讓玩家在玩游戲的過程中來一點(diǎn)一點(diǎn)從服務(wù)器加載游戲資源。要實(shí)現(xiàn)這樣的效果,首先就必須要制作用于一點(diǎn)點(diǎn)加載的游戲資源。(注:本文只是談及這些游戲資源的制作和下載,關(guān)于游戲運(yùn)行中的動(dòng)態(tài)加載不做討論)(再注:本文涉及到的代碼都是以C#語言來編寫的)開發(fā)環(huán)
2、境:Windows 7本文中將會(huì)涉及到以下的內(nèi)容:1、 UnityEditor命名空間2、 Editor模式下窗口制作3、 導(dǎo)出功能的具體實(shí)現(xiàn)4、 資源的下載5、 下載后使用1、 UnityEditor命名空間這個(gè)命名空間下的類是在Unity的編輯模式下使用的,我們可以用它來制作各種小工具來輔助開發(fā),提高開發(fā)效率。這里的所有的類都不能在Unity的運(yùn)行時(shí)里使用。只能在編輯器下使用,并且在使用他們的時(shí)候還必須要放到項(xiàng)目Project視圖下的Editor文件夾中。需要注意一點(diǎn)的就是,我們的項(xiàng)目代碼里如果有使用到UnityEditor命名空間時(shí),在項(xiàng)目的最后編譯是不能通過的,必須要移除他們。我們來看
3、一個(gè)我們即將使用到的一個(gè)Attribute:MenuItem是UnityEditor命名空間下的一個(gè)屬性標(biāo)志,它可以定義出一個(gè)菜單條目,并添加在Unity編輯器的菜單欄中,語法:csharp view plaincopy 1. MenuItem(“Tools/Export”) 我們來新建一個(gè)工程看一下效果(具體創(chuàng)建步驟這里真的不說了)(注:我的項(xiàng)目中加了很多裝飾性的東西,這里就不一一說明怎么實(shí)現(xiàn)了哈)完成之后,先在Project下創(chuàng)建Editor文件夾并創(chuàng)建一個(gè)腳本文件,輸入以下內(nèi)容:csharp view plaincopy 1. using UnityEditor; 2. using Un
4、ityEngine; 3. using System.Collections; 4.5. / <summary> 6. / author : qyxls 7. / </summary> 8. public class ExportTools : MonoBehaviour 9. 10. MenuItem("Tools/Export") 11. static void Execute () 12. 13. Debug.Log("Menu is selected !"); 14. 15. 當(dāng)我們點(diǎn)擊菜單欄上的對應(yīng)菜單選項(xiàng):Tools&
5、#224;Export時(shí),菜單項(xiàng)會(huì)調(diào)用靜態(tài)的Execute()方法,即可在Console面板中打印出”Menu is selected”。這里要注意兩點(diǎn):1、 引入U(xiǎn)nityEditor命名空間。2、 MenuItem要調(diào)用的方法需要是static的。關(guān)于UnityEditor的更多詳細(xì)內(nèi)容,請參照官方文檔,這里不做重點(diǎn)講解。2、Editor模式下窗口制作要制作一個(gè)小工具,提供出一個(gè)友好界面是很有必要的。UnityEditor下的類可以很方便的完成這一需求。我們通過這些類,可以實(shí)現(xiàn)各種不同的控件:怎么樣,還算豐富吧?這些控件的具體實(shí)現(xiàn)我不想說,請自行查看API吧。這里我還是遵循本文的主旨,圍繞
6、本文的中心思想(本文我們是要導(dǎo)出資源到服務(wù)器,并在游戲中下載這個(gè)資源過來使用)實(shí)現(xiàn)一個(gè)界面。用例描述:導(dǎo)出場景中的一個(gè)模型,并帶著默認(rèn)材質(zhì),如果該模型有多個(gè)可替換的貼圖,也把這些貼圖作為該模型的資源一并導(dǎo)出到一個(gè)資源包中。按照這個(gè)需求,我猜想界面應(yīng)該是這樣的:一個(gè)導(dǎo)出模型的口,一個(gè)提供可選貼圖數(shù)量的口,根據(jù)用戶輸入的可選數(shù)量,給提供出對應(yīng)的貼圖導(dǎo)出口,最后填寫完畢之后有一個(gè)按鈕用于導(dǎo)出交互。,不好意思,這哪里是猜想,我其實(shí)早就寫好了。其實(shí)也沒騙你了,我在寫之前是猜想的!要實(shí)現(xiàn)上面這個(gè)窗口,我該怎么做呢?首先,定義一個(gè)繼承EditorWindow的類,然后,重寫OnGUI方法即可。我們這里在之前
7、的代碼基礎(chǔ)上做修改添加:csharp view plaincopy 1. using UnityEditor; 2. using UnityEngine; 3.4. / <summary> 5. / author : qyxls 6. / </summary> 7. 關(guān)閉-關(guān)閉-public class ExportTools :<strong> <span >"color:#ff0000;">EditorWindow</span> </strong> 8. 9. MenuItem("T
8、ools/Export") 10. static void Execute () 11. 12. / 實(shí)例化一個(gè)Window窗口 / 13. ExportTools windows = EditorWindow.GetWindow<ExportTools>(true, "Export Tools"); 14. 15.16. void OnGUI() 17. 18.19. 20. 這里要注意的就是將原來的腳本有繼承自MonoBehaviour 修改為繼承自EditorWindow。并在Execute ()方法中對當(dāng)前的Window實(shí)例化。這時(shí)我們就可以得
9、到一個(gè)Window窗口了:其次,就是向我們生成的窗口中添加不同的控件,這些控件的生成都是在OnGUI()方法中實(shí)現(xiàn)的。和MonoBehaviour的OnGUI方法一樣,EditorWindow的OnGUI()方法也主要是處理UI的,我們關(guān)于UI控件的生成處理都要寫在這個(gè)方法里。OnGUI()這個(gè)方法每幀調(diào)用好幾次(每個(gè)事件一次),所以一些邏輯處理要避免在這里調(diào)用。csharp view plaincopy 1. private string savePath; 2. private GameObject exportObject; 3. private int optionalCount =
10、0; 4. private Texture2D optionalTexture = new Texture2D0; 5.6. void OnGUI() 7. 8. /* 9. * ObjectField: 10. * 是這里的第一個(gè)控件,它可以允許用戶拖拽將一個(gè)Object的對象賦給它。 11. * 如果要限制可接收的對象類型,可以通過第三個(gè)參數(shù)來限制類型這里表示直接收GameObject類型 12. * 第四個(gè)bool型的參數(shù)標(biāo)志能否接受當(dāng)前scene里的對象,true表示接受 13. * 這個(gè)方法返回的是一個(gè)Object類型的值,最后要將它轉(zhuǎn)化為需要的類型 14. */ 15. expor
11、tObject = EditorGUILayout.ObjectField("Export Object", exportObject, 16. typeof(GameObject), true) 17. as GameObject; 18. / 就相當(dāng)于提供一個(gè)換行,用于格式化控件的 / 19. EditorGUILayout.Space(); 20. / IntField:該控件只能輸入 int 類型的值/ 21. optionalCount = EditorGUILayout.IntField("Optional Count", optionalC
12、ount); 22. for(int i=0; i<optionalCount; i+) 23. 24. if(optionalTexture.Length != optionalCount) 25. 26. optionalTexture = new Texture2DoptionalCount; 27. 28.29. EditorGUILayout.Space(); 30. / 這里將 ObjectField 限制只接受Texture2D類型的值 / 31. optionalTexturei = EditorGUILayout.ObjectField("Optional T
13、extures " + i, optionalTexturei, 32. typeof(Texture2D), false) 33. as Texture2D; 34. 35.36. EditorGUILayout.Space(); 37. EditorGUILayout.Space(); 38.39. EditorGUILayout.BeginHorizontal(); 40. EditorGUILayout.Space(); 41. / 導(dǎo)出按鈕 / 42. if(GUILayout.Button("EXPORT", GUILayout.Width(100),
14、 GUILayout.Height(20) 43. 44.45. 46.47. EditorGUILayout.EndHorizontal(); 48. 這里一些必要的東西我都添加都注釋理了,就不重復(fù)了。到這里這個(gè)窗口就基本算是完成了。3、導(dǎo)出功能的具體實(shí)現(xiàn)以上只是實(shí)現(xiàn)出了這樣一個(gè)窗口,具體響應(yīng)功能,以及必要的邏輯實(shí)現(xiàn)還都不具備,這里我們將為這個(gè)窗口添加具體的功能實(shí)現(xiàn)代碼。csharp view plaincopy 1. <span >"white-space:pre"> </span>private void ExportAndSave(Ga
15、meObject go) 2. 3. /該方法將打開保存對話框,選擇導(dǎo)出文件的保存位置/ 4. savePath = EditorUtility.SaveFilePanel("Save", "E:", , "unity3d"); 5. Export(go, savePath); 6. 7.8. private void Export(GameObject go, string filePath) 9. 10. / IsPersistent 判斷傳入的對象是磁盤文件還是場景文件(即是否是Project視圖下的文件,是返回t
16、rue)/ 11. if(!EditorUtility.IsPersistent(go) 12. 13. GameObject tmp = GameObject.Instantiate(go) as GameObject; 14. go = GetPrefab(tmp, ) as GameObject; 15. 16. Object asset = optionalTexture; 17. if(File.Exists(filePath) File.Delete(filePath); 18. /* 19. BuildPipeline.BuildAssetBundle():該方法是
17、將提供的對象導(dǎo)出成Unity能識(shí)別的二進(jìn)制文件 20. 第一個(gè)參數(shù)是提供一個(gè)要導(dǎo)出的對象,第二個(gè)參數(shù)是一個(gè)Object類型,它可以將數(shù)據(jù)附加到第一個(gè) 21. 參數(shù)定義的主數(shù)據(jù)一起整體導(dǎo)出.但是這兩個(gè)參數(shù)要求必須是磁盤文件的格式,所以上面的if語句判斷 22. 是否是磁盤文件類型,如果不是,先將其轉(zhuǎn)化為prefab,在Assets下臨時(shí)保存一下。這個(gè)轉(zhuǎn)化就是要 23. 用到 PrefabUtility 類里的方法。 24. */ 25. BuildPipeline.BuildAssetBundle(go, asset, filePath, BuildAssetBundleOptions.Coll
18、ectDependencies, BuildTarget.StandaloneWindows); 26. / 將暫時(shí)生成的prefab文件使用完后刪除 / 27. AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(go); 28. 29.30. / <summary> 31. / 該方法來產(chǎn)生臨時(shí)prefab文件 32. / </param> 33. private Object GetPrefab(GameObject go, string name) 34. 35. Object result = Prefab
19、Utility.CreateEmptyPrefab("Assets/" + name + ".prefab"); 36. result = PrefabUtility.ReplacePrefab(go, result); 37. Object.DestroyImmediate(go); 38. return result; 39. 這里我又新添加了三個(gè)方法來具體實(shí)現(xiàn)導(dǎo)出并保存的邏輯:· private voidExportAndSave(GameObject go):在這個(gè)方法里只要關(guān)注一下怎么打開一個(gè)保存對話框就可以了csharp view
20、plaincopy 1. /該方法將打開保存對話框,選擇導(dǎo)出文件的保存位置。第二和第三個(gè)參數(shù)表示默認(rèn)保存位置和默認(rèn)文件名/ 2. savePath =EditorUtility.SaveFilePanel("Save", "E:", ,"unity3d"); · private void Export(GameObjectgo, string filePath)這個(gè)方法具體實(shí)現(xiàn)了導(dǎo)出二進(jìn)制文件的功能。這里需要說明的是 BuildPipeline.BuildAssetBundle(): 該方法是將提供的對象導(dǎo)出成
21、Unity能識(shí)別的二進(jìn)制文件第一個(gè)參數(shù)是提供一個(gè)要導(dǎo)出的對象,第二個(gè)參數(shù)是一個(gè)Object類型,它可以將數(shù)據(jù)附加到第一個(gè)參數(shù)定義的主數(shù)據(jù)一起整體導(dǎo)出.但是這兩個(gè)參數(shù)要求必須是磁盤文件的格式,所以上面的if語句判斷是否是磁盤文件類型,如果不是,先將其轉(zhuǎn)化為prefab,在Assets下臨時(shí)保存一下。這個(gè)轉(zhuǎn)化就是要用到 PrefabUtility 類里的方法。具體判斷是否是磁盤文件,是通過 if(!EditorUtility.IsPersistent(go)這一句來判斷的:如果go不是磁盤文件,是場景對象,則執(zhí)行該語句里的代碼來生成磁盤文件,具體的是下面這個(gè)方法來實(shí)現(xiàn)的。· privat
22、e ObjectGetPrefab(GameObject go, string name)我們在導(dǎo)出前,如果導(dǎo)出信息設(shè)置的不正確,可能會(huì)致使導(dǎo)出的文件有問題或者不可用,所以在導(dǎo)出之前對信息有效性的驗(yàn)證也是必要的:csharp view plaincopy 1. <span >"white-space:pre"> </span>/ <summary> 2. / 數(shù)據(jù)驗(yàn)證,如果導(dǎo)出信息填寫有誤,將給用戶錯(cuò)誤提示 3. / </summary> 4. private bool Validate() 5. 6. bool b1
23、= (exportObject = null); 7. bool b2 = false; 8.9. foreach(Texture2D t in optionalTexture) 10. 11. b2 = b2 | (t = null); 12. 13.14. return !(b1 | b2); 15. 如果用戶全部信息都填寫完整了,該方法會(huì)返回true,導(dǎo)出時(shí)可以根據(jù)返回值狀態(tài)來做相應(yīng)的響應(yīng)。csharp view plaincopy 1. <span >"white-space:pre"> </span>/ 導(dǎo)出按鈕 / 2. if(GU
24、ILayout.Button("EXPORT", GUILayout.Width(100), GUILayout.Height(20) 3. 4. if(Validate() 5. 6. ExportAndSave(exportObject); 7. Clear();/成功導(dǎo)出數(shù)據(jù)后,清除導(dǎo)出信息/ 8. 9. else 10. 11. /導(dǎo)出信息填寫有誤時(shí),給出提示/ 12. EditorUtility.DisplayDialog("錯(cuò)誤提示", "導(dǎo)出信息設(shè)置有誤,請返回檢查!", "確定"); 13. 14.
25、 這里可以看到我還添加了一個(gè)Clear()方法,該方法在用戶導(dǎo)出完畢時(shí),將導(dǎo)出工具面板的信息清除掉,以便開始導(dǎo)出其它資源:csharp view plaincopy 1. <span >"white-space:pre"> </span>/ <summary> 2. / 所有數(shù)據(jù)正確導(dǎo)出后,清除填寫的導(dǎo)出信息,以便導(dǎo)出下一條數(shù)據(jù) 3. / </summary> 4. private void Clear() 5. 6. exportObject = null; 7. optionalCount = 0; 8. 到這里,我
26、們導(dǎo)出的所有邏輯就完成了,這樣子的一個(gè)導(dǎo)出工具也基本完成了。此時(shí),我們的完整代碼應(yīng)該是這個(gè)樣子的:csharp view plaincopy 1. using System.IO; 2. using UnityEditor; 3. using UnityEngine; 4.5. / <summary> 6. / author : qyxls 7. / </summary> 8. public class ExportTools : EditorWindow 9. 10. MenuItem("Tools/Export") 11. static void
27、 Execute () 12. 13. / 實(shí)例化一個(gè)Window窗口 / 14. EditorWindow.GetWindow<ExportTools>(true, "Export Tools"); 15. 16.17. private string savePath; 18. private GameObject exportObject; 19. private int optionalCount = 0; 20. private Texture2D optionalTexture = new Texture2D0; 21.22. void OnGUI()
28、 23. 24. /* 25. * ObjectField: 26. * 是這里的第一個(gè)控件,它可以允許用戶拖拽將一個(gè)Object的對象賦給它。 27. * 如果要限制可接收的對象類型,可以通過第三個(gè)參數(shù)來限制類型這里表示直接收GameObject類型 28. * 第四個(gè)bool型的參數(shù)標(biāo)志能否接受當(dāng)前scene里的對象,true表示接受 29. * 這個(gè)方法返回的是一個(gè)Object類型的值,最后要將它轉(zhuǎn)化為需要的類型 30. */ 31. exportObject = EditorGUILayout.ObjectField("Export Object", exportO
29、bject, 32. typeof(GameObject), true) 33. as GameObject; 34. / 就相當(dāng)于提供一個(gè)換行,用于格式化控件的 / 35. EditorGUILayout.Space(); 36. / IntField:該控件只能輸入 int 類型的值/ 37. optionalCount = EditorGUILayout.IntField("Optional Count", optionalCount); 38. for(int i=0; i<optionalCount; i+) 39. 40. if(optionalTextu
30、re.Length != optionalCount) 41. 42. optionalTexture = new Texture2DoptionalCount; 43. 44.45. EditorGUILayout.Space(); 46. / 這里將 ObjectField 限制只接受Texture2D類型的值 / 47. optionalTexturei = EditorGUILayout.ObjectField("Optional Textures " + i, optionalTexturei, 48. typeof(Texture2D), false) 49.
31、as Texture2D; 50. 51.52. EditorGUILayout.Space(); 53. EditorGUILayout.Space(); 54.55. EditorGUILayout.BeginHorizontal(); 56. EditorGUILayout.Space(); 57. / 導(dǎo)出按鈕 / 58. if(GUILayout.Button("EXPORT", GUILayout.Width(100), GUILayout.Height(20) 59. 60. if(Validate() 61. 62. ExportAndSave(export
32、Object); 63. Clear();/成功導(dǎo)出數(shù)據(jù)后,清除導(dǎo)出信息/ 64. 65. else 66. 67. /導(dǎo)出信息填寫有誤時(shí),給出提示/ 68. EditorUtility.DisplayDialog("錯(cuò)誤提示", "導(dǎo)出信息設(shè)置有誤,請返回檢查!", "確定"); 69. 70. 71.72. EditorGUILayout.EndHorizontal(); 73. 74.75. private void ExportAndSave(GameObject go) 76. 77. /該方法將打開保存對話框,選擇導(dǎo)出文件
33、的保存位置。第二和第三個(gè)參數(shù)表示默認(rèn)保存位置和默認(rèn)文件名/ 78. savePath = EditorUtility.SaveFilePanel("Save", "E:", , "unity3d"); 79. Export(go, savePath); 80. 81.82. private void Export(GameObject go, string filePath) 83. 84. / IsPersistent 判斷傳入的對象是磁盤文件還是場景文件(即是否是Project視圖下的文件,是返回true)/ 85.
34、 if(!EditorUtility.IsPersistent(go) 86. 87. GameObject tmp = GameObject.Instantiate(go) as GameObject; 88. go = GetPrefab(tmp, ) as GameObject; 89. 90. /Texture2D本身就是磁盤文件了,這里就沒必要再轉(zhuǎn)化了/ 91. Object asset = optionalTexture; 92. if(File.Exists(filePath) File.Delete(filePath); 93. /* 94. BuildPipel
35、ine.BuildAssetBundle():該方法是將提供的對象導(dǎo)出成Unity能識(shí)別的二進(jìn)制文件 95. 第一個(gè)參數(shù)是提供一個(gè)要導(dǎo)出的對象,第二個(gè)參數(shù)是一個(gè)Object類型,它可以將數(shù)據(jù)附加到第一個(gè) 96. 參數(shù)定義的主數(shù)據(jù)一起整體導(dǎo)出.但是這兩個(gè)參數(shù)要求必須是磁盤文件的格式,所以上面的if語句判斷 97. 是否是磁盤文件類型,如果不是,先將其轉(zhuǎn)化為prefab,在Assets下臨時(shí)保存一下。這個(gè)轉(zhuǎn)化就是要 98. 用到 PrefabUtility 類里的方法。 99. */ 100. BuildPipeline.BuildAssetBundle(go, asset, filePath,
36、BuildAssetBundleOptions.CollectDependencies, BuildTarget.StandaloneWindows); 101. / 將暫時(shí)生成的prefab文件使用完后刪除 / 102. AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(go); 103. 104.105. / <summary> 106. / 該方法來產(chǎn)生臨時(shí)prefab文件 107. / </param> 108. private Object GetPrefab(GameObject go, string
37、name) 109. 110. Object result = PrefabUtility.CreateEmptyPrefab("Assets/" + name + ".prefab"); 111. result = PrefabUtility.ReplacePrefab(go, result); 112. Object.DestroyImmediate(go); 113. return result; 114. 115.116. / <summary> 117. / 數(shù)據(jù)驗(yàn)證,如果導(dǎo)出信息填寫有誤,將給用戶錯(cuò)誤提示 118. / </
38、summary> 119. private bool Validate() 120. 121. bool b1 = (exportObject = null); 122. bool b2 = false; 123.124. foreach(Texture2D t in optionalTexture) 125. 126. b2 = b2 | (t = null); 127. 128.129. return !(b1 | b2); 130. 131.132. / <summary> 133. / 所有數(shù)據(jù)正確導(dǎo)出后,清除填寫的導(dǎo)出信息,以便導(dǎo)出下一條數(shù)據(jù) 134. / <
39、/summary> 135. private void Clear() 136. 137. exportObject = null; 138. optionalCount = 0; 139. 140. 工具界面應(yīng)該是這樣子: 到這里我們通過這個(gè)小小的導(dǎo)出工具就可以制作出要需要的資源文件了,這些資源文件是存放在服務(wù)器上的,接下來我們一起看看關(guān)于這些資源文件的下載。4、獲取資源文件這些文件是可以就從本地磁盤加載進(jìn)游戲里使用的,但這里為了模擬從遠(yuǎn)程服務(wù)器下載這樣一個(gè)模式,我還是將剛剛制作好的文件上傳到遠(yuǎn)程主機(jī)來給大家展示一下這種的從遠(yuǎn)端獲取的做法(其實(shí)從本地磁盤加載幾乎是一樣的)。第一步:將文
40、件上傳到服務(wù)器。我真的沒有服務(wù)器,但是我感覺度娘很熱情,估計(jì)能幫上我們什么忙。(此處省略好幾個(gè)字。其實(shí)就是怎么將剛剛導(dǎo)出的文件上傳到“百度云”)上傳不說了,這里看看怎么獲取剛剛上傳資源的完整地址。用Google瀏覽器(碼農(nóng)用這個(gè)沒有什么大問題吧?)登上“百度云”,找到剛剛上傳的文件,點(diǎn)擊下載,然后按Ctrl+J打開下載列表,右擊正在下載的文件,選擇“復(fù)制鏈接地址”就可以取到該文件的完整地址了。這個(gè)是我的:這里我們暫且先這樣用著,在真正的項(xiàng)目開發(fā)中,資源的地址肯定會(huì)直接或間接的給出來的,這里不必糾結(jié)。我們來具體看看下載,這里下載要使用到的類是WWW。在實(shí)例化WWW的時(shí)候,我們只需將資源的url地
41、址給它,即可開始下載,實(shí)例化完WWW后我們只需判斷這個(gè)實(shí)例是否下載完成,如果完成了,即可以取下載來的資源來用了。代碼是這樣的:(這個(gè)類不是UnityEditor里的類,新建一個(gè)C#類并繼承自MonoBehaviour)csharp view plaincopy 1. using UnityEngine; 2. using System.Collections; 3. / <summary> 4. / author : qyxls 5. / </summary> 6. public class Downloader : MonoBehaviour 7. 8. privat
42、e string url = 81203-FsMzIz4cENbozwsto38a47bDc64%3D&to=qb&fm=Q,B,U&expires=8h&rt=pr&r=709102273&logid=1896966947&fn=dice.unity3d " 9. private WWW www; 10.11. void Start () 12. 13. this.www = new WWW(this.url); 14. 15.16. void Update () 17. 18. if(www = null) return;
43、19. if(www.isDone) 20. 21. print ("Download completed"); 22. 23. 24. 當(dāng)啟動(dòng)了Unity之后,會(huì)發(fā)現(xiàn)很快就會(huì)在Console視圖中打印出來了“Download completed”,而且還孜孜不倦的一直不肯停歇,這里我們下載完了,只要對下載完的資源處理一次就夠了,沒必要沒完沒了的處理,多浪費(fèi)感情啊,所以我們該定義一個(gè)標(biāo)志,來標(biāo)記下載完成這么一個(gè)狀態(tài):csharp view plaincopy 1. private bool isCompleted = false; 2. void Update () 3.
44、4. if(www = null) return; 5. if(!isCompleted && www.isDone) 6. 7. print ("Download completed"); 8. isCompleted = true; 9. 10. 現(xiàn)在是不是只有這么一條打印信息了?這段代碼是非常簡單的,這里也沒有什么要多說的,就是提這么一點(diǎn),這里我們是直接根據(jù)資源的URL去訪問下載的該資源,但在實(shí)際項(xiàng)目中,我們經(jīng)常要處理的是根據(jù)不同的條件訪問同一地址而返回不同的數(shù)據(jù)來使用,這里要使用的是WWW的另一個(gè)構(gòu)造方法,可以帶除URL外的其它請求參數(shù):csharp
45、 view plaincopy 1. private void WWWWithParameter(string url, string parameter) 2. 3. WWWForm form = new WWWForm(); 4. form.AddField("Content", parameter); 5. WWW www = new WWW(url, form); 6. 可以看到,只需將參數(shù)封裝在WWWForm中再去用WWW訪問服務(wù)器就可以了。(本例中我們沒有采用帶參數(shù)的訪問是因?yàn)檫@樣的話,我們還要加一個(gè)后臺(tái)處理程序,要根據(jù)請求參數(shù)來返回?cái)?shù)據(jù),這樣我們就必須要在本機(jī)
46、上安裝服務(wù)器,書寫服務(wù)器代碼等等等等,這樣就得多做很多其它與我們這個(gè)話題相去深遠(yuǎn)的工作了。(好吧,我承認(rèn)我不會(huì)配置服務(wù)器))到此本節(jié)的全部代碼是這樣子的:csharp view plaincopy 1. using UnityEngine; 2. using System.Collections; 3. / <summary> 4. / author : qyxls 5. / </summary> 6. public class Downloader : MonoBehaviour 7. 8. private string url = " " 9.
47、private WWW www; 10. private bool isCompleted = false; 11.12. void Start () 13. 14. this.www = new WWW(this.url); 15. 16.17. void Update () 18. 19. if(www = null) return; 20. if(!isCompleted && www.isDone) 21. 22. print ("Download completed"); 23. isCompleted = true; 24. 25. 26.27.
48、 /* 28. private void WWWWithParameter(string url, string parameter) 29. 30. WWWForm form = new WWWForm(); 31. form.AddField("Content", parameter); 32. WWW www = new WWW(url, form); 33. 34. */ 35. 5、下載回來資源的使用通過上面的操作,我們已經(jīng)將資源下載到了本機(jī),但是,大家也都看到了,我通過上面的方法的操作,說是下載完了資源,但我們場景中還是什么都沒有啊,這個(gè)怎么解釋?我用迅雷下完東
49、東的時(shí)候,都在磁盤上有個(gè)文件的。這里下載好的資源已經(jīng)保存在內(nèi)存中了,我們只要取出來使用就好了:csharp view plaincopy 1. void Update () 2. 3. if(www = null) return; 4. if(!isCompleted && www.isDone) 5. 6. GameObject.Instantiate(www.assetBundle.mainAsset) as GameObject; 7. isCompleted = true; 8. 9. 只需這樣一句代碼,你就在場景中可以看到這個(gè)令人興奮的小東西了,哈哈,是不是很簡單呢?
50、但是有沒有發(fā)現(xiàn)什么問題呢?我們當(dāng)初導(dǎo)出的可不僅僅這點(diǎn)東西啊,我們回過頭來看看:起碼還有這些個(gè)貼圖怎么不見了?當(dāng)初導(dǎo)出時(shí)可是明明放到Object一起導(dǎo)出了的。莫著急,其實(shí)它們也都一起下載過來了,只是我們還沒有取來用罷了。再看www對象或者www.assetBundle里面有一個(gè)方法返回了Object數(shù)組:www.assetBundle.LoadAll()。抓緊去試試:csharp view plaincopy 1. void Update () 2. 3. if(www = null) return; 4. if(!isCompleted && www.isDone) 5. 6.
51、 GameObject.Instantiate(www.assetBundle.mainAsset) as GameObject; 7. isCompleted = true; 8.9. / 取回打包在資源內(nèi)部的數(shù)據(jù) 由于我們當(dāng)初放進(jìn)去的全是Texture2D類型的,所以使用LoadAll的 10. / 帶類型的重載方法,將Texture2D類型傳入進(jìn)去,表示我只取出Texture2D類型的數(shù)據(jù) 11. Object opticals = www.assetBundle.LoadAll(typeof(Texture2D); 12. foreach(Object o in opticals) 1
52、3. 14. Texture2D tmp = o as Texture2D; 15. print("name : " + ); 16. 17. 18. 這里打印除了 6 條記錄我們當(dāng)初打包到Object數(shù)組里的是 4 張貼圖:black-dots、blue-dots、green-dots、yellow-dots。這里明顯多出了red-dots和normal-dots,這不合適啊。細(xì)心的你也一定會(huì)發(fā)現(xiàn),多出的那 2 張貼圖,正是剛剛導(dǎo)出的模型上本身的一張漫反射貼圖和一張法線貼圖。原來,LoadAll()這個(gè)方法會(huì)將存在于下載過來的這個(gè)文件中符合類型的所有資源都
53、取過來的,這也很簡單處理,只要我們把不符合要求的剔除掉就好了。這里實(shí)現(xiàn)起來很簡單,我就不說了,我這里想說的是另一種方法,這個(gè)是開發(fā)中比較常用的。我們使用的時(shí)候,一般都是取確定的某個(gè)對象,可以通過Load(string name)方法來取得,這個(gè)方法返回的是一個(gè)AssetBundleRequest類型的值,我們可以通過它里面的asset屬性取到需要的數(shù)據(jù):csharp view plaincopy 1. AssetBundleRequest abr = www.assetBundle.LoadAsync("black-dots", typeof(Texture2D); 到現(xiàn)在
54、,我們就下載過來了所有數(shù)據(jù),并且可以取出需要的數(shù)據(jù)來使用了。接下來,我們完善一下這個(gè)小例子,把下載過來的資源充分的使用起來,就是給這個(gè)小東西換一個(gè)貼圖。這里完整的代碼是這樣子的:csharp view plaincopy 1. using UnityEngine; 2. using System.Collections; 3. / <summary> 4. / author : qyxls 5. / </summary> 6. public class Downloader : MonoBehaviour 7. 8. private string url = " 9. private WWW www; 10. private bool isCompleted = false; 11.12. private GameObject dice; 13. private Texture2D tex; 14.15. void Start () 16. 17. this.www = new WWW(th
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度股權(quán)轉(zhuǎn)讓及經(jīng)營權(quán)轉(zhuǎn)讓一體化協(xié)議
- 二零二五年度居民住房租賃合同租賃房屋租賃期限調(diào)整協(xié)議
- 二零二五年度保密信息處理保密合同
- 綠茶茶園承包經(jīng)營合同(2025年度)含茶樹病蟲害防治服務(wù)
- 二零二五年度農(nóng)村宅基地買賣合同協(xié)議書(農(nóng)村產(chǎn)權(quán)交易平臺(tái))
- 二零二五年度個(gè)人私下股權(quán)轉(zhuǎn)讓及投資風(fēng)險(xiǎn)分擔(dān)協(xié)議
- 代理銷售合同市場拓展策略約定事項(xiàng)說明
- 三字經(jīng)儒家經(jīng)典讀后感
- 歷史人物事件記憶題
- 企校合作辦學(xué)合同
- 考研學(xué)習(xí)筆記 《國際貿(mào)易實(shí)務(wù)》(第6版)筆記和課后習(xí)題(含考研真題)詳解-1-200
- 2024年01月23649電氣控制與PLC期末試題答案
- 餐飲業(yè)供應(yīng)鏈管理指南
- 涵洞工程專項(xiàng)施工方案
- DB32-T 4107-2021 民用建筑節(jié)能工程熱工性能現(xiàn)場檢測標(biāo)準(zhǔn)
- 七年級(jí)上冊生物2024-2025學(xué)年新人教版期末綜合試卷(含答案)
- 2024年國家電網(wǎng)招聘之電工類考試題庫附答案(滿分必刷)
- 晶體缺陷獲獎(jiǎng)?wù)n件
- 燃?xì)庥镁垡蚁┕艿篮附庸に囋u定DB41-T 1825-2019
- (人教PEP2024版)英語一年級(jí)上冊Unit 2 教學(xué)課件(新教材)
- 經(jīng)銷商轉(zhuǎn)戶證明范文
評論
0/150
提交評論