Unity动态运行外部代码(实现代码更新)
2014-03-05 18:18
615 查看
在论坛中经常看到有人问及有关代码更新的问题,近来无事,特研究了下,现与大家分享,如有不正确之处,还请大家多多指正.
在此之前,我们应该明确一点,资源包可以包含一个被制成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"); }
}
因为引用了UnityEngine,所以我们要把这个引用添加上,在vs里右击项目面板中的引用,添加引用,选择浏览,找到UnityEngine.dll
这个文件(我的路径是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
iHaiyang
* @Date: */
IEnumerator Start ()
{ string url = "file:///"+Application.dataPath+"/Plugins/Test.unity3d";//这个可以是网络地址,Test.unity3d是我们打包后的文件
WWW www = new WWW(url); yield return www;
[align=left] if(www.error!=null)[/align]
[align=left] {[/align]
[align=left]print(www.error);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
AssetBundle bundle = www.assetBundle;
[align=left] TextAsset txt = bundle.Load("Test") as TextAsset;[/align]
[align=left] //使用反射类载入[/align]
[align=left] System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(txt.bytes);[/align]
[align=left] Type type = assembly.GetType("Test");[/align]
[align=left][/align]
[align=left] GameObject obj = new GameObject();[/align]
[align=left] obj.AddComponent(type);[/align]
[align=left] }[/align]
[align=left]}[/align]
在此之前,我们应该明确一点,资源包可以包含一个被制成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"); }
}
因为引用了UnityEngine,所以我们要把这个引用添加上,在vs里右击项目面板中的引用,添加引用,选择浏览,找到UnityEngine.dll
这个文件(我的路径是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
iHaiyang
* @Date: */
IEnumerator Start ()
{ string url = "file:///"+Application.dataPath+"/Plugins/Test.unity3d";//这个可以是网络地址,Test.unity3d是我们打包后的文件
WWW www = new WWW(url); yield return www;
[align=left] if(www.error!=null)[/align]
[align=left] {[/align]
[align=left]print(www.error);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
AssetBundle bundle = www.assetBundle;
[align=left] TextAsset txt = bundle.Load("Test") as TextAsset;[/align]
[align=left] //使用反射类载入[/align]
[align=left] System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(txt.bytes);[/align]
[align=left] Type type = assembly.GetType("Test");[/align]
[align=left][/align]
[align=left] GameObject obj = new GameObject();[/align]
[align=left] obj.AddComponent(type);[/align]
[align=left] }[/align]
[align=left]}[/align]
相关文章推荐
- PHPstorm实现PHP代码直接运行,并动态更新服务器代码
- PHPstorm实现PHP代码直接运行,并动态更新服务器代码
- 测试代码,解决java gui swing多线程界面假死、僵死问题,实现界面动态刷新,动态同步更新数据
- 在android中利用多线程实现对控件的更新(动态修改文本框中的值)。简述原理并上传代码。
- Unity5.x运行时动态更新烘培贴图
- 自定义Mono,实现Unity Android平台代码更新
- 动态载入/删除/更新外部 JavaScript/Css 文件的代码
- 动态载入/删除/更新外部 JavaScript/Css 文件的代码
- 在android中利用多线程实现对控件的更新(动态修改文本框中的值)。简述原理并上传代码。 .
- 安卓间隔一定时间之后动态更新视图【代码实现】
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码
- 基于Jqurey的下拉框改变动态添加和删除表格实现代码
- js实现div拖动动画运行轨迹效果代码分享
- windows下用php实现svn代码更新
- Ios热更新,实时代码更新,动态更新,动态库framework
- 矩阵相乘strassen-c++代码实现及运行实例结果
- C# 动态获取、修改、更新配置文件 实现思路
- 复数四则运算-c++代码实现及运行实例结果
- 复数乘法运算(三次实数乘法)-c++代码实现及运行实例结果
- 雇佣问题(hireassistant)-c++代码实现及运行实例结果