很多Unity的开发者是不是都会觉得Unity能把项目导出发布到那么多不同的平台上运行是件很牛X的事情?那么你有没有想过Unity是如何做到的呢?本文就来大体的聊一聊Unity做的这件神奇的事情。

概览

首先来看下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。

物理

在物理方面。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的技术人员就需要把代码兼容到所有平台上。

脚本

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的运行机制时是这样说的:

既然Unity发布的项目会搭载Mono运行环境,那是不是整个.NET框架都会被包含进去呢?其实并不是,没有使用的类在链接时会被剔除,所以只有你用到的类会被打包到你的项目中。ps: Unity已经开始用IL2CPP技术,详情可见:http://blogs.unity3d.com/2014/05/20/the-future-of-scripting-in-unity/

以上就是和大家分享的内容,希望对你有所帮助。Happy Coding, Happy Life!

学习笔记 - Unity是如何将你的项目发布到如此多的平台的?的更多相关文章

  1. 学习笔记:APP切图那点事儿–详细介绍android和ios平台

    学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址 ...

  2. DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)

    一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...

  3. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...

  4. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  5. redhat7学习笔记之从零到部署javaweb项目

    REDHAT7学习笔记 1. 安装vmware10 安装过程略,下载地址:链接: https://pan.baidu.com/s/16odKKkRYBxGWDVo1cz_wxA 注意,10以上版本不在 ...

  6. [原创]java WEB学习笔记03:使用eclipes开发javaWEB项目

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. Django学习笔记(一)——安装,创建项目,配置

    疯狂的暑假学习之 Django学习笔记(一) 教材  书<The Django Book> 视频:csvt Django视频 1.创建项目 django‐admin.py startpro ...

  8. Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)

    上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...

  9. JavaWeb和WebGIS学习笔记(六)——使用ArcGIS for Server发布地图服务

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

随机推荐

  1. (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)

    http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不 ...

  2. TCP长连接与短连接的区别(转)

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...

  3. Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上

    procedure Tfrm_InstrumentControl.aa;var CurLength: Word; vTimeLength: Word;begin Screen.Cursor := cr ...

  4. JAVA常见算法题(二十六)

    package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...

  5. (转)MFC的GUI窗口使用Console输出函数printf

    原文链接 在GUI程序中使用printf函数: #include <io.h> #include <fcntl.h> void InitConsole() { ; FILE* ...

  6. More is better——并查集求最大集合(王道)

    Description Mr Wang wants some boys to help him with a project. Because the project is rather comple ...

  7. Java LinkedList的模拟实现

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.查询即从第一个节点,不断指 ...

  8. JAVA加解密 -- 消息摘要算法

    消息摘要算法是一种单向加密算法 主要用于验证数据完整性,也是数字签名的核心算法 消息鉴别:指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行对比 a.MD家族 – MD5(128位摘要信息) M ...

  9. Python——Code Like a Pythonista: Idiomatic Python

    Code Like a Pythonista: Idiomatic Python 如果你有C++基础,那学习另一门语言会相对容易.因为C++即面向过程,又面向对象.它很底层,能像C一样访问机器:它也很 ...

  10. axios 取消请求

    解决思路 在发送第二次请求的时候如果第一次请求还未返回,则取消第一次请求,以保证后发送的请求返回的数据不会被先发送的请求覆盖. axios官方文档取消请求说明 方法一: const CancelTok ...