用ECMAScript4 ( ActionScript3) 實現Unity的熱更新

unity熱更新是一個經久不衰的話題。除了最多見的lua以外,還有如JSBinding,C#等等。這裏介紹一個使用ECMAScript4進行熱更新的方案。它吸取了各家的優勢,特點很鮮明。git

  • 項目地址:

https://github.com/asheigithub/apple-juice-actionscriptgithub

什麼是ECMAScript4?

ECMAScript4事實上並無正式推出,瀏覽器的ES標準是從ES3直接跳到ES5,如今是ES6.這其中夾雜大量政治因素,具體能夠去百度。瀏覽器

但不管如何ECMAScript4 是完整支持類型,接口,繼承,編譯期類型檢查的強類型腳本語言,同時又支持動態屬性訪問,原型鏈繼承等,同時有IDE支持,很是適合較大規模的項目開發。app

事實上ECMAScript4的惟一實現,就是ActonScript3ide

 

 

熱更新原理

這是一個用純.net2.0實現的ActionScript3編譯器和虛擬機。它只使用了.net2.0的語法,所以能夠在任何提供.net2.0執行環境的地方運行腳本。即便環境不提供JIT功能(例如UnityIOS上,或者IL2CPP打包的安卓系統上)也一樣不受影響。性能

熱更新項目提供了一個Unity插件包和一個SDK文件夾。插件包導入Unity工程後,能夠在菜單內建立腳本工程,會自動設置好各類路徑,若是沒有安裝IDE,使用bat批處理文件也能夠編譯代碼發佈到Unity來體驗。測試

 

特點功能

它和其餘熱更新方案相比,主要有如下一些特色:優化

1. 包括完整的編譯器和虛擬機。其餘熱更新方案,大可能是嵌入某個第三方語言運行時(例如LUA,這個則不須要。它所有以代碼提供,整個虛擬機都是代碼,直接導入Unity便可執行.ui

2. 語法友好,純ECMAScript4語法,當JS用便可。同時有完整的面向對象以及IDE支持。lua

3. 編譯器爲Unity優化語法。能夠直接在腳本內編寫Unity協程。

4. 編譯器爲UnityMonobehaviour優化,能夠直接在腳本中定義Monobehaviour,並掛載。

5. .net結構體有特殊優化,在腳本內使用結構體時,只要不保存到堆中,即不會產生任何GC

6. .net對象有特殊優化。在腳本內建立.net類庫的對象時,只要不保存到腳本對象中,就不會產生額外的對象分配。

7. 支持操做符重載。unity中有許多操做符重載。例如Vector3+-*/等。這些操做符重載在腳本中一樣能夠直接使用。

8. 能夠在腳本中繼承.net的類型。並且還能夠用腳原本override .net基類的虛方法。

9. unity的類型導出到腳本中做爲API的步驟是全自動進行的。並且導出後的API還一樣保持了繼承關係。

 

實際開發環境截圖:

如圖,能夠看到腳本中直接繼承了MonoBehaviour。 IDE提供了GameObject的各類靜態方法的智能感知。API提示明確顯示了原 Unity C# API的簽名等。

 

性能

 

官網上有一個和slua的對比。

 

https://asheigithub.github.io/apple-juice-actionscript/doc_cn/2-4-0-slua-applejuice-2018-04-12/

 

Unity交互部分性能大體至關,某些地方略勝lua。測試環境均爲沒法jitil2cpp打包手機環境實測。測試手機爲魅藍NOTE5

 

 

 

 

 

簡易使用入門

使用前先確認安裝以下環境:

  •  FlashDevelop。這是一個開源的IDE,能夠用來開發腳本。下載地址http://www.flashdevelop.org/
  • JRE 。 編譯器須要JRE支持,只要安裝任意 > 1.5版本的JRE便可。

從官網下載最新的發佈包。

並解壓。

 解壓後包括SDK文件夾一個,Unity插件包一個。

 

項目建立步驟:

 

1. 先建立一個Unity工程。而後導入UnityPackage內的Unity插件包。

 2. 點擊菜單 ASRuntime/Create ActionScript3 FlashDevelop HotFixProj

 3. 根據提示先定位SDK的位置。

 4. 而後根據提示建立AS3熱更新項目。項目建立完成後,會根據默認配置生成UnityAPI。  

 

腳本項目要求建立在一個空白的文件夾中。

 

項目測試:

1. Unity工程中,打開測試場景"Assets/HotFixDemoScene1.scene"

 2. 在剛纔生成的ActionScript3工程目錄中,用FlashDevelop打開<protname>.as3proj 工程文件。

 3. AS3工程中修改代碼

 4. 點擊FlashDevelop的編譯按鈕,進行編譯

 5. 回到Unity工程,點擊播放,便可看到修改的結果。

 

下面有一個gif動態圖,演示了從建立項目到熱更的過程。gif文件有9M,若是不顯示請稍待

 

 

Demo

最後,我作了一個熱更新的修改DEMO:將Unity引導內的 roll-a-ball修改成使用腳本驅動的熱更新版本。而且修改部分代碼,以支持手機上的重力感應操做。能夠用il2cpp打包到安卓手機上查看效果。

下載連接: https://files.cnblogs.com/files/ashei/rollaball.zip

 

更多關於此項目的使用方法,能夠去官網查看文檔。歡迎你們提出意見或建議。

相關文章
相關標籤/搜索