广州unity3d培训
达内广州CBD中心

18087159764

热门课程

Unity到底是怎样实现跨平台的?

  • 时间:2015-11-05
  • 发布:广州达内
  • 来源:达内科技

Unity3d可以算得上是最流行的游戏开发引擎了,由于其功能很强大,也适用于很多的平台。那么,Unity3d是怎样实现跨平台的呢?

关于图形

Unity支持的图形API有OpenGL、OpenGL ES、WebGL、Metal以及DirectX,每个API都对应不同的平台。

  • OpenGL应用很广泛,一些iOS设备、Mac OS X和Linux,甚至Windows都用到了OpenGL。
  • OpenGL ES兼容手机设置,支持大多数android和部分iOS设备。
  • WebGL是一个新平台,基于浏览器图形运行应用和游戏,无需再安装Flash或Unity WebPlayer这样的插件。
  • Metal是苹果新出的图形API,兼容大多数近期的iOS设备及Californian公司的电脑。
  • DirectX是微软自制的图形API解决方案,兼容Windows、Windows Phone以及Xbox。


虽然UT的开发者在图形处理上也废了不少功夫,但大多时间都花在将这些工具集成到引擎中,而非自己写一套图形API。

关于物理

说到物理就比图形单纯多了,Unity至始至终都坚守一个工具:英伟达的PhysX,它支持Unity要导出的所有各个平台。这么说吧,它是市场上最好的物理引擎之一,并且从其第一代叫做Novodex还不属于英伟达的时候开始,就备受信任且性能表现极好。主要是因为一个引擎就搞定所有平台的物理也很方便,而游戏在所支持设备中的碰撞和移动表现行为都是一致的,这样才不会因设备导致游戏失衡。

关于光照

嗯,Unity的光照也是依赖外部工具实现的,包括烘焙和实时光照。unity5之前使用Autodesk的Beast作为烘焙光照的工具。Unity5.x用的是Geomeric的Enlighten实现烘焙和实时光照。

关于网络

UT在2014年发布了其自制的网络和多玩家解决方案UNET。之前有一些常用的网络解决方案,最出名的就是Photon。而UNET包含两个部分:网络API(高层及底层API)和付费的多玩家服务。由于这是内部项目,所以UT必须将代码移植到所有支持的平台,而各平台的图形、物理和光照均有区别。

关于脚本

脚本可能是大家最关心的部分,因为使用引擎的目的就是不用自己操心图形或物理底层。Unity支持使用C#和UnityScript编写脚本,且不需任何转换工具就能将游戏导出到上述提过的任意平台。

很长一段时间我都在纠结,Unity是怎么做到这点的?

终于有一天,我顿悟了,之所以纠结这么久是因为一开始方向就错了。实际上做到这点的是Mono而并非Unity。那么Mono是什么呢?官网介绍,Mono是一个“跨平台开源的.NET开发框架”。这么说还是很含糊,那就先扒一下Mono的历史(我们是一个严肃的技术社区)。

微软在2000年发布了作为“基于网络标准的新平台”的.NET框架之后,有个叫Miguel的牛人开发了.NET的表妹Xamarin。为什么是妹妹呢,因为它跟.NET很像。为什么是表妹呢,因为Xamarin是基于Linux开发的。他之所以决定搞一个表妹出来,是因为微软的.NET不支持Linux或其它非微软的平台。

2001年的时候Mono开源了,其中包括它自带的C#编译器和CLR(公共语言运行库),这位大神将.NET框架带到了其它平台。一开始呢,Mono的功能当然是远远落后于.NET的,但经过这么多年的成长,它已经完全可以媲美.NET甚至有些地方还反超了.NET。总之就是,Mono是一个C++编写的开源.NET开发框架,可以在全平台运行。

到这里Mono的历史就扒完了,理一理思绪回到Unity。上面说过了,可以使用C#或UnityScript在Unity中编写脚本。那么问题来了:Android需要Java,iOS需要Object-C,那用C#编写的Unity游戏要怎么运行到那么多平台呢?Unity编译器编译到每个平台都是使用原生代码吗?

先说第二个问题,肯定不是啊,都用原生代码编译那Unity会疯掉的。再说第一个问题,Android不仅可以用Java开发,也可用原生代码(C/C++)来开发呀。这就是Mono所做的事情。

好乱好乱,再理一理。现在要在Android设备上运行一个C#写的游戏,但是没有C#的运行环境啊,怎么办?没关系,Mono来运行。可是Android设备上没有安装Mono啊。额,其实Unity帮你把Mono的运行时环境打包进去了(当然你得是用Mono开发的)。

看看Xamarin的使用说明:

用C#编写应用,直接从C#调用任意原生平台的API。Xamarin编译器会捆绑.NET运行库并输出原生的ARM可执行文件,打包成iOS或Android应用。

那Mono开发的应用是绑定了整个框架吗?当然不是,框架中不使用的类在链接时就被剔除了。只有用到的部分会被打包进最后的应用。

到此Unity跨平台的原理差不多就讲完了,Mono才是大功臣。顺便提一下,Unity本来推出了IL2CPP替换Mono作为脚本后端的,但因为其Bug太多以及导出的C++文件太大一直被开发者诟病,相信短时间内IL2CPP想完全取代Mono也不是容易的事。

上一篇:总结u3d中的iTween插件的用法
下一篇:程序员的日常生活是什么样的

如何做一个合格的产品经理?

北航应届生放弃出国留学,参加达内Unity3D培训获15k高薪

北航应届生放弃出国留学,参加达内Unity3D培训获15k高薪

达内CEO韩少云先生做客《前沿讲座》讲述创业经历

选择城市和中心
贵州省

广西省

海南省