前言
前面鋪墊了這么久,終於要開始寫熱更新了。
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啟動成功。
本篇就講到這里,后邊就要講怎么實現代碼及資源更新了。
晚安!