前面我們研究了AssetBundle的打包與加載,現在我們來了解下如何在項目中根據版本號更新內容。
最最重要的一點,細心的朋友應該看到了在加載AssetBundle的MrcAssetManager類中,我們使用的WWW加載對象可以使用WWW.LoadFromCacheOrDownload方法,其中第一個參數是資源的url,第二個參數則是我們的要加載的版本號,我們將通過這個版本號決定是不是要重新從服務器上下載。
因此,我們需要在本地和服務器上分別建立一個版本配置文件,里面包含了版本號、資源大小、更新時間、內容等一系列信息,至於存儲方式可以是XML、JSON等合適你的格式,這里我用XML講解。
我們可以建立版本控制類VersionManager,在游戲開始時,讀取本地的版本號並下載服務器的版本信息。
讀取本地版本信息:
1 private int GetLocalVersion() 2 { 3 Debug.Log(path); 4 if (!File.Exists(path)) 5 { 6 XmlDocument doc = new XmlDocument(); 7 XmlElement version = doc.CreateElement("version"); 8 version.InnerText = "1"; 9 doc.AppendChild(version); 10 doc.Save(path); 11 12 Debug.Log("created xmlVersion successfully!"); 13 } 14 15 XmlDocument docRead = new XmlDocument(); 16 docRead.Load(path); 17 XmlElement versionRead = docRead.SelectSingleNode("version") as XmlElement; 18 return int.Parse(versionRead.InnerText); 19 }
下載讀取服務器的版本信息,如果不一致更新本地資源和版本信息:
1 private void CheckVersion() 2 { 3 string url = "http://.../UnityFiles/AssetBundlesForBlog/LOUnityAssetversion.xml"; 4 StartCoroutine(GetServerVersion(url)); 5 } 6 7 private IEnumerator GetServerVersion(string url) 8 { 9 WWW www = new WWW(url); 10 yield return www; 11 12 XmlDocument doc = new XmlDocument(); 13 doc.InnerXml = www.text; 14 15 XmlElement version = doc.SelectSingleNode("version") as XmlElement; 16 17 ServerVersion = int.Parse(version.InnerText); 18 19 LocalVersion = GetLocalVersion(); 20 if (LocalVersion < ServerVersion) 21 { 22 Debug.Log("need update"); 23 //更新本地版本信息 24 OverrideLocalVersion(); 25 } 26 27 TestScript.DefaultTest.StartLoad(); 28 } 29 30 private void OverrideLocalVersion() 31 { 32 XmlDocument docWrite = new XmlDocument(); 33 docWrite.Load(path); 34 XmlElement versionWrite = docWrite.SelectSingleNode("version") as XmlElement; 35 versionWrite.InnerText = ServerVersion.ToString(); 36 docWrite.Save(path); 37 }
最后,將AssetBundle管理類MrCAssetManager中WWW對象的版本號改為使用我們的當前版本號,就可以啦。這樣,當我們更新了服務器上的AssetBundle資源后,只要修改下服務器上的版本號,客戶端就會因為對比版本不一致而重新下載,而如果一致,就會使用存在本地的AssetBundle資源而不重新下載。