由於Unity沒法進行熱更新,也就是局部更新,所以如果你在設計之前沒有考慮好使用Lua,反射,或者其他方式實現熱更新,但是又要面臨游戲上線那么你可以考慮使用完整包更新,其實這對於游戲包不是很大的情況下,也是一個不錯的選擇,當然設計者在設計之初都想好了熱更新那就寧當別論了。
Unity3d 在移動端考慮Android和Ios平台的完整包更新 實現邏輯: 首先檢查本地的版本和服務器的版本是否相同,如果相同則直接進入游戲,如果不同則下載服務器的最新文件,然后根據最新文件到資源服務器下載最新的安裝包
我這里有個版本文件如下圖,不同的游戲對應的版本文件不同,這個看情況
| ??????版本號 | 更新日志 | 下載鏈接(版本比較只會比較版本號,對應的下載鏈接必須對應到指定的包) |
| 0.0.0 | 更新日志^1:更新測試1^2:更新測試2 | http://***/test.apk |
| 1.0.0 | 7.24第一個版本包 | http:/***/test1.0.0.apk |
IOS: 由於IOS平台我們的無法控制,直接跳往對應的IOS的更新目錄即可
Android: 安卓平台需要做到自動更具版本強制用戶更新
具體采用如下方案

using UnityEngine; using System.Collections; public interface IPlatformUpdate { void DoPlatformUpdate(string downLoadURL); }
using UnityEngine; using System.Collections; public class CPlatfromFactory { public static IPlatformUpdate CreatePlatfrom(string platfrom) { IPlatformUpdate platform = null; if(platfrom.Equals("Android")) { platform = new CAndroidUpdate(); } else if(platfrom.Equals("IOS")) { platform = new CIOSUpdate(); } return platform; } }
using UnityEngine; using System.Collections; public class CAndroidUpdate : IPlatformUpdate { public void DoPlatformUpdate (string downLoadURL) {
//由於自動安裝需要用到Android里面的一些功能。這里就做了一個Android插件,供Unity調用。具體的是在當前的Activity里面有個DownLoadApk的方法接受一個String的參數,然后就是Android里面的功能了。
//具體Android端如何實現可以百度 ,很簡單的代碼,這里不再記錄 AndroidJavaClass installClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject installObj = installClass.GetStatic<AndroidJavaObject>("currentActivity"); installObj.Call("DownLoadApk", downLoadURL); } }
using UnityEngine; using System.Collections; public class CIOSUpdate : IPlatformUpdate { public void DoPlatformUpdate (string downLoadURL) {
//打開對應的連接,這里一般會保存在版本文件Version.txt之中 Application.OpenURL(downLoadURL); } }
在開發中遇到的問題:Android 手機在插usb接口的時候內存卡無法寫入的,也就是無法安裝新的包,需要把線拔了,這個問題糾結了好久,一直提示內存卡沒有寫權限。
歡迎拍磚!!!
