使用Unity动态运行外部代码的方法

使用Unity动态运行外部代码的方法

在论坛中经常看到有人问及有关代码更新的问题,近来无事,特研究了下,现与大家分享,如有不正确之处,还请大家多多指正.


在此之前,我们应该明确一点,资源包可以包含一个被制成TextAssets的脚本,但是这样的话他将就不是一个真正的可执行的代码了。如果你想要导入一个包含在你的资源包中的并且可以在你的项目中运行的代码,那么你必须在程序运行之前就已经将你的代码编译好了,因为只有编译过的代码才有可能去运行.


所有第一步我们要做的就是将需要动态运行的脚本进行编译(生成一个dll),


使用Unity动态运行外部代码的方法

打开vs2008,新建项目,选择类库,在这里我创建了一个Test类,代码如下

using System;using System.Collections.Generic;
using System.Linq;using System.Text;

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour{
void Start() {
Debug.Log("sucess"); }
}

 

因为引用了UnityEngine,所以我们要把这个引用添加上,在vs里右击项目面板中的引用,添加引用,选择浏览,找到UnityEngine.dll


使用Unity动态运行外部代码的方法

 

这个文件(我的路径是uninty安装目录\Editor\Data\Managed\UnityEngine.dll),添加好后,在菜单栏点击生成-->生成Test,我们就可以生成我们的dll了.生成的dll可以在vs工程目录下->bin-->Debug下找到.(以上步骤可能感觉很啰嗦,这只是为了照顾一些像我一样不习惯用vs编程的人,大神级的vs用户可以自动选中过滤,哈哈...)

第二步,打开我们吃饭的家伙,将生成的dll文件放到unity工程下(建议放到Asset/Plugins下,当然不放貌似也没有什么关系),说句题外话,其实这个dll文件,我们是可以直接使用的,可以在其他类中直接调用,甚至可以直接拖拽到物体上都是可以的,但现在我们很明显不打算这么做.
下面我们就需要将这个已经编译过的脚本打包成我们的资源包格式了,不过在打包之前还有项工作要做,那就是将我们的Test.dll改成Test.bytes,否则打包的时候会出错.

最后,我们建个脚本去调用这个外部的脚本,代码如下

 

using UnityEngine;using System.Collections;
using System;public class MainPrecess : MonoBehaviour
{ /**
* @Function: * @Ahthor使用Unity动态运行外部代码的方法iHaiyang
* @Date: */
IEnumerator Start ()
{ string url = "file:///"+Application.dataPath+"/Plugins/Test.unity3d";//这个可以是网络地址,Test.unity3d是我们打包后的文件
WWW www = new WWW(url); yield return www;
if(www.error!=null)
{
print(www.error);
}
else
{
AssetBundle bundle =www.assetBundle;
TextAsset txt = bundle.Load("Test") as TextAsset;
//使用反射类载入
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(txt.bytes);
Type type = assembly.GetType("Test");
 
GameObject obj = new GameObject();
obj.AddComponent(type);
}
}