关于unity动态运行外部代码
经常在论坛中看到有人询问有关代码更新的问题,近来我抽时间研究了一下,有了一些心得,现在与大家分享。若有不正确的地方,请大家多多指正。
准备工作:明确代码运行前提
在开始具体操作之前,我们需要明确一点:资源包可以包含被制成 TextAssets 的脚本,但这样的脚本并非真正可执行的代码。若要导入包含在资源包中且能在项目里运行的代码,必须在程序运行前将代码编译好,因为只有编译后的代码才有可能运行。
步骤一:编译动态运行的脚本
第一步,我们要将需要动态运行的脚本编译成一个 dll 文件。具体操作如下:
- 打开 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"); } }
2. 由于代码引用了 `UnityEngine`,所以需要添加该引用。在 VS 里右击项目面板中的“引用”,选择“添加引用”,接着点击“浏览”,找到 `UnityEngine.dll` 文件(我的文件路径是 `unity` 安装目录 `\Editor\Data\Managed\UnityEngine.dll`)。
3. 添加好引用后,在菜单栏点击“生成” -> “生成 Test”,即可生成 `dll` 文件。生成的 `dll` 文件可以在 VS 工程目录下的 `bin -> Debug` 文件夹中找到。
这里的步骤可能看起来比较繁琐,主要是为了照顾像我一样不习惯用 VS 编程的人,VS 大神用户可自动忽略,哈哈。
## 步骤二:放置编译好的 `dll` 文件
打开 Unity 工程,将生成的 `dll` 文件放到 Unity 工程下,建议放到 `Asset/Plugins` 目录下,当然放在其他位置貌似也没有影响。其实这个 `dll` 文件可以直接使用,我们可以在其他类中直接调用,甚至可以直接拖拽到物体上,但我们现在不打算这么做。
## 步骤三:修改文件扩展名并打包
在将已经编译过的脚本打包成资源包格式之前,需要将 `Test.dll` 改成 `Test.bytes`,否则打包时会出错。
## 步骤四:编写调用外部脚本的代码
最后,我们编写一个脚本来调用这个外部的脚本,代码如下:
using UnityEngine; using System.Collections; using System;
public class MainPrecess : MonoBehaviour { /**
- @Function:
- @Author: LiHaiyang
- @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); } } }
最后声明,此贴不求鲜花,不设隐藏,不求回复,只希望大家在发现问题时大胆指正,让我们共同进步。