一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法
技术领域
本发明涉及计算机技术领域,尤其涉及一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法。
背景技术
现有的三维渲染引擎Unity 3D是3D开发工具和渲染引擎,通过C#编写代码,然后编译执行,但是其不足之处是不能运行时修改代码,不利于项目现场错误的调试,也不利于动态更新代码,从而不利于项目的开发和交付。
现有方案中有通过在Unity 3D中嵌入Lua脚本来解决项目现场修改代码的不足,但是该方法又存在无法调试、无法运行时调整代码的技术缺陷。
发明内容
本发明之目的是提供一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法,其能够解决现有目前Unity 3D不能运行时修改代码,不利于项目现场错误的调试,也不利于动态更新代码的问题。
本发明提供一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法,包括如下步骤:
编译Node.js为动态链接库Node.dll,并进行代码调整;
Unity3D代码加载Node.dll;
Unity3D中的类对应的JavaScript类导出到Node.js;
JavaScript和Unity3D之间进行数据传递。
优选地,所述编译Node.js为动态链接库Node.dll,并进行代码调整包括:
下载Node.js源码,将原本编译成Node.exe的配置修改编译成动态链接库Node.dll;
修改Node.js C++代码中的异常处理;
修改定时器;
修改数据输入输出流,使数据输入输出流重定向到文件中。
优选地,所述编译Node.js为动态链接库Node.dll,并进行代码调整还包括:
将Node.js执行流程拆分成InitializeNode模块、ShutdownNode模块、CreateIsolate模块、RunIsolate模块、DisposeIsolate模块,所述InitializeNode模块、ShutdownNode模块、CreateIsolate模块、RunIsolate模块、DisposeIsolate模块均以接口的形式暴露出去供Unity3D调用;其中,
所述InitializeNode模块用于初始化Node.js系统,只在启动系统时调用一次;
所述ShutdownNode模块用于停止Node.js系统,并销毁资源,只在系统退出的时候调用一次;
所述CreateIsolate模块用于创建JavaScript运行环境,并将各种函数和类暴露给JavaScript;
所述RunIsolate模块用于执行JavaScript中的代码;
所述DisposeIsolate模块用于释放JavaScript运行环境,并释放资源。
优选地,所述编译Node.js为动态链接库Node.dll,并进行代码调整还包括:
将Node.js执行流程还拆分有SetNodeCallback模块和OnCSharpException模块;其中,
所述SetNodeCallback模块用于将Unity3D函数暴露给JavaScript;
所述OnCSharpException模块用于在Unity3D中代码遇到错误时通知到JavaScript。
优选地,所述Unity3D代码加载Node.dll包括:
Unity3D通过Windows API接口加载Node.dll动态链接库;
加载Node.dll动态链接库后,将Node.js暴露的接口映射到Unity3D中,使Unity3D系统直接调用Node.js的接口,并且将Unity3D中的C#接口通过Node.js暴露给JavaScript;
Unity3D调用所述InitializeNode模块初始化Node.js系统,并通过所述CreateIsolate模块创建运行环境,然后Unity3D系统监听OnUpdate事件,调用OnUpdate模块,此时OnUpdate模块调用RunIsolate模块来执行JavaScript;
JavaScript代码正常运行。
优选地,所述Unity3D中的类对应的JavaScript类导出到Node.js包括:
导出Unity3D中的类对应的JavaScript类到wrapper.js,并生成wrapper.d.ts。
优选地,所述Unity3D中的类对应的JavaScript类导出到Node.js还包括:
将Unity3D中的类和wrapper.js中的JavaScript类建立映射。
优选地,还包括如下步骤:
制作用于辅助Visual Studio Code调试JavaScript的工具Debugger,通过配置Visual Studio Code使得在启动Visual Studio Code调试的时候,Unity3D自动启动,停止Visual Studio Code调试的时候,Unity3D自动停止。
优选地,所述JavaScript和Unity3D之间进行数据传递包括:
建立共享内存,Node.js中JavaScript和Unity3D中C#能同时访问,传递数据时,一端先将数据放入共享内存,然后通知另一端,另一端收到通知后,拿取数据,并进行处理。
优选地,所述Windows API接口包括LoadLibrary接口、GetProcAddress接口、FreeLibrary接口与SetDllDirectory接口。
本发明提供的一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法,相比于现有技术具有如下有益效果:
1、本发明中Unity3D以插件的形式将Node.js嵌入到系统中,并通过反射(C#语言的机制)将Unity3D的各种内部类暴露给JavaScript,通过编写JavaScript代码,实现Unity3D中使用JavaScript脚本进行的目的。
2、本发明通过建立JavaScript和Unity3D共享内存,可以将数据存放在共享内存中,在需要传递数据时通知对方,对方收到通知直接拿取数据进行处理,这样可以避免进行数据拷贝,由此大大提高了数据传输的效率。
3、本发明中通过编译Node.js为动态库Node.dll,并进行代码调整,编译后的Node.js作为中间桥梁,连通了JavaScript和Unity3D中C#的通信,使得JavaScript和Unity3D能够相互调用。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅用于解释本发明的构思。
图1为本发明的一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法的流程示意图。
具体实施方式
在下文中,将结合附图描述本发明的一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法的实施例。
在此记载的实施例为本发明的特定的具体实施方式,用于说明本发明的构思,均是解释性和示例性的,不应解释为对本发明实施方式及本发明范围的限制。除在此记载的实施例外,本领域技术人员还能够基于本申请权利要求书和说明书所公开的内容采用显而易见的其它技术方案,这些技术方案包括对在此记载的实施例做出任何显而易见的替换和修改的技术方案。
如图1所示,本发明提供了一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法,包括如下步骤:
编译Node.js为动态链接库Node.dll,并进行代码调整;
Unity3D代码加载Node.dll;
Unity3D中的类对应的JavaScript类导出到Node.js;
JavaScript和Unity3D之间进行数据传递。
由于Node.js是为服务器端设计的,个别细节不适合应用程序嵌入,所以进行调整以适用于应用程序。
本发明提供的一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法还包括如下步骤:
制作用于辅助Visual Studio Code调试JavaScript的工具Debugger,通过配置Visual Studio Code使得在启动Visual Studio Code调试的时候,Unity3D自动启动,停止Visual Studio Code调试的时候,Unity3D自动停止。
本发明可以通过调试工具Visual Studio Code远程控制Unity3D编辑器的运行和停止,这样便于软件开发,可以使得在系统运行时修改代码,从而有利于项目现场错误的调试,也利于动态更新代码,可以根据实际需求进行代码的调整,便于项目的交付与完成。
具体还可以根据实际需求通过Chrome的Devtools进行项目的调试。
在本发明的进一步实施例中,步骤编译Node.js为动态链接库Node.dll,并进行代码调整包括:
下载Node.js源码,将原本编译成Node.exe的配置修改编译成动态链接库Node.dll,该动态链接库Node.dll其他程序可以引用;
修改Node.js C++代码中的异常处理,使Node.dll中JavaScript执行过程中,遇到错误,能够继续执行,并打印错误日志,以供查阅;
修改定时器(setInterval和setTimeout),使JavaScript代码遇到错误的时候,能够继续执行,并打印错误日志,以供查阅;
修改数据输入输出流,使数据输入输出流重定向到文件中。
优选地,步骤编译Node.js为动态链接库Node.dll,并进行代码调整还包括:
将Node.js执行流程拆分成InitializeNode模块、ShutdownNode模块、CreateIsolate模块、RunIsolate模块、DisposeIsolate模块,InitializeNode模块、ShutdownNode模块、CreateIsolate模块、RunIsolate模块、DisposeIsolate模块均以接口的形式暴露出去供Unity3D调用;其中,
InitializeNode模块用于初始化Node.js系统,只在启动系统时调用一次;
ShutdownNode模块用于停止Node.js系统,并销毁资源,只在系统退出的时候调用一次;
CreateIsolate模块用于创建JavaScript运行环境,并将各种函数和类暴露给JavaScript;
RunIsolate模块用于执行JavaScript中的代码;
DisposeIsolate模块用于释放JavaScript运行环境,并释放资源。
优选地,步骤编译Node.js为动态链接库Node.dll,并进行代码调整还包括:
将Node.js执行流程还拆分有SetNodeCallback模块和OnCSharpException模块;其中,
SetNodeCallback模块用于将Unity3D函数暴露给JavaScript;
OnCSharpException模块用于在Unity3D中代码遇到错误时通知到JavaScript。
在本发明的进一步实施例中,步骤Unity3D代码加载Node.dll包括:
Unity3D通过Windows API接口加载Node.dll动态链接库;
加载Node.dll动态链接库后,将Node.js暴露的接口映射到Unity3D中,使Unity3D系统直接调用Node.js的接口,并且将Unity3D中的C#接口通过Node.js暴露给JavaScript,此时,Node.js作为一个中间桥梁,连通了JavaScript和Unity3D中C#的通信,使得JavaScript和Unity3D能够相互调用;
Unity3D调用InitializeNode模块初始化Node.js系统,并通过CreateIsolate模块创建运行环境,然后Unity3D系统监听OnUpdate事件,调用OnUpdate模块,此时OnUpdate模块调用RunIsolate模块来执行JavaScript;
JavaScript代码正常运行。
在本发明的进一步实施例中,步骤Unity3D中的类对应的JavaScript类导出到Node.js包括:
导出Unity3D中的类对应的JavaScript类到wrapper.js,建立映射关系,使运行时能够快速地调取C#函数,并生成wrapper.d.ts,使通过Visual Studio Code开发时,能够有代码提示。其中,在系统开发期间,可以通过手动方式导出Unity3D中的类对应的JavaScript类到wrapper.js。
优选地,步骤Unity3D中的类对应的JavaScript类导出到Node.js还包括:在运行期间,将Unity3D中的类和wrapper.js中的JavaScript类建立映射,这样JavaScript代码能够调用Unity3D中的类,来实现对Unity3D资源的操作,通过编写JavaScript代码,就能实现项目的逻辑编辑。
本发明中导出Unity3D中的类为JavaScript文件,目的是使JavaScript端能够访问Unity3D,并在编写代码的时候,有代码提示。
在本发明的进一步实施例中,JavaScript和Unity3D之间进行数据传递包括:
由于JavaScript和Unity3D中有时需要传递大量的数据,可以建立共享内存,Node.js中JavaScript和Unity3D中C#能同时访问,传递数据时,一端先将数据放入共享内存,然后通知另一端,另一端收到通知后,拿取数据,并进行处理,这样没有了数据的拷贝过程,大大提高了数据传输的效率。
以上对本发明的一种三维渲染引擎结合JavaScript脚本引擎实现运行的方法进行了说明。而且,上述披露的各技术特征并不限于已披露的与其它特征的组合,本领域技术人员还可根据本发明之目的进行各技术特征之间的其它组合,以实现本发明之目的为准。