作为一名软件架构师,我已经编写了很多系统,反向工程本机代码恶意软件,并且通常会搞清楚代码方面的事情。 但是当说起制作游戏,我还有点搞不清楚从哪里开始讲起。 我曾早期在 Windows 工作时,做了一些本机代码图形编程,但那不是什么有趣的经历。 后来,我开始专研 DirectX 开发,但我意识到,虽然它非常强大,但似乎我要做的事所需的代码非常多。
然后,有一天,我决定尝试使用 Unity,我也看到了它确实可以做一些令人惊讶的事情。 这篇文章在四部分系列当中作为首篇,内容囊括了 Unity 的基础及架构方面的知识。 我将演示如何创建 2D 和 3D 游戏,最后演示如何构建 Windows 平台。
Unity 是什么
Unity 是一个 2D/3D 引擎和框架,为您提供设计 2D、2.5D 和 3D 游戏或应用场景的系统。 我之所以说是游戏和应用程序,是因为我看到的不只有游戏,还有训练模拟器、第一响应者应用程序,以及使用 Unity 开发需要与 2D/3D 空间交互的其他以业务为核心的应用程序。 Unity 凭借的不仅有代码,还有可视化组件,让您能够与它们进行交互,并将它们导出到各个主要的移动平台,其中很多都是免费的。 (还有一个专业版非常不错,但它不是免费的。 您可以使用免费版本来实现大部分功能。)Unity 支持所有主要的 3D 应用程序和多种音频格式,它甚至了解 Photoshop 的 .PSD 格式,以便您能将 .psd 文件导入到一个 Unity 项目中。 Unity 允许您导入和组装资产,编写代码与您的对象进行交互,创建或导入动画以便在高级的动画系统中使用,等等。
Unity 已完成了用于确保跨平台支持的工作,理论上您可以通过单击来更改平台,虽说如此,但通常至少还需要做少量努力,比如为应用内购买与各商店集成。
也许 Unity 最强大的部分在于“Unity 资产商店”,它可以说是在游戏市场上最好的资产市场。 在这里,您可以满足对所有游戏组件的需求,如用于 3D 模型的艺术品、3D 模型、动画文件(参见商店内超过 10,000 个动画的 Mixamo 内容)、音频效果和全曲目、插件(包括那些可以提供多平台支持的多平台工具包)、可视化脚本系统(如 PlayMaker 和 Behave)、先进的着色器、纹理、粒子特效等等。 Unity 界面是完全脚本化的,允许很多第三方插件通过适当的集成来加入到 Unity GUI 中。 如果不是全部的话,至少也是大多数的专业游戏开发人员会使用资源商店中的大量软件包,如果您有不错的资源,也可以将它发布在那里。
人们对 Unity 的误解
我犹豫地解释,Unity 并不像人们一直质疑的那样。 然而,默认情况下 Unity 并不是一个用来设计您的 2D 资产和 3D 模型(地形除外)的系统。 您可以把一堆僵尸带入到场景中,对它们进行控制,但您不能在 Unity 的默认工具中创建僵尸。 从这个意义上来说,Unity 并不是类似于 Autodesk Maya 或 3DSMax、Blender 甚至 Adobe Photoshop 那样的资产创建型工具。 但是,至少有一个第三方建模插件 (ProBuilder) 可以让您在 Unity 的内部创建一些 3D 组件模型;有 2D 环境生成器插件(如用于创建 2D 平铺环境的 2D 地形编辑器),您还可以在 Unity 中设计地形——使用地形工具创建出有树木、草地、高山等令人叹为观止的景观。 所以,我再一次犹豫地指出 Unity 可实现事项存在的一些局限。
Microsoft 如何能融入进来? Microsoft 与 Unity 的紧密合作能够确保整个 Microsoft 堆栈可以得到平台的强大支持。 Unity 支持 Windows 的独立可执行性、Windows Phone,Windows 应用商店应用程序、Xbox 360 和 Xbox One。
开始使用
下载 Unity 的最新版本,手边准备好一个带有双按键和可单击滚轮的鼠标。 还有一个用于免费版模式或专业版模式下获得许可的单个下载。 您可访问 unity3d.com/unity/licenses 查看两种版本之间的区别。 编辑器是主要的 Unity 界面,它运行在 Windows(包括 Surface Pro)、Linux 和 OS X 上。
我将在接下来的文章中使用 Unity 进入真正的游戏开发,但是,首先,我将探索 Unity 界面、项目结构和体系结构。
体系结构和编译
Unity 是一个基于 C++ 的本机游戏引擎。 使用 C#、JavaScript (UnityScript) 或较少使用的 Boo 编写代码。 您的代码,而不是 Unity 引擎代码,运行在 Mono 上或 Microsoft.NET Framework 上,这是实时 (JIT) 编译的(iOS 除外,因为它不允许使用 JIT 代码,并且它是由 Mono 使用预先 [AOT] 编译将其编译到本地代码)。
Unity 让您能够在 IDE 中测试游戏,而无需执行任何种类的导出或生成。 当您在 Unity 中运行代码时,您使用的是 Mono 的 3.5 版本,它的 API 兼容性基本上与 .NET Framework 3.5/CLR 2.0 的 API 相当。
在项目视图中双击代码文件,可以打开默认的跨平台编辑器 MonoDevelop,这样就可以在 Unity 中编辑您的代码了。 如果您愿意,您可以配置 Visual Studio 作为您的编辑器。
使用 MonoDevelop 进行调试,或使用 Visual Studio、UnityVS 的第三方插件。 在没有 UnityVS 的情况下,您不能将 Visual Studio 用作调试器,因为当您调试游戏时,您不是在调试 Unity.exe,而是通过使用一个作为发出命令并执行相关操作的软件调试器在调试 Unity 内部的虚拟环境。
若要进行调试,就需要从 Unity 启动 MonoDevelop。 MonoDevelop 有一个插件,您在 MonoDevelop 中调试 | 附加到进程之后,这个插件可以打开返回到 Unity 调试器的连接,并向其发出命令。 UnityVS 使您能够将 Visual Studio 调试器连接回 Unity。
当您第一次打开 Unity 时,您会看到对话框!
在项目对话框中,您为您的项目 (1) 指定了名称和位置。 您可以将任何程序包导入到您的项目 (2) 中,但此处您不必核对所有事项;列表仅为方便使用而提供。 您也可以稍后导入一个程序包。 程序包是一个包含预先打包的资源(模型、代码、场景、插件,可在 Unity 中打包的一切)的 .unitypackage 文件,且您可以重复使用或轻松地分发它们。
但如果您不知道它是什么,就不要在此处进行核对;您的项目规模逐渐变大,有时会显著增长。 最终,您可以选择 2D 或 3D (3)。 这个下拉列表是 Unity 中的新增项,它之前并没有强大的 2D 游戏工具,直到最近才刚刚出现。 当设置为 3D 时,默认首选 3D 项目,一直以来它都作为 Unity 的经典行为,所以它并不需要任何特别提及。 当选择 2D 时,Unity 改变了一些看似小,而实则很重要的东西,我将在本系列的后续 2D 文章中对此进行介绍。
此列表的填充内容来自您系统上的特定位置的 .unitypackage 文件;Unity 提供了有关安装的一些内容。 您从 Unity 资产商店下载的所有内容也作为 .unitypackage 文件而出现,本地缓存在您的系统的 C:\Users\<you>\AppData\Roaming\Unity\Asset Store 中。 因此,当它存在于您的系统上时,它就会显示在这个列表中。 您可以简单地双击一个 .unitypackage 文件,该文件就会导入到您的项目中。
通过继续使用 Unity 界面,我会从单击图 2 中的对话框中的“创建”开始,以便创建一个新的项目。 默认的 Unity 窗口布局。
在此,您可以看到:
项目:您项目中的所有文件。 您可以通过从资源管理器拖放到 Unity 中,将文件添加到您的项目中。
场景:当前打开的场景。
层次结构:场景中的所有游戏对象。 注意,使用术语 GameObjects 和 GameObjects 下拉菜单。
检查器:场景中选定对象的组件(属性)。
工具栏:最左边是平移、移动、旋转、缩放,中央是播放、暂停、前进帧。 单击“播放”可立即播放游戏,而不必执行单独的生成。 “暂停”可暂停游戏,“前进帧”运行一次前进一帧,为您提供非常紧凑的调试控制。
控制台:此窗口可以隐藏,但它显示的输出来自您的编译、错误、警告等。 它还显示来自代码的调试信息;例如,Debug.Log 会在此处显示它的输出。
值得一提的是,“游戏”选项卡紧挨着“场景”选项卡。 当您单击“播放”时,此选项卡激活,您的游戏开始在这个窗口中运行。 这就是所谓的播放模式,它为您提供一个用来测试游戏的场地,甚至可以让您切换回“场景”选项卡进行实时修改游戏。 但此处要非常小心。 当播放按钮高亮显示时,您处在播放模式下,当您离开它时,您在播放模式下所做的任何更改都将丢失。 我,以及我曾交谈过的几乎所有的 Unity 开发人员,都曾因为这种方式而丢失了工作,所以我在播放模式下,通过编辑 | 首选项 | 颜色 | 播放模式色彩更改了我的编辑器颜色,使它更加明显。