您当前的位置:首页 VR开发 Unity 正文

Unity教程:如何实现跨平台运作的?

查看: 3006| 评论: 0 2016-10-25 02:43 PM| 发布者: PeckBang |原作者: Matheus Amazonas

如果你是开发者,并且对托管代码和原生代码、执行环境和不同平台这些概念非常熟悉,那本文就是为你准备的。而如果你不熟,既然来都来了,就看完再走吧。

  3D几乎是市场上最流行的游戏开发引擎了,由Unity Technology(以下简称UT)公司开发,它可用于Windows和Mac OS X系统(Linux系统实验版已发布)。最重要的是,它几乎可以导出到任意平台。

  放张图感受一下:

  

  关于图形

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

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


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

  

  关于物理

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

  

  关于光照

  嗯,Unity的光照也是依赖外部工具实现的,包括烘焙和实时光照。之前使用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也不是容易的事。
52VR.COM微信扫一扫
52vr公众号
专注于VR的学习、开发和人才交流

52VR开发交流

相关推荐

已有 0 人参与

发表评论

您需要登录才可以回帖 登录 | 立即注册

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-22 03:55 AM

返回顶部