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:
Type type = assembly.GetType("MyNameSpace.TestDll");
除此之外,由于笔者所需要的项目要在编辑器模式下运行,即要实现点击菜单,更新代码资源。导致无法使用unity的协程(菜单项方法需为静态方法),此时可以使用如下方法强制等待下载完成:
while (!www.isDone) { }当然,并不推荐使用这种方法。如果网络状态不好,或是其他因素,会导致程序卡死,最终使得编辑器崩溃。为此,我们需要使用C#的多线程,利用WebClient类进行资源下载等操作,具体如何实现,等下次有机会再详细介绍吧
之前在网上看到一篇实现方式,这里是链接。主要是讲代码首先打包成动态链接库(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类进行资源下载等操作,具体如何实现,等下次有机会再详细介绍吧