unity熱更新腳本
『壹』 unity可以代碼熱更新嗎
可以,目前比較成熟的是用Lua,比如toLua#,題主可以在github關注一下.還有一種是ILRuntime
『貳』 為什麼Unity沒有實現iOS平台代碼熱更新
IOS不是JIT模式,所以不支持代碼熱更新。但是現在可以用Lua腳本中轉一下實現,IOS類的熱更新可以實現的。
『叄』 unity幾個路徑以及熱更新原理
1.Resources 路徑 只讀 不能動態的修改
存放內容 預制體(prefabs) - 不容易變化的預制體
prefabs打包的時候 會自動過濾不需要的資源 有利於減小資源大小
主線程載入
Resources類的Load方法
文件夾中的內容打包的時候會被壓縮和加密
2.streamingAssetsPath 內容會原封不動的打入包中
一般建議存放一些二進制文件 (配置文件,unity資源包(AB文件)等)
特點
只讀 不可寫
主要存放二進制文件
通過WWW類 讀取文件(移動端)
3.persistentDataPath 特殊路徑 唯一可讀寫的路徑
這個路徑在IOS平台是 應用程序的沙盒
但是在安卓Android平台上 它可以是程序的沙盒 也可以是SDcard
並且在打包輸出的時候可以設置為沙盒或者SDcard
projectsettings - otherSettings - writePermission
可讀寫 不同平台路徑不同 這個路徑下的文件夾 首次運行程序時自動創建
熱更新解決方案 將易變資源 還有邏輯 (1.0版本)放在streamingAssetsPath(資源包AB文件 配置表 Lua文本文件)
從網路端下載版本文件 讀取出數據 對比當前伺服器版本和本地版本版號 例如1.1版本 從伺服器下載最新版本
更新的內容 大小等相關數據 MD5驗證
『肆』 為什麼Unity沒有實現iOS平台代碼熱更新
剛好聽了一節關於Unity iOS熱更新的課,獲得了一些關於進行熱更新的注意事項和重要路徑方面的相關知識。現在大概的講一下,可能不太對,聽聽就行。
第三,unity熱更新有四個重要路徑--Resources,Streamingassets,Apllication.datePath,Apllication.persistentDatePath.重點講一下後兩個。Apllication.datePath是屬於游戲的數據文件夾的路徑,用到的時候很少,是無法進行熱更新的。Apllication.persistentDatePath屬於持久化數據存儲目錄的路徑,文件夾下的資源無論使用與否都會被打包,運行時有效,可以讀寫,無內容限制,適合進行熱更新。
大概這樣,沒有具體做過,肯定不全面了。
『伍』 unity lua 熱更新 哪些模塊
更新LUa其實也是更新資源。 Lua被看作一個資源么。Lua代碼都是運行時才編譯的,不運行的時候就如同一張圖片、一段音頻一樣,都是文件資源;所以更新邏輯只需要更新腳本,不需要再編譯,因而Lua能輕松實現「熱更新」。運行效率由於使用反射,所以成為它與生俱來的詬病。目前有對他的改進,像C#ToLua、Slua。但是Ulua是很成熟的,這個對於項目開發我認為暫時比性能重要!很多人在用,很多坑都已經被人采完。個人比較看好Slua的發展。當然了還有李總的L#走的就不是Lua的路。網上還有說nLua的,我是新手不了解。 看看權威的解釋:ulua包含兩種c模式(luajit版+原生luavm版),加之tolua c#提供了直接訪問渠道。所以追求效率的,請選用ulua。但是ulua因為底層使用luajit,而luajit目前不能在WP平台使用,所以如果ulua支持WP平台需要第二種原生luavm的底層庫。nlua包含2種模式(KeraLua c版本)(KopiLuac#版本),它支持全平台,因為c版本底層用的原始的luavm(非luajit)。但是缺少tolua c#的支持,因此效率略低於ulua,但是支持WP平台(其他平台也支持)。unity lua 熱更新 哪些模塊
『陸』 如何評價騰訊在Unity下的xLua熱更方案
我認為xlua的概念很好,很多人用lua就是為了熱更新,如果沒有熱更新的需求,大多數人是不喜歡lua,或者所謂的腳本開發的,xlua很好的解決了這部分人得需求。
但我有一點其他看法,我04年畢業在網易工作的時候,網易的游戲都是基於腳本的,不管是客戶端,還是伺服器端,那個時候不是lua,就是python,還有一種是類似c語法的腳本(我忘記名字了),這個是雲風主導的,當時選擇腳本作為邏輯開發語言的核心想法**不是為了熱更新**,而是解決
1)劃分引擎層和業務層,svn管理好許可權,讓新來的同學,接觸不到核心引擎的代碼許可權,他們只能在腳本層做業務,等你對業務足夠熟悉,對引擎足夠了解,對公司足夠忠誠後,才開放引擎層代碼,這么做早年是為了解決私服問題,很多同學拿著全部源代碼去架設私服,這多可怕,所以做業務的程序員只能拿到一個編譯後的app和一份腳本介面文檔,而編譯出來的app會檢查線上ip,報告非法伺服器地址等,協助打擊私服。
2)避免書寫不好的c、cpp代碼崩潰整個進程,腳本代碼出錯了,最多影響局部邏輯,還可以上報腳本錯誤,方便後續解決問題,現在unity里也一樣,如果c#代碼書寫不好,就直接閃退了,不如用lua做一個安全的調用層。
3)快速修改代碼,快速跑起來,早年cpp代碼編譯速度比較慢,修改一行代碼調試運行等半天,腳本代碼方便修改,方便跑起來,不用等,放到今天也一樣,同時iOS還有text size大小的限制,太多的stub function會撐大text size,而lua腳本再多的代碼也不會有這個問題,不用再為了text size取捨代碼怎麼寫,功能去留的問題。
4)反外掛,對,你沒看錯,反外掛,早年PE各種脫殼、反編譯工具,使得一個exe幾乎沒有秘密,外掛作者很容易做外掛,而用腳本後,幾乎所有邏輯都是中間代碼,這部分中間代碼可以通過修改opcode,加密,一邊run,一邊解密等技術,保證在進程空間內基本沒有完成代碼存在,對外掛作者是個很大挑戰,所以網易的游戲反外掛歷來做的都是最好的;
5)最後才是所謂的「熱更新」, 當年也不是現在這種熱更新,就是每次客戶端啟動的時候,有一個launcher去伺服器下載一個update,然後應用這個update而已。
『柒』 unity怎麼用lua做熱更新
更新LUa其實也是更新資源。 Lua被看作一個資源么。Lua代碼都是運行時才編譯的,不運行的時候就如同一張圖片、一段音頻一樣,都是文件資源;所以更新邏輯只需要更新腳本,不需要再編譯,因而Lua能輕松實現「熱更新」。運行效率由於使用反射
『捌』 unity3d的熱更新一定要花20萬么
熱更新,是對hot update 或者 hot fix的翻譯,計算機術語,表示在不停機的前提下對系統進行更改。
hot 就是熱,機器運行會發燙,hot就是不停機的意思。
熱更新,是個很形象的詞,機器燙的時候更新,開著更新。
比如Windows 不重啟的前提下安裝補丁
比如Http伺服器在不重啟的前提下換掉一個文件
那麼對於Unity3D來說,何謂熱更新?
額……這個真相實在是不想講出來,因為很多時候,這個詞都用錯了。
Unity3D是一個客戶端工具,用戶是否重啟客戶端,根本是我們不關心的問題。
很多時候我們用著熱更新這個詞彙,卻不需要真的熱更新。
只有少部分游戲,游戲資源在玩的過程中邊玩邊下,不重啟的前提下變更了資源。
我們不需要用戶不重啟客戶端就能實現資源代碼的更新,我們需要的是用戶重啟客戶端能實現資源代碼的更新。
讓我們暫時放過這個我們的需求連詞彙都用錯了這個基本事實,來總結一下何謂Unity3D熱更新
Unity3D熱更新就是指:用戶重啟客戶端就能實現客戶端資源代碼更新的需求或者功能。
為何熱更新
熱更新,能夠縮短用戶取得新版客戶端的流程,改善用戶體驗。
沒有熱更新:
pc用戶:
下載客戶端->等待下載->安裝客戶端->等待安裝->啟動->等待載入->玩
手機用戶:
商城下載APP->等待下載->等待安裝->啟動->等待載入->玩
有了熱更新
pc用戶:
啟動->等待熱更新->等待載入->玩
有獨立loader的pc用戶:
啟動loader->等待熱更新->啟動游戲->等待載入->玩
手機用戶:
啟動->等待熱更新->等待載入->玩
通過對比就可以看出,有沒有熱更新對於用戶體驗的影響還是挺大的,主要就是省去用戶自行更新客戶端的步驟。
為了方便用戶、留住用戶、進而從留住的用戶身上賺到錢,熱更新如今已經成為了大部分游戲的標配功能。
如果你的游戲不標配這個功能,那麼競爭力就會少一些,無論是主動還是被動,無論是方便用戶還是被標配,你都必須面對熱更新這個課題,雖然這個詞用錯了。
如何熱更新
熱更新是為了讓用戶獲得資源和代碼的變更,這里的代碼不是指真的代碼,用戶不要代碼,他要的是變化的業務邏輯。實現變更的具體過程是首先查並更新本地資源和業務邏輯,如需下載則下載。然後啟動時資源均從本地資源創建,業務邏輯從本地執行。
Unity3D提供了一種機制AssetBundle,可以滿足所有資源的比對下載載入,但是assetbundle每平台分別打包對於多平台項目而言比較麻煩,是一個明顯的短板,而且assetbundle不能脫離unityeditor產生,也是一個麻煩,項目大了話,多人合作,把所有資源都放入assetbundle明顯降低效率。
對於代碼,Unity3D是不提供變更機制的。但是Unity3D執行核心是Mono,也就是dotnet,dotnet有一種符號反射機制,可以直接載入一個dll,然後反射出其中的類型進行操作。符號和反射的主要問題是有些平台不能使用,比如ios wp8。另外dotnet有一種emit機制,可以運行時調用編譯器對代碼進行編譯,他的問題也是平台不支持。
以上兩點是Unity3D免費贈送給你的幫助
如果不能滿足你的需求,你就需要自己搞定三個模塊:
資源下載模塊
當assetbundle不能滿足需要時,我們需要自己建立檢查更新需要則下載的機制,也就是資源下載模塊。
這個資源下載模塊應該有一個版本生成工具,我們將一組文件生成一個一個版本待下載。
有一個Unity3D用的下載模塊,下載模塊會首先檢查伺服器上的版本信息,和本地信息做比對,需要的文件則下載。
資源載入模塊
然後需要建立自己的從下載保存在本地的文件中載入出資源的機制,也就是資源載入模塊。
資源載入模塊負責從下載的文件中載入出資源。
如果你希望游戲帶有一份初始資源文件,這里有兩種思路
一種是資源載入模塊直接提供從包內文件和下載文件兩種載入路徑
一種是游戲第一次啟動時,將包內文件全部到下載文件
腳本模塊
當符號反射不能滿足需求時,業務邏輯更新就只有套用腳本語言這一條路,也就是腳本模塊。
雖然dotnet世界裡有很多腳本可以用 ironRuby ironPython,可是在unity這個特定環境下全部不可用。
你可以使用的一個選擇是lua,這個由魔獸世界採用作為界面腳本,從而紅遍整個游戲行業,十年經久不衰的腳本。
unity有了很多lua的綁定庫,也有了unilua這樣的pure c#移植實現。
你還有一個選擇是C#Light/Evil,他是C#語法的,pure c#實現的一門新生腳本語言,就是為了Unity3D邏輯熱更新而生。
『玖』 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上看到。
『拾』 unity.streamingassets 不能熱更新嗎
可以實現資源更新 模型貼圖Prefab (需要打成assetbundle的包)代碼更新的話需要用到腳本迭代