用ECMAScript4 ( ActionScript3) 實現Unity的熱更新 -- 在腳本中使用MonoBehaviour
阿新 • • 發佈:2018-04-19
blog 腳本 tool urn 技術 build 右鍵 lan www.
繼上次分析了熱更新的Demo後,這次來介紹如何在熱更新代碼中使用MonoBehaviour。
MonoBehaviour掛載到GameObject對象上的腳本的基類。平常Unity開發時,簡單的做法就是編寫一個繼承自MonoBehaviour的腳本,將它掛載到要操縱的GameObject上,賦予它各種行為。
當然,在某些大型項目中,可能並不推薦導出掛腳本的方式,但是本文旨在介紹如何在腳本中繼承並編寫MonoBehaviour,暫時忽略這個問題。
本章的目標:
用腳本創建一個MonoBehaviour。並掛載到某個物體上,在Start方法中使用協程加載 baidu 的首頁的html,然後將它的html代碼顯示到文本框上。
操作步驟:
- 新建一個Unity熱更新項目,或者打開上次的項目。如果您不知道怎麽新建,參考上一篇文章或者看官網
- 打開HotFixDemoScene1,將文本框改大。
- 打開熱更新項目。
- 如果您使用的是Unity2017.2以後的版本,需要註意以下問題:UnityEngine.WWW這個類用於從網絡下載數據。但是自從Unity2017.2之後,Unity將它的API拆分到了許多其他dll中。默認系統只將UnityEngine.CoreModule.dll的API導出了,但是UnityEngine.WWW並沒有包含在這個dll裏。
- 可以使用如下辦法,來確定某個類在哪個dll裏:在VS中,寫下要確定的這個類的名字。
- 右鍵點擊剛才寫的類名,在彈出菜單中選擇速覽定義,即可查看到這個類型所在的dll。
- 這裏我們定位到在UnityEngine.UnityWebRequestWWWModule.dll中
- 打開熱更項目的genapi.config.xml,將這個dll配置到以下配置節中:
<!--Configure DLLs to export--> <buildassemblys> <assembly value="D:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\System.dll"></
- 執行 bat/CreateUnityAPI.bat ,再次生成Unity的API。如此,即可在熱更新項目中使用WWW相關的類型
- 打開熱更新項目的 Main.as。
- 本次我們將功能寫在包外代碼內,因此將Main類型的代碼清空,然後貼下如下代碼:
1 package 2 { 3 4 [Doc] 5 /** 6 * ... 7 * @author 8 */ 9 public class Main 10 { 11 12 public function Main() 13 { 14 } 15 16 public function update():void 17 { 18 19 } 20 } 21 22 } 23 24 //寫在包外的代碼,會在Main這個類第一次被實例化之前執行一次。 25 26 import system.collections.IEnumerator; 27 import unityengine.Camera; 28 import unityengine.GameObject; 29 import unityengine.MonoBehaviour; 30 import unityengine.Time; 31 import unityengine.WWW; 32 import unityengine.ui.Text; 33 34 //定義一個繼承自MonoBehaviour的類型。 35 class baidutest extends MonoBehaviour 36 { 37 //Start方法會在Update前調用一次。 38 function Start():IEnumerator 39 { 40 //創建WWW對象,並訪問 www.baidu.com 41 var www:WWW = new WWW("http://www.baidu.com"); 42 while ( !www.isDone) 43 { 44 //更新UI元素. 45 Text( GameObject.find("Text").getComponent(Text)).text = "loading from baidu " + Time.frameCount; 46 //使用 yield關鍵字,可以使用Unity協程 47 yield return www; 48 } 49 50 51 //加載完畢後,將html內容顯示到UI上。 52 Text( GameObject.find("Text").getComponent(Text)).text = www.text.substr(1024,1024); 53 //銷毀WWW對象。 54 www.dispose(); 55 56 } 57 58 } 59 60 //在主相機上掛載腳本中定義的baidutest。 61 Camera.main.gameObject.addComponent(baidutest);
- 見註釋,我們直接在腳本中定義一個MonoBehaviour的子類,並且掛載到了相機上。
- 執行結果:
如此,即實現了在腳本中使用MonoBehaviour。
用ECMAScript4 ( ActionScript3) 實現Unity的熱更新 -- 在腳本中使用MonoBehaviour