JSBinding+Bridge.NET:Unity遊戲熱更新方案

老版本連接以下:http://www.cnblogs.com/answerwinner/p/4469021.htmljavascript

新用戶不要再使用老版本了。html

 

新版本 JSBinding 將拋棄 SharpKit 轉而使用 Bridge.NET(老版本仍然維護)。java

理由是c++

1. 把 C# 編譯成 Js 後,Bridge 幾乎100%肯定轉換後可運行。git

    Bridge 在編譯時不容許引用外部 Dll(System.dll也不行)。容許使用的 C# Api 都是 Bridge 已嚴格測試過的。通常來講,編譯能過,就能跑。SharpKit 的 C# 源代碼和 Js 源代碼都比較混亂。在最初引入 SharpKit 後,羣主作了大量的修補工做,仍然存在遺漏的可能。然後者不論是 C# 仍是 Js,都特別嚴謹。github

    Bridge 在 Js 端對 C# 類型系統進行了很完整的模擬。正則表達式

    解決了 SharpKit 存在的許多問題。例如:塊做用域閉包問題,64位整數支持。閉包

2. Bridge 對許多 C# 庫都進行了支持。例如,你能夠在 C# 中使用正則表達式,可使用 Linq 等。框架

3. Bridge 生成的代碼更好看,更嚴謹。post

4. SharpKit 已經不維護了,Bridge.NET 仍在持續維護並有論壇可討論問題。我問過兩三個問題,都是當天回覆。

 

JSBinding+SharpKit 和 JSBining+Bridge.NET 的區別和聯繫 

前者有替換 C# MonoBehaviour 爲 Js MonoBehaviour 的功能。後者沒有,他不容許在 gameObject 上掛邏輯代碼的 MonoBehaviour,偏向於把框架代碼和邏輯代碼分在2個不一樣的工程。

 

 

試用步驟:

