游戲腳本lua熱更新
❶ unity中lua 是怎麼運行原理
lua 是腳本語言
也就是說它在運行之前不需要進行編譯
這個特點讓它能靈活的實現熱更新的特性,只需要改變lua腳本文檔中的內容就能實現代碼更新。但缺點也顯而易見,不進行編譯而通過解釋器一行一行運行的代碼會嚴重的降低執行效率
❷ Unity3D開發中熱更新為什麼不能使用C#的思考
閱讀了網上一些文章,其實使用C#進行熱更新是可以的,將需要更新的代碼打包成程序集,然後利用反射即可,但是也提到在IOS平台是不行的,至於為什麼不行,就不再說了,然後就是推薦Lua作為熱更新方案,但是,為啥Lua就行?C#就不行?
因為C#是編譯型語言,Lua是解釋型語言?
好多人都說Lua能熱更新,是因為它是解釋型語言,不用編譯,在運行時能動態解釋Lua代碼並運行。這種方法實際上不準確,從某些角度來說是錯的。Lua確實是解釋性腳本語言,但是不是因為是解釋型才能進行熱更新。即使使用C++這種編譯語言,也能進行熱更新,將動態鏈接庫進行更新就是,然後動態載入動態鏈接庫獲取更新的函數地址即可。
而且,還有一點,C#並不能說是一種編譯型語言,C#代碼會被編譯成IL,IL解釋成機器碼的過程可以在運行之前進行也能在運行時進行。如果在運行時進行解釋,那麼和Lua不就一樣了嗎,為啥C#不能進行熱更新呢?
JIT對IL進行解釋執行的原理
首先說一下,JIT對IL如何在運行時進行解釋並執行的,大致過程為:將IL解釋為所在平台的機器碼,開辟一段內存空間,要求這段內存空間可讀、可寫、可執行,然後把解釋出的機器碼放入,修改CPU中的指令指針寄存器中的地址,讓CPU執行之前解釋出來的機器碼。
注意這段內存的條件,最重要的一條是必須是可執行的,一般的內存申請我們只是存放數據,但是這里的內存許可權要是有可執行許可權
IOS限制了什麼?
IOS不允許獲取具有可執行許可權的內存空間,這就直接要求JIT要以full AOT模式,這種模式會在生成之前把IL直接翻譯成機器碼而不是在運行期間,進行了這種操作C#從某種角度來說和C++一樣,成為了編譯型語言,失去了運行時解釋的功能。
Lua的解釋執行怎麼就行呢?
如果Lua的解釋執行原理和C#相同,肯定也不能在IOS平台上運行時解釋執行。Lua是使用C編寫的腳本語言,它在運行時讀入Lua編寫的代碼,在解釋Lua位元組碼(Lua自己的指令)時不是翻譯為機器碼,而是使用C代碼進行解釋,不用開辟特殊的內存空間,也不會有新代碼在執行,執行的是Lua的虛擬機,用C寫出來的虛擬機,這和C#的機制是完全不同的,因為Lua是基於C的腳本語言。
總結
說白了,就是由於Lua這種腳本語言的特性,基於已經存在的某種語言的一種新的語言,這也是腳本語言和C#、C++這類語言的本質區別。當然,Lua虛擬機不僅可以使用C寫,也可以用C#寫。使用熱更新也不一定非要用Lua,Python同樣可以,只不過Lua短小精悍,本身代碼長度就不是很大,可以從GitHub上看到。
❸ 蘋果現在禁了熱更新,那用wax+lua進行熱更新會被禁么
由於lua作為開發腳本,本身能夠調用的功能是確定、有限的,所以相對來說比較安全。
重災區為JSPatch和Rollout.io這兩個框架,幾乎100%收到警告郵件無一倖免。
以上都是摘抄的,我是這么認為的,也相信蘋果是流氓的,但不至於所有的都禁止了。
❹ slua,ulua,nlua,unilua這幾種unity3D的lua插件各有什麼優劣
請選用ulua、一段音頻一樣更新LUa其實也是更新資源,但是支持WP(其他也支持)!很多人在用,很多坑都已經被人采完。個人比較看好Slua的發展,我是新手不了解,加之toluac提供了直接訪問渠道:ulua包含兩種c模式(luajit版+原生luavm版),所以成為它與生俱來的詬病。網上還有說nLua的。看看權威的解釋。所以追求效率的、Slua,這個對於項目開發我認為暫時比性能重要,所以如果ulua支持WP需要第二種原生luavm的底層庫,因而Lua能輕松實現「熱更新」,像CToLua。Lua被看作一個資源么,它支持全,都是文件資源。但是ulua因為底層使用luajit,因此效率略低於ulua,而luajit目前不能在WP使用。但是缺少toluac的支持;所以更新邏輯只需要更新腳本,不需要再編譯。但是Ulua是很成熟的,不運行的時候就如同一張圖片。目前有對他的改進。當然了還有李總的L走的就不是Lua的路。Lua代碼都是運行時才編譯的,因為c版本底層用的原始的luavm(非luajit)。運行效率由於使用反射。nlua包含2種模式(KeraLuac版本)(KopiLuac版本)