unity增量更新策略

来源:互联网 发布:淘宝网怎么买彩票 编辑:程序博客网 时间:2024/05/21 10:09

(原文出处 http://blog.csdn.net/janeky/article/details/25923151

这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了。最近在项目开发上线过程中遇到了一些新问题,接下来的时间和大家多多探讨学习。大家在工作中遇到技术问题,或者有什么想分享的,欢迎多多探讨 ken@iamcoding.com.

-------------------------------------------------------------------------------------------------------------------------------------------------------------

之前我们已经学过手机游戏的资源热更新策略了。在实际手游的开发运营中,我们需要经常修复bug,增加新玩法。这些通常都涉及到代码的更新。unity游戏代码的更新比较复杂,也存在不同的更新策略,各有优缺点,在不同的平台上做法也不尽相同。这里主要谈一些比较常用的策略和各大手机平台上的策略。大家有更好的思路,欢迎探讨。

(转载请注明出处 http://blog.csdn.net/janeky/article/details/25923151)

  • 反射

大部分编程语言都是支持反射的,利用反射,可以动态去加载所需的程序。C#也是同样可以用反射来实现。要实现代码的更新,我们在项目初期就要做好规划,将一些容易变更的业务逻辑代码独立划分。每次更新时,将代码打包成dll,再打包成资源文件。程序启动时,检查更新到客户端,客户端通过反射重新加载代码运行。下面通过一个简单的demo来演示。

1.在vs中新建一个代码库工程,命名为test
2.添加几个类Scirpt,Scirpt2,Data
3.将这个项目生成DLL,test.dll
4.新建一个unity项目,将DLL倒入到Asset,改名为test.bytes,不然可能会报错
5.利用我们之前实现过的打包脚本,将test.bytes打包成test.assetbundle。
6.创建CodeUpdate.cs脚本,用于加载代码资源,反射调用。
7.为了验证代码更新后,可以直接加载使用,我们可以更改一下Data.cs的代码,重复以上过程,可以看到,更新了代码打包后,我们重新运行游戏,就可以看到效果

Data.cs

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Data  
  2. {  
  3.     private int attr;  
  4.   
  5.     public Data()  
  6.     {  
  7.         attr = 2;  
  8.     }  
  9.   
  10.     public override string ToString()  
  11.     {  
  12.         return attr.ToString();  
  13.     }  
  14. }  

Script.cs

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Script: MonoBehaviour  
  2. {  
  3.     void Start()  
  4.     {  
  5.         Debug.Log("------------------I am script 1");  
  6.         Data data = new Data();  
  7.         Debug.Log("-------------" + data.ToString());  
  8.     }  
  9. }  

CodeUpdate.cs

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System;  
  4.   
  5. public class CodeUpdate : MonoBehaviour {  
  6.       
  7.     private static readonly string DLL_URL = "file:///c:/test.assetbundle";  
  8.   
  9.     void Start () {  
  10.         StartCoroutine(loadDllScript());  
  11.     }  
  12.       
  13.     private IEnumerator loadDllScript()  
  14.     {  
  15.         WWW www = new WWW(DLL_URL);  
  16.         yield return www;  
  17.         AssetBundle bundle = www.assetBundle;  
  18.         TextAsset asset = bundle.Load("test",typeof(TextAsset)) as TextAsset;  
  19.           
  20.         System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(asset.bytes);  
  21.         Type script1 = assembly.GetType("Script");  
  22.         GameObject obj = new GameObject();  
  23.         obj.AddComponent(script1);  
  24.           
  25.         Type script2 = assembly.GetType("Script2");  
  26.         obj.AddComponent(script2);  
  27.     }  
  28. }  

  • 完整安装包更新

大部分的app更新都是采用完整包更新。在程序启动的时候,检查服务器的最新版本,如果比本地的版本要新,就下载服务器的版本,重新安装替换本地的程序。在IOS平台上,是由App Store来统一管理的。客户端程序只需检查版本,跳转到app store页面即可。android 平台的更新更灵活,略微复杂。在判断版本号,确定要更新后,直接就可以下载服务器的最新的apk文件,安装替换本地的。这里就不演示代码了。大家先理清楚思路,流程,就容易实现了。

  • LUA脚本更新
LUA一直是一种很神奇的脚本语言,无处不在,服务端,客户端,大型机,嵌入式设备都能看到它的踪影。虽然Unity3d官方不支持Lua脚本,但是已经有人写了c#版本的lua解析器了。我们可以将业务代码用Lua来实现。每次要更新代码的时候,只要将lua当做资源文件更新到客户端,运行即可。

C#版 Lua,有很多个版本,这里选择云风他们公司开源的UniLua,大家可以去Githunb下载

https://github.com/xebecnan/UniLua/wiki

  • IOS平台

比较遗憾,IOS是一个封闭的平台,所以它对app程序监管比较严格,一般情况下不运行热更新,每次版本更新都需要提交审核。所以涉及到手游代码的更新,都是采用完整包更新。LUA脚本更新的方式,有朋友试过说可以(他们一般是在程序上线一段时间后才使用Lua更新)。但是也存在风险的,如果被苹果发现,是属于违规的。这里不建议使用。

  • Android平台

目前比较通用的方式是用代码dll反射更新机制。我们在实际过程中,将稳定不变的底层代码单独规划,用作游戏的主程序。全部业务逻辑代码发布时候,打包成dll,制成资源文件。客户端下载后,反射加载。只有当底层主程序要更新是,才单独下载主程序的apk文件,重新安装替换。平时的代码更新,可以随意更新代码dll

  • 总结

上面说的几种方式,各有优缺点。在不同的平台上策略也不尽相同。说一下我的经验:一般是优先发布android版本,有问题随时热更新代码调试。待版本稳定后,发布ios越狱版本。全部稳定后,最后才发布app store。众所周知,app store的审查周期比较长,有可能他们员工去休个假,几个星期才审核通过:)。每次审核不通过,又得重新修改提交审查,又是漫长的等待。在游戏界,时间就是生命。我们尽量在android平台上调试版本。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 充电头接触不良怎么办 苹果充电口松动怎么办 苹果手机速度慢怎么办 苹果6手机屏幕失灵怎么办 手机膜有静电怎么办 手机充电带静电怎么办 苹果6锁屏键坏了怎么办 ipad触摸屏乱点怎么办 6p屏幕失灵怎么办 iphone屏幕压伤怎么办 笔记本光标不动了怎么办 电脑光标不动了怎么办 苹果六按键失灵怎么办 iphone屏幕碎了怎么办 oppo手机内屏坏了怎么办 手机充电变慢怎么办 手机内屏分离怎么办 电脑屏幕摔碎了怎么办 三星手机外屏碎了怎么办 苹果手机外屏碎了怎么办 iphone6s听筒坏了怎么办 苹果x外屏碎了怎么办 苹果手机屏摔坏了怎么办 苹果8外屏摔碎了怎么办 苹果7内屏坏了怎么办 苹果手机屏幕里面有水痕怎么办 iphone6屏幕摔裂怎么办 苹果手机电池坏了怎么办 苹果手机充电器坏了怎么办 苹果充电器老是坏怎么办 苹果手机屏幕失控了怎么办 手机自己乱点怎么办 手机点屏幕没用怎么办 手机界面不动了怎么办 手机关不了机怎么办 小米5花屏怎么办 小米手机死机怎么办呢 手机触屏失灵怎么办? 手机触屏不行怎么办 苹果手机屏幕触摸失灵怎么办 苹果7按键失灵怎么办