现在的手游项目如果没个热更新迭代根本跟不上, 特别是像我们项目做mmo的更是需要经常改动代码。

而现在的项目一般会选择用lua的方式实现热更新

不过我们项目由于历史原因没有使用,用的是另外一种方案

在项目里的所有GameObject都不挂脚本(NGUI脚本就通过代码的方式挂上),自己写的脚本都不继承Mono并打成dll,然后通过一个启动脚本去打开这些dll。

不过这样就有个问题,ios不能热更。。。

不管怎么样,先来讲讲这种方案要怎么做。

首先有两部分,一部分是打包,一部分是解包。

而包又分为资源包和代码包。

先讲打包

1.资源打包在之前写的另一篇文章有写到

http://blog.csdn.net/chrisfxs/article/details/55046339

2.代码打包

这个在之前也有说到

http://blog.csdn.net/chrisfxs/article/details/53213640

主要就是把代码全部打成dll,用TextAsset类型打开再打成assetBundle

然后是解包

1.资源解包

资源解包之前也是有讲

http://blog.csdn.net/chrisfxs/article/details/55046339

上面其实都有讲,其实主要就是想讲代码解包

2.代码解包

首先需要有一个脚本LoadingScript作为整个项目的初始化入口

在这个脚本的Awake里面去做各种配置,比如根据不同的平台获取不同的文件路径,播放cg、闪屏等

在Start函数里去设标志位开始初始化

在Update里开始按各种状态开始工作

1.下载脚本的AssetBundle

2.反射

TextAsset asset = www.assetBundle.LoadAsset(fileName);  
Assembly assembly = Assembly.Load(asset.bytes);  

3.获取脚本,创建主Mono,也就是游戏主逻辑入口,并挂在gameObject(这里我们是ClientMain)

Type script = assembly.GetType(scriptName);//这个是脚本名字,这里是ClientMain  
gameObject.AddComponent(script);  

4.如果还有其他需要挂上的脚本就同样用这个方式挂上
接着所有逻辑就在ClientMain脚本的Start中展开。