不少Unity的开发者是否是都会以为Unity能把项目导出发布到那么多不一样的平台上运行是件很牛X的事情?那么你有没有想过Unity是如何作到的呢?本文就来大致的聊一聊Unity作的这件神奇的事情。web
首先来看下Unity支持的平台列表:浏览器
依次是iOS, Android, Windows Phone, Tizen, Windows, Windows Store Apps, Mac, Linux/Steam OS, WebGL, PlayStation4, PlayStation Vita, Xbox One, Xbox 360, WiiU, Nintendo 3DS, Oculus Rift, Google Cardboard, Steam VR, PlayStation VR, Gear VR, Microsoft Hololens, Android TV, Samsung SMART TV, tvOS.网络
实在是太多了。那么Unity的技术人员是否是真的一个个平台去适配呢?答案是否认的,尽管Unity的技术人员为跨平台作了大量的工做,可是Unity仍旧须要依赖几家合做公司来帮助他们在不一样的平台上实现一些功能。每当有一个新的平台发布时,Unity的技术人员首先就会检测Unity的每个功能,看看是否是有功能已经被他的合做方在新平台上实现了,若是有的话,那么Unity对该新平台的支持所花费的时间就会大大减小。如今来看看Unity的一些主要功能:架构
Unity支持的图形API有:OpenGL, OpenGL ES, WebGL, Metal和DirectX,每一个API都针对不一样的平台。OpenGL被使用的最为普遍,从MacOS X到iOS设备、再到Linux甚至Windows平台,均可以使用OpenGL。OpenGL ES是与移动设备兼容的图形API,应用在绝大部分Android设备和一些iOS设备上。WebGL是应用在基于浏览器的游戏和应用上的,有了WebGL,就再也不须要在浏览器上安装如Flash和Unity web player这样的插件了。Metal是苹果公司新的图形API,与绝大部分最近发售的iOS设备兼容。最后,DirectX是微软公司的图形API,能够在Windows, Windows Phone和Xbox上使用。因此,尽管Unity的技术人员花费了大量时间在图形功能上,但其实绝大部分时间都是在将这些图形API整合到Unity中,而不是从头开始写Unity本身的图形API。app
在物理方面。Unity只使用一个工具,那就是Nvidia的PhysX,它支持Unity发布的全部平台。Unity在全部平台上都使用同一个物理引擎的缘由是为了保证全部的碰撞、移动以及其余物理效果在各个平台上都保持一致。框架
在光照烘焙以及实时光照方面,Unity一样依赖第三方工具。在Unity5.x版本以前,使用Autodesk的Beast来烘焙光照效果,从Unity5.x版本开始,使用Geomeric的Enlighten工具来烘焙光照以及计算实时GI。工具
2014年,Unity发布了Unity Networking,这是Unity本身研发的网络和多人在线解决方案。Unity Networking由两部分组成:网络API(包括高级API与底层API),以及付费的多人在线服务。因为这是Unity本身的内部项目,所以Unity的技术人员就须要把代码兼容到全部平台上。spa
Unity支持使用C#和UnityScript来编写脚本代码,那么它是如何让脚本代码在不一样平台上运行的呢?答案就是幕后的功臣:Mono。什么是Mono呢?Mono是一个跨平台的、开源的.NET开发框架。咱们来看看Mono的历史。微软在2000年发布了.NET框架,称其为“基于互联网标准的新的平台”。来自Xamarin公司的Miguel de Icaza很是热爱.NET,他想用.NET在Linux下进行开发,惋惜的是.NET并不支持除Windows之外的平台,因而他就决定本身开发一个环境,而后在2001年,Mono开源项目成立了。因此本质上来讲,Mono是一个为了将.NET框架应用在其余平台上的开源项目,它有本身的C#编译器和CLR(Common Language Runtime)。今天来看Mono,它不单已经实现了绝大部分.NET工具,并且还有一些扩展工具。总结一下,Mono是一个开源的、用C/C++实现.NET开发框架,使得.NET能够在其余平台使用的项目。Mono完整支持的系统和架构可参考:http://www.mono-project.com/docs/about-mono/supported-platforms/插件
如今回到Unity上,咱们已经知道Unity支持使用C#和UnityScript来编写脚本代码,假设咱们使用C#来编写脚本代码,那么在使用Java的Android平台或使用object-C的iOS平台上Unity是如何运行咱们的项目的呢?Unity难道会把代码编译成每一个平台使用的原生代码嘛?答案是否认的,Unity才不会那么蠢,把代码编译成每一个平台使用的原生代码。那么在使用Java的Android平台如何运行咱们的项目呢?你可能还不知道,你能够在Android上使用C/C++来进行开发,但咱们不会这么作,由于Java要方便的多,可是Mono会这么作。是的,Mono负责在各个平台上运行咱们的项目。可是你可能想问,我没有在运行设备上安装过Mono啊?!没错,由于每一个用Unity发布的项目(以及每一个用Mono开发的项目)都搭载了Mono运行环境,Xamarin在解释Mono的运行机制时是这样说的:3d
既然Unity发布的项目会搭载Mono运行环境,那是否是整个.NET框架都会被包含进去呢?其实并非,没有使用的类在连接时会被剔除,因此只有你用到的类会被打包到你的项目中。ps: Unity已经开始用IL2CPP技术,详情可见:http://blogs.unity3d.com/2014/05/20/the-future-of-scripting-in-unity/
以上就是和你们分享的内容,但愿对你有所帮助。Happy Coding, Happy Life!