1. 程式人生 > >用ECMAScript4 ( ActionScript3) 實現Unity的熱更新 -- 在腳本中使用MonoBehaviour

用ECMAScript4 ( ActionScript3) 實現Unity的熱更新 -- 在腳本中使用MonoBehaviour

blog 腳本 tool urn 技術 build 右鍵 lan www.

繼上次分析了熱更新的Demo後,這次來介紹如何在熱更新代碼中使用MonoBehaviour。

MonoBehaviour掛載到GameObject對象上的腳本的基類。平常Unity開發時,簡單的做法就是編寫一個繼承自MonoBehaviour的腳本,將它掛載到要操縱的GameObject上,賦予它各種行為。

當然,在某些大型項目中,可能並不推薦導出掛腳本的方式,但是本文旨在介紹如何在腳本中繼承並編寫MonoBehaviour,暫時忽略這個問題。

本章的目標:

用腳本創建一個MonoBehaviour。並掛載到某個物體上,在Start方法中使用協程加載 baidu 的首頁的html,然後將它的html代碼顯示到文本框上。

操作步驟:

  1. 新建一個Unity熱更新項目,或者打開上次的項目。如果您不知道怎麽新建,參考上一篇文章或者看官網
  2. 打開HotFixDemoScene1,將文本框改大。技術分享圖片

  3. 打開熱更新項目。
  4. 如果您使用的是Unity2017.2以後的版本,需要註意以下問題:UnityEngine.WWW這個類用於從網絡下載數據。但是自從Unity2017.2之後,Unity將它的API拆分到了許多其他dll中。默認系統只將UnityEngine.CoreModule.dll的API導出了,但是UnityEngine.WWW並沒有包含在這個dll裏。
    1. 可以使用如下辦法,來確定某個類在哪個dll裏:在VS中,寫下要確定的這個類的名字。
    2. 右鍵點擊剛才寫的類名,在彈出菜單中選擇速覽定義,即可查看到這個類型所在的dll。技術分享圖片

    3. 這裏我們定位到在UnityEngine.UnityWebRequestWWWModule.dll中
    4. 打開熱更項目的genapi.config.xml,將這個dll配置到以下配置節中:
      <!--Configure DLLs to export-->
        <buildassemblys>
         
          <assembly value="D:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\System.dll"></
      assembly> <assembly value="D:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll"></assembly> <assembly value="D:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestWWWModule.dll"></assembly> <assembly value="D:\Program Files\Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll"></assembly> <assembly value="F:/ASTool_UnityTest/AS3HotFix_WWW\Library\ScriptAssemblies\Assembly-CSharp.dll"></assembly> </buildassemblys>
    5. 執行 bat/CreateUnityAPI.bat ,再次生成Unity的API。如此,即可在熱更新項目中使用WWW相關的類型
  5. 打開熱更新項目的 Main.as。
  6. 本次我們將功能寫在包外代碼內,因此將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);

  7. 見註釋,我們直接在腳本中定義一個MonoBehaviour的子類,並且掛載到了相機上。
  8. 執行結果:技術分享圖片

如此,即實現了在腳本中使用MonoBehaviour。

用ECMAScript4 ( ActionScript3) 實現Unity的熱更新 -- 在腳本中使用MonoBehaviour