众所周知,Unity可以产出兼容各个平台的游戏软件,这里咱虽然还是一个Unity入门者,可以先从底层来了解一下Unity为何能做到这种能力,这背后其实还挺有意思,因为它可能会涵盖很多计算机的基础知识。本文的一些信息主要是从Unity3D脚本编程这本书里学习来的。
在Unity初期,它只支持在Macbook上运行和生产,但是随着移动端的普及,他们的团队意识到强依赖平台的基座会阻碍他们的推广和进展,存在很多新的开发量以及很难跟随时代的变化,所以他们选择底层采用Mono去进行了一次改造,让底层依赖与具体平台的关系剥离开,更好的做到跨平台。
关于Mono
Mono这个框架本质是对CIL(通用中间语言)的实现,CIL也叫做MSIL(微软中间语言),它可以在任何支持CLI(通用语言基础结构)的环境中运行,比如.NET就是对这个标准的实现。我们说的IOS、安卓、windows、Mac OS都支持它,所以使用它也就能达到跨平台的能力了。
Mono主要由四个部分组成:
- C#编译器
- Mono运行时
- 基础类库(同.NET兼容)
- Mono类库(Mono自己拓展的一些类库)
Mono运行时
C#编译器(MCS)作用是把C#编译为ECMA CIL的字节码,之后需要Mono运行时的编译器把这个码转译为原生码(也就是操作系统直接可以读取的代码)。
Mono运行时提供三种转译方式:
- 即时编译 Just-in-time
- 提前编译 Ahead-of-time AOT
- 完全静态编译 full-ahead-of-time Full-AOT
脚本机制
很早的时候我们只能用一种编程语言去实现游戏,但是我们知道游戏是一种对性能要求很高的东西,我们用C/C++之类的语言去开发软件的性能会更高,但是如果用一些高级解释语言,因为要花费时间去翻译,所以它的性能比不上C/C++。
我们常见的语言:
- 汇编语言
- C、C++(编译型静态不安全语言)
- C#、Java(编译型静态安全语言)
- Python、Perl、JavaScript(解释型动态安全语言)
我们知道从上而下,速度肯定是越来越慢的,但是对我们来说,写高级的语言其实开发效率会高很多!
所以我们是不是有一种方法,可以结合性能和开发效率,从而做到一举两得?
于是脚本机制就诞生了~~应用的引擎由有经验的人员用C、C++开发,具体项目的功能就用高级语言去开发。Mono就提供了这种机质的实现可能性,允许开发者使用JIT编译的代码作为他们的应用拓展。而对Unity来说,它的引擎本体就是使用C、C++开发的,而我们则是通过脚本去实现我们游戏的具体功能。
Unity的脚本机质实现
我们假设我们拥有了一个用C、C++写好的Unity应用,然后我们把Mono运行时引入——把libmono和应用链接,链接的过程需要使用pkg-config工具,应用就获取了一个完全的虚拟机运行环境——一个可执行的文件。
Mono的嵌入接口会把Mono运行时暴露给Unity,这样开发者就可以去控制Mono,Mono初始化OK后,就要把CIL的代码加载进来。此时地址内容就成为:C、C++代码(非托管代码)-Mono运行时-托管代码。
比如我们新建了一个HelloWord.cs文件,我们使用Mono的C#编译器将它转换为一个DLL文件,然后我们就在Unity.cpp里通过调用Mono的运行时去加载执行这个DLL文件。
剩下的更复杂的内容>_<就等我再多熟悉和学习Unity后再补充吧~