1. 先安裝 VS2015(緣由是 Bridge 源代碼使用了 C#6.0)。能夠從這裏下載:https://www.visualstudio.com/zh-hans/downloads/

2. 本身試玩一下 Bridge.NET。能夠從這裏下載:http://bridge.net/download/,下載第1項便可,即 Bridge.NET.15.3.0.vsix。下載完後安裝。使用起來很簡單的,看一下Bridge的文檔:http://bridge.net/docs/

3. 還能夠下載 Bridge 源代碼:https://github.com/bridgedotnet/Bridge

 

在試玩過 Bridge 後應該對 Bridge 有一點點了解了。

 

4. 下載 JSB + Bridge 代碼(最好用 git 克隆):https://github.com/qcwgithub/qjsbunitynew_bridge

 

目錄說明

UnityProjCs

    純 C# 版本 Unity 工程。裏面(幾乎)沒有 JSB 的任何東西。代碼都在 Assets\Scripts\ 下。其中,GameFramework 是框架代碼,GameLogic 是邏輯代碼。他們的關係是,框架代碼不能夠訪問邏輯代碼。爲了方便製做 Js 版本,Assets\ 下最好都以文件夾組織,不要放文件,Assets\GameIcon 只是演示。

    簡稱Cs工程。

UnityProjJs

    Js 版本的 Unity 工程。這個工程在初始化以前,裏面就只有 JSB 相關的東西。

    簡稱Js工程。

BridgeProj

    這是 Bridge 工程,用於把 C# 代碼編譯爲 Js 代碼。安裝好 VS2015 和 Bridge 插件後,直接雙擊 BridgeProj.sln 打開便可。

    簡稱 Bridge工程。

 

Cs Demo 運行步驟

1. 用 Unity 打開 Cs工程

2. 打開 Scenes/Demo 場景

3. Play

 

Js Demo 運行步驟

1. 運行 1_link.bat

2. 用 Unity 打開 Js工程

3. Build Settings 切換平臺至 PC

4. 點擊菜單 JSB | Gen Bindings。這一步的產出有3個:(注意點1

  • UnityProjJs/Assets/Scripts/JSBinding/G/
  • UnityProjJs/Assets/StreamingAssets/JavaScript/Gen1.javascript
  • BridgeProj/csw.cs (?)

5. 用 VS2015 打開 BridgeProj 工程並編譯。將生成 Js 代碼,產出的 Js 文件在 BridgeProj/Bridge/output/下

6. 回到 UnityProjJs,點擊菜單 JSB | Update JavaScript。這一步會拷貝上一步的 Js 文件內容到 StreamingAssets/JavaScript/Gen2.javascript

7. 拷貝 UnityProjJs/Assets/Plugins/ x86 或 x86_64 /mozjs-31.dll 至 Unity安裝目錄 Editor 下

8. 打開 Scenes/Demo 場景

9. Play

 

這個設計是不容許 GameObject 上掛腳本的(Framework的腳本是能夠的),也就是說 Prefab 和 邏輯代碼不會有靜態依賴關係。UnityProjJs 工程只能見到 Js 版本的邏輯代碼。

 

BridgeProj/csw.cs 是什麼?

在 Bridge 工程裏是不容許引用外部 Dll 的,只能放源代碼。因此就生成這麼一個文件,放置框架代碼的空實現文件。

 

如何同時維護遊戲的 C# 版本和 Js 版本

運行 1_link.bat 後,會將 Cs 工程中的除邏輯代碼之外的全部東西映射至 Js 工程中,邏輯代碼則以 Js 文本文件的形式注入到 Js 工程中,這樣就獲得了 Js 版本的遊戲。

你須要本身修改 1_link.bat 來自定義要映射哪些東西。

由於只能映射文件夾不能映射文件,因此 Cs 工程 Assets\ 下都要以文件夾形式組織,不要直接放文件。

另外注意,在 BridgeProj 和 UnityProjJs 工程中都定義了 "JS" 編譯符號。有一些代碼只能跑在 Js ,只好加個符號來區分是哪一種版本,若是不樂意能夠幹掉。

 

未解決問題

  1. 目前JSComponent只能響應一部分腳本事件,例如 Awake、Start。若是須要響應其餘事件,例如 OnWillRenderObject,一種方式是增長新的 JSComponentXX(繼承 JSComponent),而後在 AddComponent 時,指定要用哪一個。我會加入一個示例來演示怎麼作。但這只是一種方式,可根據須要自定義實現。

 

 

 

注意點1:若是你切換平臺(如從 Windows 切換爲 iOS),須要從新執行 JSB | Gen Bindings,並去 BridgeProj 從新編譯生成 Js,而後再回 Unity 執行 JSB | Update JavaScript

 

List.Find
List.RemoveAll

Dictionary<,>.Enumerator

 

常見問題

運行後,報錯:Bridge.javascript(2640): Error: Y.inherits[0] is null!

Bridge 有一個已知問題是 Gen2.javascript 裏的類順序不對。好比說 X 是 Y 的父類,Y.inherits[0] 就是 X。在 Gen2.javascript 裏若是 Y 在 X 前面的話,就會報這個錯。
解決辦法:先手動調整一下順序,把 X  放前面。

 

如何使用此框架

此框架的主要思路是讓 Cs和Js版本(如下簡稱「2種版本」)同時可維護,任什麼時候候想跑其中一種版本都是能夠的。2種版本的區別和聯繫:

  • Cs版本的邏輯代碼是C#代碼,Js版本的邏輯代碼是Js代碼
  • Js版本一開始是沒有任何資源的,只有 JSB 自己的源代碼。1_link.bat 從Cs工程映射文件夾到Js版本中,從而使Js版本「得到」了Cs版本中的全部的資源。這些映射不包括對邏輯代碼的映射。邏輯代碼是從Cs工程映射到BridgeProj工程中,產出Js代碼,注入到Js工程中。
  • 2種版本的Prefab是如出一轍的。均可以掛腳本(ScriptAgent),均可以在Inspector裏給public變量賦值。ScriptAgent自動處理2種版本的差別性,用戶無需關心。

Js版本中目前腳本都是放在 StreamingAssets 下,只是爲了Demo運行方便。這個目錄在安卓或蘋果上都是不可寫的,所以不適合熱更新。實現整個更新流程還須要本身打包 asset bundle 等,你須要本身決定把 Js 代碼放到另外一個位置。

 

編譯iOS可能遇到連接錯誤,嘗試添加這2個庫(感謝@那個少年)

  • libz.1.dylib
  • libstdc++.6.0.9.dylib

 

更多文章:

JSBinding+Bridge.Net:框架代碼與邏輯代碼的關係

JSBinding+Bridge.NET:生成綁定(導出)

JSBInding+Bridge.NET:把C#編譯爲Js

JSBinding+Bridge.NET:Inspector拖變量支持(!)

JSBinding+Bridge:邏輯代碼中操做二進制數據

JSBinding+Bridge.NET限制

 

有任何問題請在羣裏提出,或私聊羣主。

相關文章
相關標籤/搜索