Unity上面有什麼好的熱更新方案?

rt,最好是已經有線上產品在應用的。


如果題主問的是,有沒有好的資源熱更新方案?答案是,AssetBundle。

如果題注問的是,有沒有好的代碼熱更新方案?就要多說幾句了。。

Unity的代碼熱更新有兩種方式:

1 assetbundle代碼熱更新

Unity的代碼熱更新機制可以簡單概括為以下幾步:

    1. 項目開發中,可以將部分邏輯提取至一個單獨的代碼庫工程中,打包為DLL。
    2. 將DLL打包為AssetBundle
    3. Unity程序動態載入assetBundle中的DLL文件,使用Reflection機制來調用代碼。

程序運行時的狀況如下:

這個方案是真正的c#級別的代碼熱更新,但它有很多限制:

1 iOS平台不支持

2 這些DLL中的腳本不能在編輯器中使用

3 如果腳本在動態Dll里,調用AddComponent()掛此腳本在Prefab上時不能使用AddComponent("SomeScript"),要用AddComponent(Type.GetType("SomeScript"));

4 動態DLL里使用[RequireComponent(typeof(SomeScript))]無效

2 lua熱更新

lua是iOS平台下,熱更新方案的唯一解。目前最成熟的lua插件是uLuacstoLua,有成功的商業產品案例(啪啪三國、絕地戰警)等。

即便有成功案例,但也絕不可能大範圍使用lua,效率是個大問題。

但值得注意的是,即使是使用lua,仍然是不符合appstore的政策,依然存在被下架的風險。

綜上所述:

對於Unity的代碼熱更新,並沒有好的方案。只有差的方案(AssetBundle)和更差的方案(Lua)。

Android:優先用AssetBundle。

iOS:對性能不敏感的邏輯,例如界面邏輯,小範圍使用Lua。


unilua。

或者改mono源碼,加進去熱更新功能。


關於熱更新,官方也無法給出一個比較確定的方案,當然可以使用assetbundle進行資源更新,使用反射將代碼打包編譯成dll進行熱更新,只是在移動平台上就有些問題了,特別是ios平台,反射操作無法使用。目前用的比較多的第三方更新方案是使用lua,這個由曾經魔獸世界採用作為界面腳本,從而紅遍整個遊戲行業,十年經久不衰的腳本。unity有很多三方lua的綁定庫:slua,ulua,C#Light/Evil等等,其中個人覺得國內使用相對較廣且性能還不錯的應該是ulua(可以自行搜索一些公司的招聘需求,已經有公司直接將會ulua這條列入崗位要求了)。這個是ulua的官方網站:ulua - unity效率最高、最完善的熱更新方案!!,網站上除了有ulua的框架源碼,還有官方的視頻教程和交流群可以更方便的上手,可以自行下載學習。


沒有用js的嗎?有很多開源的c#轉js工具,再配合iOS的JavascriptCore應該很方便啊!


我目前的項目,開始就定下了熱更的設計目標,綜合大家的接受度,腳本選了Lua

解釋器用的uniLua,配套的開發模塊有下:

1.手動介面封裝,棄用了FFI是因為性能考慮

2.Lua文件合併載入,解釋器載入介面稍作改動,為了提高載入速度

3.資源管理熱更新實現

至於擔心的性能問題,總結一句話就是不存在,性能問題在於設計,要具體問題具體分析


用國內的ulua吧,雖然同名但不是同一個東西 ulua - unity效率最高、最完善的熱更新方案!!

補充個題外話:lua 在unity上真正能用,是從去反射靜態綁定開始的。這是最早的方案,隨著蘋果il2cpp開始,早期ulua的反射代碼已經不存在價值了,並且反射問題很多。所以有了新的的 tolua#


從設計模式上可以解決熱更新問題,把數據和行為分開,行為分裝到一個dll里,載入進來。ios平台除了用lua目前沒很好的解決辦法。


ulua 加 assetbundle 當然你要寫很多東西。包括ab打包,下載,載入,內存管理。或者用李劍英的解決方案。


看多了什麼ulua slua之爭。 講點題外話吧。

2004年一個老外寫了一個LuaInterface,用於C/LUA/C#之間的通訊(壓棧)

2012年,該老外寫了一個NLUA,用於Unity熱更新 https://github.com/NLua/NLua/issues

2013年還是多久? 某個人在Unity商店上傳了一個ulua插件收費賺錢,但過了一年,(抄襲被告?)被迫下架。

後來國內就瞬間興起了ulua unilua slua tolua等一大批熱更框架。。

都是基於 luainterface、luagit。 主要和核心的內容還是參考的國外NLUA。

做了一些優化。 比如wrap之類的代替反射、支持協程? 64位支持?

算是本土化? 微創新?


另類Unity熱更新大法:代碼注入式補丁熱更新

網上看到的,發這裡供大家參考。


剛好早上看到一篇文章,分享給題主。

Unity3D熱更新LuaFramework入門實戰(1)——代碼熱更新

Unity3D熱更新LuaFramework入門實戰(1)——代碼熱更新 - 羅培羽的文章 - 知乎專欄


JSBinding + SharpKit 方案

Unity代碼熱更新方案 JSBinding + SharpKit 首頁


資源AB就能隨便更;

代碼Android可以搞。

iOS 現在得分兩種,mono下,iOS把內存堆給封了,JIT不能執行新生成的代碼。因為蘋果一向對內存安全敏感而強勢,指紋都單獨裝在小黑盒 ,ios應用程序和外界通信一律走自己的伺服器…讓你們申請塊堆就亂搞那還得了?

il2cpp沒試過,等我更新。。


資源assetbundle,代碼我傾向於不更新。邏輯代碼組件化,然後拼出邏輯。比如playmaker的方式。


還有ulua,assetstore有賣,內存和性能還是有些費。


推薦閱讀:

在 Ubisoft 工作是什麼樣的感覺?
中國的遊戲為何始終在遊戲性上沒有大的進步?
國外有哪些遊戲在法律上已經被認定為侵權另一款遊戲的案例?
Unity3d客戶端開發,要深入學習,更需要先從哪方面入手?
為什麼普遍的單機大作遊戲都缺乏創新和創意?

TAG:遊戲開發 | 手機遊戲 | Unity遊戲引擎 | Lua |