前言
前面鋪墊了這麼久,終於要開始寫熱更新了。
Unity遊戲熱更新包含兩個方面,一個是資源的更新,一個是指令碼的更新。
資源更新是Unity本來就支援的,在各大平臺也都能用。而指令碼的熱更新在iOS平臺則是不被允許的(除了Lua)。
為了讓一套程式碼能在各個平臺都支援熱更,將遊戲的業務邏輯全面Lua化,是一種解決方法。這也是ToLua在做的事。
關於Unity熱更與平臺的關係 可以閱讀陳嘉棟大佬的文章:誰偷了我的熱更新?Mono,JIT,iOS
一、熱更新的原理
1、熱更新的簡單理解
手機App的更新方式有兩種。
第一種是全量更新。每一次App更新,開發者都需要上傳一個完整的軟體包(apk、ipa)到分發平臺,而使用者也需要下載一個完整的新軟體包來重新安裝。這對使用者來說很不友好,對開發者更不友好。
因為開發者上傳到平臺後,還需要等待平臺的漫長稽核,特別是iOS平臺(短則兩天,長則十天半月),很是影響遊戲的版本計劃。
因此第二種更新方式就出來了。
第二種是增量更新,每次更新,開發者上傳本次更新的內容到資源伺服器上,使用者的App客戶端也只用更新本次新增內容就行,無需重新下載App。
看似很完美的方式,並且在端游上也是成熟的操作,但是這樣的方式因為更新內容不可控,被蘋果給禁止了(Lua是蘋果留的一個口子)。
2、熱更新原理詳解
(因為我個人對此框架的理解還僅限於使用階段,並不能很好的闡述其原理。為避免誤導,現直接將我學習此框架時所看的文章對於此原理的解釋直接引用過來。)
原文連結:https://zhuanlan.zhihu.com/p/21386682
以下兩條分隔線之間的內容都是引用:
如下圖所示,Unity3D的熱更新會涉及3個目錄。
熱更新的過程圖
遊戲資源目錄:裡面包含Unity3D工程中StreamingAssets資料夾下的檔案。安裝遊戲之後,這些檔案將會被一字不差地複製到目標機器上的特定資料夾裡,不同平臺的資料夾不同,如下所示(上圖以windows平臺為例)
Mac OS或Windows:Application.dataPath + "/StreamingAssets"; IOS: Application.dataPath + "/Raw"; Android:jar:file://" + Application.dataPath + "!/assets/";資料目錄:由於“遊戲資源目錄”在Android和IOS上是隻讀的,不能把網上的下載的資源放到裡面,所以需要建立一個“資料目錄”,該目錄可讀可寫。第一次開啟遊戲後,程式將“遊戲資源目錄”的內容複製到“資料目錄中”(步驟1,這個步驟只會執行一次,下次再開啟遊戲就不復制了)。遊戲過程中的資源載入,都是從“資料目錄”中獲取、解包(步驟3)。不同平臺下,“資料目錄”的地址也不同,LuaFramework的定義如下:
Android或IOS:Application.persistentDataPath + "/LuaFramework" Mac OS或Windows:c:/LuaFramework/ 除錯模式下:Application.dataPath + "/StreamingAssets/"注:”LuaFramework”和”StreamingAssets”由配置決定,這裡取預設值網路資源地址:存放遊戲資源的網址,遊戲開啟後,程式會從網路資源地址下載一些更新的檔案到資料目錄。
這些目錄包含著不同版本的資原始檔,以及用於版本控制的files.txt。Files.txt的內容如下圖所示,裡面存放著資原始檔的名稱和md5碼。程式會先下載“網路資源地址”上的files.txt,然後與“資料目錄”中檔案的md5碼做比較,更新有變化的檔案(步驟2)。
files.txt
LuaFramework的熱更新程式碼定義在Assets\LuaFramework\Scripts\Manager\GameManager.cs,真正用到專案時可能還需少許改動。
個人理解:
遊戲資源目錄: 是遊戲的安裝目錄。如果在是Unity裡直接執行,應該指的就是Assset/StreamingAssets目錄;
如果是打包成exe程式,應該是exe程式裡的某個目錄(猜的,沒驗證)
資料目錄:因為遊戲資源目錄不可寫,因此程式又額外開闢的一個能讀寫的目錄,就是資料目錄。
網路資源地址:這個說的就是伺服器資源目錄了。
二、熱更伺服器搭建
從上文了解下,要實現熱更新功能,一個用於存放網路資源的伺服器是必須的。我這裡選用Tomcat來做伺服器(任何其它能提供網路訪問服務的伺服器都可以)。
下載並安裝Tomcat
1)下載Tomcat
版本:Tomcat9.0 windows平臺64位版,下載地址:https://tomcat.apache.org/download-90.cgi
2)下載JDK
jdk版本1.8或以上(這個版本根據Tomcat的需求來,如果使用其它版本Tomcat,則可能需要其它版本的jdk)
下載地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
3)環境變數配置
Tomcat下載之後,無需安裝,解壓到指定目錄即可。
JDK下載之後,執行安裝程式,直到結束。
為了讓Tomcat能正常執行,需要配置環境變數,我配置瞭如下四項。
使用者變數里加這兩個:
JAVA_HOME:F:\ProgramsDirectory\Java\jdk1.8
CATALINA_HOME: I:\apache-tomcat-9.0.22
系統變數Path裡新增這兩個目錄:
F:\ProgramsDirectory\Java\jdk1.8\bin
I:\apache-tomcat-9.0.22\bin
請參照自己的實際目錄進行調整,這裡不提供詳細的配置方法,我這個也不是標準配法。有問題請善用搜尋。
4)執行Tomcat
環境變數配置完成之後,執行apache-tomcat-9.0.22\bin目錄下的startup.bat檔案。
看到http-nio-8080之類的字樣,表示伺服器已經執行,如下圖。
(我這裡不知道為啥亂碼了,明明沒有中文及空格等不合規目錄,不過不影響使用)
在瀏覽器裡輸入:http://localhost:8080/ ,看到如下頁面,表示Tomcat啟動成功。
本篇就講到這裡,後邊就要講怎麼實現程式碼及資源更新了。
晚安!