纳金网

标题: Unity动态加载脚本 [打印本页]

作者: 狂风大尉    时间: 2014-7-31 21:07
标题: Unity动态加载脚本

以下内容转自 http://blog.csdn.net/fg5823820/article/details/8779274



之前在群里跟人谈到脚本更新问题,于是就突然发现因为U3D对资源进行了打包,所以很难更新资源。说实在,我现在还没找到资源更新的办法,不过知道了资源可以从网络下载实时加载。后来看到有人说可以动态加载脚本,于是就去研究了。途中各种蛋疼不提也罢。其实基本原理就是使用到了C#的反射,熟悉反射的应该很简单就能解决。

  1. var fs = new FileStream(@"D:\Personal\My Documents\Projects\TestLib\TestLib\bin\Release\TestLib.dll", FileMode.Open);  
  2.         var b = new byte[fs.Length];  
  3.         fs.Read(b, 0, b.Length);  
  4.         fs.Close();  
  5.         var assembly = System.Reflection.Assembly.Load(b);  
  6.         var type = assembly.GetType("Test");  
  7.         gameObject.AddComponent(type);  
复制代码
分析这段代码

加载里一个DLL,这个DLL实际上是用C#打包的代码库,关于对库的各种叫法实在让人蛋疼,不提也罢。总之建立一个工程然后引用U3D的库UnityEngine.dll就可以编译,不引用UnityEngine.dll当然首先就没法通过编译。

我这里的类名就叫Test,所以获取类型就是这样的。这里添加组件就不能用AddComponent(string)方法,那样会提示找不到了,可能这个方法只是从字典里面找到相应的类型然后在用AddComponent(type)来添加。


要吐槽的是关于那个二进制流。看网上很多WWW来读取TextAsset然后转成byte[]。事实上我不管怎么试都是失败。与干脆用C#自带的函数,就实际情况来说虽然统一使用WWW会比较方便,不过即使用C#来做网络下载难度也不会太大。


最后说缺点。

缺点明显是这样的做更新行不通。因为文件最终没被保存在本地,下次还要下载,不过你可能会下载先保存在本地再读取,那样或许可以,但是我目前还没有尝试。

但是如果是某个脚本有BUG想修复,这样完全就行不通了,这种情况我目前不知道如何处理。有知道的话真想请教请教。

还有个缺点就是因为不能和现有的类直接依赖。那么这时候估计就只能靠接口来解决问题了,事实上低依赖就是设计原则,所以这个缺点并不是完全没办法解决。


硬要说有什么优点的话,可能是可以把部分代码放在服务器,需要的时候才下载下来使用,让别人有客户端也没法运行游戏。



作者: HIDEOKOJIMA    时间: 2014-7-31 22:02
Thanks for sharing this !
作者: hyui    时间: 2014-7-31 22:19
Thanks for sharing !




欢迎光临 纳金网 (http://old.narkii.com/club/) Powered by Discuz! X2.5