查看: 1755|回复: 2
打印 上一主题 下一主题

[其他] Unity动态加载脚本

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-7-31 21:07:10 |只看该作者 |倒序浏览

以下内容转自 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想修复,这样完全就行不通了,这种情况我目前不知道如何处理。有知道的话真想请教请教。

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


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


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-7-31 22:02:56 |只看该作者
Thanks for sharing this !
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-7-31 22:19:30 |只看该作者
Thanks for sharing !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-17 06:46 , Processed in 0.092901 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部