之前的一篇文章《[Unity3D学习]Unity代码热更新解决方案测试结果总结》只是说了一下方案的流程,今天刚好有时间,又再看了一下热更新这一块!就直接将代码分享出来。代码热更新的核心基本实现,只是需要处理一些依赖等等。
资源都是放在我blog的服务器上,提供给大家测试。
时间有点晚了1:30,直接贴代码睡觉了!(最近一个月拼死的加班,实在太累。)
demo : http://pan.baidu.com/s/1c0cuTZa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
using UnityEngine; using System.Collections; /// <summary> /// 游戏壳的入口,用于加载真实的代码 /// </summary> public class Index : MonoBehaviour { private WWW www; public static WWW uiWWW; private System.Reflection.Assembly assembly; // Use this for initialization void Start () { StartCoroutine(loadSprite()); //GameObject go = new GameObject(); //go.AddComponent<Game>(); } void Update() { } private IEnumerator loadSprite() { www = new WWW("http://game.gamerisker.com/assets/Core.assetbundle"); yield return www; if (www.isDone) { AssetBundle bundle = www.assetBundle; TextAsset asset = bundle.Load("Core", typeof(TextAsset)) as TextAsset; assembly = System.Reflection.Assembly.Load(asset.bytes); System.Type script = assembly.GetType("Game"); Debug.Log("Load Game Script Complete..."); gameObject.AddComponent(script); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using UnityEngine; using System.Collections; /// <summary> /// 这个类是真正的游戏入口类,这个类中存放业务逻辑 代码热更新的就是这边的代码!~ /// </summary> public class Game : MonoBehaviour { private WWW www; private WWW fontWWW; // Use this for initialization void Start() { Debug.Log("Start Load UIAtlas!"); StartCoroutine(LoadAtlas()); StartCoroutine(LoadFont()); } void Update() { if (www != null && !www.isDone) { Debug.Log("atlas progress : " + www.progress); } if (fontWWW != null && !fontWWW.isDone) { Debug.Log("font progress : " + fontWWW.progress); } } private IEnumerator LoadFont() { fontWWW = new WWW("http://game.gamerisker.com/assets/Font.assetbundle"); yield return fontWWW; Complete(); } private IEnumerator LoadAtlas() { www = new WWW("http://game.gamerisker.com/assets/Atlas.assetbundle"); yield return www; Complete(); } private void Complete() { if (fontWWW.isDone && www.isDone) { GameObject atlas = www.assetBundle.Load("Default", typeof(GameObject)) as GameObject; UISprite sprite = NGUITools.AddChild<UISprite>(gameObject); UIAtlas uiatlas = atlas.GetComponent<UIAtlas>(); sprite.atlas = uiatlas; sprite.spriteName = "default_tishikuang"; sprite.width = 300; sprite.height = 300; //这里的字体 是NGUI 例子里面的字体,我直接将他的prefab 打成了assetbundle 使用 GameObject font = fontWWW.assetBundle.Load("SciFi Font - Normal",typeof(GameObject)) as GameObject; UIFont uifont = font.GetComponent<UIFont>(); UILabel label = NGUITools.AddChild<UILabel>(sprite.gameObject); label.text = "Load Script Succeed!"; label.transform.localPosition = Vector3.zero; label.transform.localScale = Vector3.one; label.width = 300; label.bitmapFont = uifont; Debug.Log("Complete."); } } } |
参考文章:
22 Comments
[…] 下一篇: 《[Unity3D学习]Unity代码热更新 源码下载》 […]
您好,我最近也在弄unity3d代码热更新,准备用dll实现。看了您的demo,有个问题没有想请教下:
您的例子里面有这样的代码:
UIFont uifont = font.GetComponent();
请问你是通过什么策略解决获得的uifont为空的问题的?
NGUI的代码都是放在Index中的。请看我的上一篇文章。
您好,想问下Game脚本所在工程里面需不需要有NGUI的代码。
如果没有不需要的话,Game脚本中使用了NGUI的代码(UISprite),感觉应该编译不过呀
如果引用的话,Core.assetbundle里面应该也会有NGUI的内容。
Game 里面不需要包含NGUI代码的,可以单独打包!具体的打包方式,去网上找找吧!
非常感谢
大神,我在网上搜了。我找到的方法是先编译成dll(Monodevelop,或者VS),然后用BuildPipeline打包。我现在的问题是,我新建立了一个unity3d工程,里面放入Game脚本,可是编译不过(因为工程中没有引入NGUI),就没有办法用vs生成dll了,卡在这里不知道怎么解决了。能帮忙给个思路吗?
3.将这个项目生成DLL,test.dll
4.新建一个unity项目,将DLL倒入到Asset,改名为test.bytes,不然可能会报错
5.利用我们之前实现过的打包脚本,将test.bytes打包成test.assetbundle。
6.创建CodeUpdate.cs脚本,用于加载代码资源,反射调用。
大神,我没说清楚问题,我现在是卡在了前两步。我是先建立了一个unity3d的空的工程,然后加入了Game脚本,因为Game脚本中使用了NGUI的代码,但是我的工程里面没有导入NGUI,所以编译就会报错,这个时候生成不了Dll。现在问题就是生成不了Dll。
教你一个笨方法,将NGUI先做成dll 然后再打Game 就可以了。
您好,我把NGUI的内容生成dll了,现在是能够把Game脚本单出打包了,也可以动态加载进Index工程。但是会报下面的错误:
FileNotFoundException: Could not load file or assembly ‘NGUI, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’
这个时候如果我也把这个NGUI的dll加在Index工程中时,又会和现有的工程中的NGUI代码冲突。请问您的Game脚本是怎么生成Dll的。我的QQ是820902063,大神,您要是方便的话,加下QQ,教教俺
你有出现放在Plugin目录下的脚本,挂载到Prefab上之后,打成AssetBunble运行时内存出现泄漏的情况吗?
你好,目前没有遇到这种机制存在泄漏问题,可能你的Plugin中代码本身存在泄漏,可以先在编辑环境下详细分析下!
请问您是怎么生成Core.assetbundle的?我把Assembly里面的type打印出来了,只有一个,是不是Core.assetbundle里面只有一个Game脚本?
Game脚本里面用到了NGUI的类,您是如何做到Core.assetbundle里面不包含NGUI的?
大神求指教
Core.assetbundle 确实只有Game脚本
请问您是怎么生成Core.assetbundle的?我把Assembly里面的type打印出来了,只有Game Game+d__0 Game+d__2,是不是Core.assetbundle里面只有一个Game脚本?
Game脚本里面用到了NGUI的类,您是如何做到Core.assetbundle里面不包含NGUI的?
大神求指教
可以用vs 打包一下,网上搜索下吧
System.Reflection.Assembly.Load 这个方法在未越狱的iOS上不能使用吧?楼主测过吗?
你好,在未越狱的机器上也是可以使用的,只是因为apple不允许代码更新,所以不去那么做。
换句话说,IOS没戏呗!
System.Reflection.Assembly.Load 在IOS上用不了吧!
在IOS上没有测试过,因为不考虑IOS更新