C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法。
这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们就利用C#编译器来对我们的脚本进行验证。
同时StreamingAssets中的文件又是直接随项目发布的,所以可以直接以文件方式取出这些脚本文件编译执行。
这是一个很巧妙的方式,但是用在实际项目中会有一些问题:
一、可能会让程序员产生混淆,哪里是脚本,哪里是程序,傻傻分不清楚
二、主程序里会有一份用不到的代码
三、直接编译脚本文件略慢,在手机上比较明显,尤其脚本文件多的时候。
面对这三个问题,我们一次就可以全解决
我们的模式如下
1.首先建立一个独立的C#项目,里面只放脚本代码。
2.然后当编译这个项目的时候,会预编译脚本代码,并保存成一个二进制文件。
3.然后在主程序里直接加载这个二进制文件初始化脚本,继续后面的事情。
GitHub(https://github.com/lightszero/CSLightStudio)上新的例子CSLightStudio\unity\FrameworkMaster 就是这个框架
由于比较抽象,让我们来介绍一下
Bin目录是生成的最后效果,有两个主程序,两个脚本二进制文件。
unity目录里面是主程序,两个场景分别导出了mode1 和 mode2
Mode1Script 和 Mode2Script是两个脚本文件项目,他们是两个ConsoleExe,从VS里面编译执行就会把自己项目里的所有文件作为C#Light编译
并且输出到../bin/也就bin下面的那个 .csledll.bytes 文件
这样就完成了脚本文件和Unity主项目的分开编译,如果脚本有错误,这个控制台里会给出信息。
脚本编译:通过VS 建立脚本项目并编译验证脚本且生成二进制文件。
程序编译:通过Unity编译输出。
这样
1.脚本和程序就完全隔离到了不同的项目里,脚本程序员写脚本,主程序的程序员写主程序,各司其职。
2.另外脚本程序也不会出现在主程序中
3.而且保存的二进制文件是词法处理后的结果,在手机上闪电加载。
也许聪明的你现在已经发现了一个问题,主程序里面要对脚本调用的类型进行注册,还有很多是自己编写的类,脚本如果没有这些信息是没法进行编译验证的。
对,这个就要利用Unity的另一个特性,Unity的项目代码用VS或者monodevelop编译的话,会生成一个dll的,虽然unity不用他
我们只要让脚本项目引用这个DLL,并用和主程序一样的方式初始化脚本引擎,就能得到和主程序一模一样的脚本编译环境进行处理。