您的位置:首页 > 理论基础 > 计算机网络

Unity动态获取网络代码资源

2016-05-13 11:27 309 查看
由于最近项目需求,需要使用Unity实现从服务器下载代码,更新本地代码,动态载入代码运行。

之前在网上看到一篇实现方式,这里是链接。主要是讲代码首先打包成动态链接库(Dll),随后使用Unity的打包打包成unity的资源文件(.assetbundle或.unity3d),最后使用www类实现下载并读取dll内容,从而实现加载代码。

通过自己的实践,在此对这篇文章中的一些细节进行补充。

首先是利用.cs文件生成dll,笔者使用的是VS进行生成,也测试了使用命令行对C#源文件进行编译。主要是通过运行.Net Framework中的csc程序对C#进行打包,具体用法和参数参见这里

其次,如果仅仅更新代码,可以不必要将dll也打包至unity资源文件中,而是可以直接将dll放于服务器上,使用WWW类的方法可以直接读取下来,并使用如下方式获取dll的内容:string script = www.bytes;并使用C#的Reflection处理代码内容。
还有一个小细节,就是在使用GetType获取类时<pre name="code" class="plain">Type type = assembly.GetType("TestDll");

GetType中的参数是类名,这里我们可以看到作者使用的dll原代码中,并未声明namespace,如果声明了namespace,那么GetType中的参数就要变为namespace.classname,例如:在dll中声明namespace:
namespace MyNameSpace {
public class TestDll : MonoBehaviour {
那么使用GetType时参数就要这样写

Type type = assembly.GetType("MyNameSpace.TestDll");

除此之外,由于笔者所需要的项目要在编辑器模式下运行,即要实现点击菜单,更新代码资源。导致无法使用unity的协程(菜单项方法需为静态方法),此时可以使用如下方法强制等待下载完成:
while (!www.isDone) { }当然,并不推荐使用这种方法。如果网络状态不好,或是其他因素,会导致程序卡死,最终使得编辑器崩溃。为此,我们需要使用C#的多线程,利用WebClient类进行资源下载等操作,具体如何实现,等下次有机会再详细介绍吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity 网络