Unity手游之路<十三>手游代码更新策略探讨

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


android

  • 反射


  大部分编程语言都是支持反射的,利用反射,能够动态去加载所需的程序。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


ios

[C#]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
public class Data
{
private int attr;
public Data()
{
attr = 2;
}
public override string ToString()
{
return attr.ToString();
}
}


  Script.cs


git

[C#]  纯文本查看 复制代码
?
1
2
3
4
5
6
7
8
9
public class Script: MonoBehaviour
{
void Start()
{
Debug.Log( "------------------I am script 1" );
Data data = new Data();
Debug.Log( "-------------" + data.ToString());
}
}



  CodeUpdate.cs




github

[C#]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
using UnityEngine;
using System.Collections;
using System;
public class CodeUpdate : MonoBehaviour {
private static readonly string DLL_URL = "file:///c:/test.assetbundle" ;
void Start () {
StartCoroutine(loadDllScript());
}
private IEnumerator loadDllScript()
{
WWW www = new WWW(DLL_URL);
yield return www;
AssetBundle bundle = www.assetBundle;
TextAsset asset = bundle.Load( "test" , typeof (TextAsset)) as TextAsset;
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(asset.bytes);
Type script1 = assembly.GetType( "Script" );
GameObject obj = new GameObject();
obj.AddComponent(script1);
Type script2 = assembly.GetType( "Script2" );
obj.AddComponent(script2);
}
}




  • 完整安装包更新


  大部分的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






c#

  • IOS平台


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






服务器

  • Android平台


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



app

  • 总结


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



ps.你们有什么好的Unity3d技术点想讨论的,欢迎告知,我从此将会多多写一下你们比较感兴趣的实战内容。
  最后祝你们工做顺利,项目大卖~。编程语言

相关文章
相关标签/搜索