由于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接口的时候内存卡无法写入的,也就是无法安装新的包,需要把线拔了,这个问题纠结了好久,一直提示内存卡没有写权限。
欢迎拍砖!!!