而现在的项目一般会选择用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<TextAsset>(fileName);
Assembly assembly = Assembly.Load(asset.bytes);
3.获取脚本,创建主Mono,也就是游戏主逻辑入口,并挂在gameObject(这里我们是ClientMain)
Type script = assembly.GetType(scriptName);//这个是脚本名字,这里是ClientMain
gameObject.AddComponent(script);
4.如果还有其他需要挂上的脚本就同样用这个方式挂上
接着所有逻辑就在ClientMain脚本的Start中展开。
原文地址:http://blog.51cto.com/13638120/2084956