IOS-AR-游戏开发入门手册-全-

news/2024/11/16 3:50:48/文章来源:https://www.cnblogs.com/apachecn/p/18352669

IOS AR 游戏开发入门手册(全)

原文:Beginning iOS AR Game Development

协议:CC BY-NC-SA 4.0

一、介绍

在本书中,我们将学习如何使用 Unity (Unity3D 2018,或者更常见的是 Unity)的游戏开发软件来创建一个增强现实(或 AR)游戏。在这一章中,我们将介绍 Unity 的下载和安装过程,并了解 Unity 提供的一些工具。我们还将从 Unity 资产商店安装一个现有的 AR 项目,并探索这个游戏的一些功能。在第二章中,我们将安装 ARKit 并概述 Unity 用户界面。在第三章中,我们将开始使用 Unity ARKit 并使用一些关键功能。我还将提供视觉惯性里程计的基本概述,以及这对创建 AR 项目意味着什么。我们将制作一个基本场景来使用和测试 Unity ARKit。在第四章中,我们将使用 Unity ARKit 中一些更高级的功能,比如点击测试和 AR 场景照明。最后,在第五章,我们将把这些放在一起,用 Unity ARKit 制作一个 AR 游戏。

这本书是为没有使用 Unity 或制作游戏经验的初学者而写的。这些章节是按顺序编写的,有助于学习每一步。然而,如果你正在读这本书,并且已经知道了 Unity 或者制作游戏,那么请随意跳过你认为已经知道的章节。

Unity3D

Unity 游戏引擎是一个跨平台的游戏开发工具,用于创建 2D 和 3D 游戏。跨平台这个术语对不同的人有不同的含义。由于 Unity 可以在 macOS、Windows 或 Linux 上使用,这可以被认为是一个跨平台的开发工具。然而,由于 Unity 可用于为游戏控制台、个人电脑、网络浏览器、移动设备、VR 系统等开发游戏。,这也可能是 Unity 被认为是跨平台开发工具的原因。

Unity 可以用来创建 3D 游戏,即游戏看起来像是在 3D 空间中操作(它有一个 X,Y,一个 Z)。Unity 也可以用来制作 2D 游戏。最近,Unity 被用于创建 VR 和 AR 游戏或模拟。

在本书中,我们将使用 Unity 的最新版本,目前是 2018.1。然而,像大多数软件(和许多硬件)一样,Unity 正在不断推出新的特性和功能,到本书出版时,可能会有更新版本的 Unity 推出。当 Unity 对他们的软件做一个小的改动时,他们通常会添加一个数字(比如 2018.1.1)。当更新稍微实质性一点的时候,那么版本号就会改变(比如 2018.2)。当 Unity 通常做出重大改变时,那么版本号将完全改变(Unity 1,2,3,4,5)。2017 年 7 月,Unity 将版本编号系统改为发布年份(2017 年和现在的 2018 年)。

统一要求

在你开始学习制作游戏之前,你需要下载 Unity 并安装在你的 Mac 上。虽然在 Windows 个人电脑上安装 Unity 可以为 iOS 设备制作游戏,但你需要使用一款名为 Xcode 的软件来移植 Unity 代码,以便它可以在 Mac 或 iOS 设备上运行。目前,Xcode 只能在 Mac 上使用。因此,如果你有一台 Windows PC,那么在某个阶段你将需要使用 Mac 来移植游戏。在本书中,我将使用 Mac 如果您使用的是 Windows PC,那么许多说明或指示可能不适用于您。

准备您的 Mac

对于使用 Unity 的 iOS 开发,您需要一台运行 Mac OS X 10.9 或更高版本和 Xcode 7.0 或更高版本的 Lion 或 Mountain Lion 的 Mac。Unity 2018 可能仍然可以在一些较旧的系统上运行,但您将需要最新版本的 Xcode,如前所述,这是 iOS 开发所必需的。最新版本的 Xcode 通常支持更新版本的 iOS。在撰写本文时,Xcode 的当前版本是第 9 版,这也是我将在本书中使用的版本。

注册

我强烈推荐登录苹果开发者网站( https://developer.apple.com/ )并注册成为一名 iOS 开发者。虽然这不是本书的绝对要求,但如果你想在 App Store 上发布游戏,那么你需要成为一名注册的苹果开发者。注册成为 Apple 开发人员的过程可能需要一段时间,尤其是在注册公司的情况下。第一步是注册成为苹果开发者(目前是免费的),然后一旦你注册了,下一步就是注册成为 iOS 开发者(目前是每年 99 美元)。

下载 Xcode

在本书的后面,你将不再需要 Xcode,但是下载并安装 Xcode 是值得的。你可以在苹果开发者网站上找到最新版本的 Xcode(https://developer.apple.com/)。

下载 Unity

现在是安装 Unity 的最佳时机。前往 Unity 网站的 https://unity3d.com ,然后选择获取 Unity 或输入 https://store.unity.com/ 。在这个页面上,你会找到 Unity 的最新版本(撰写本文时,2018.1)。您也可以在 Unity 网站上找到 Unity 以前的版本。

虽然只有一个 Unity 应用,但您可以订阅不同的许可选项,这取决于您的需求和您公司的规模(如果您有)。目前有三种许可选项:个人版、高级版和专业版。要开始下载过程,请单击符合您需求的订阅选项按钮(在撰写本文时,这将是 Try Personal、Get Plus 或 Go Pro)。该文件大约 1GB,因此下载可能需要一段时间。当你在 Unity 网站上等待的时候,花些时间去看看一些已经发布的游戏和演示,社区网站和用户论坛。这些将在使用 Unity 开发游戏的过程中非常有用。

安装 Unity

您从 Unity 下载的文件是一个下载安装程序,在编写本文时,它的名称是 UnityDownloadAssistant。

运行下载助手

下载完 UnityDownloadAssistant 文件后,双击该文件运行 Unity 下载助手。双击 Unity 下载助手图标开始安装 Unity(图 1-1 )。

img/460089_1_En_1_Fig1_HTML.jpg

图 1-1

Unity 下载助手

安装程序将完成整个安装过程,完成后,一个 Unity 文件夹将被放置在“应用”文件夹中(除非您选择了不同的位置)。如果您安装了以前版本的 Unity,新版本的安装可能会替换以前的版本。我建议在安装新版本(比如 Unity2017)之前,先重命名之前版本的文件夹。这样你仍然可以使用两个版本的 Unity。

Unity 安装文件夹包含 Unity 应用和几个支持文件夹和应用(图 1-2 )。

img/460089_1_En_1_Fig2_HTML.jpg

图 1-2

Unity 安装文件夹

Unity 文件夹中最重要的文件之一是 Unity 应用,它将提供用于创建和测试游戏的工具。这个应用有时被称为 Unity Editor,它不同于另一个应用 Unity Runtime Engine(也称为 Unity Player)。Unity 运行时引擎被集成到最终版本中,这将使游戏能够在目标硬件上运行。当我提到 Unity 时,我通常指的是 Unity 编辑器。我有时会把 Unity technologies 公司称为 Unity。但希望背景是清晰的。

文档文件夹包含用户手册、组件参考和脚本参考文档。这些也可在 Unity 网站上获得(选择学习链接)。所有这些文件都是 HTML 文档,可以通过 Unity 帮助菜单系统在 web 浏览器中打开,也可以通过双击文件直接打开。

“标准资源”文件夹包含几个带有。unityPackage 文件扩展名。这些是 Unity 包文件,包含 Unity 资产的集合,可以导入到 Unity 中。也可以创建自己的标准资产,并将这些资产导出到包文件中。

还有 Unity Bug Reporter 应用。该应用通常使用报告错误功能直接从 Unity 编辑器中运行。但是,该应用直接从 Unity 安装文件夹运行。

如果您下载了带有 Unity 安装的示例项目,请确保在 Unity 中打开它。如果您没有在安装时下载它,它仍然可以在任何时候下载。

欢迎

在 Unity 安装完成后(请做好准备,这需要一段时间),Unity 编辑器欢迎界面将会出现,并显示 Unity Hello!窗口(图 1-3 )。统一你好!窗口是您登录 Unity 帐户(如果您有)的地方。如果您没有 Unity 帐户,请选择创建一个链接。如果您当前没有连接到 Internet,您可以通过选择“脱机工作”按钮来脱机工作。

img/460089_1_En_1_Fig3_HTML.jpg

图 1-3

统一你好!屏幕

统一你好!当您启动 Unity 时会出现一个窗口(图 1-3 )。如果您还没有创建一个 Unity 帐户,我强烈建议您创建一个。

首次登录后,您将看到许可证管理屏幕。如果您已经购买了 Unity 的许可版本,请在对话框中输入您的许可序列号。如果您想使用免费版的 Unity,请选择 Unity 个人单选按钮(图 1-4 )。

img/460089_1_En_1_Fig4_HTML.jpg

图 1-4

Unity 许可证管理屏幕

建立统一

在我们开始用 Unity 制作游戏之前,这是一个回顾 Unity 的一些选项和管理特性的好时机。

更换皮肤(专业版)

如果您已经购买了 Unity 的 Pro 许可证,您将可以选择浅色或深色皮肤。如果你用的是免费版的 Unity,你只会看到浅色的皮肤。

由于大部分初学游戏开发者使用免费版的 Unity,所以我会使用浅色皮肤进行截图。浅色皮肤也为这本书的平装版提供了更好的截图。如果您有 Pro 版本并想要更改皮肤,请在 Unity 菜单中选择首选项(图 1-5 )。

img/460089_1_En_1_Fig5_HTML.jpg

图 1-5

Unity 首选项菜单

在首选项菜单打开的情况下,您可以将皮肤从深色更改为浅色或从浅色更改为深色(图 1-6 )。如果你用的是 Unity 个人版,你就只能用浅色皮肤了。

img/460089_1_En_1_Fig6_HTML.jpg

图 1-6

Unity 编辑器中的“通用偏好设置”菜单

当您打开“通用偏好设置”菜单时,我建议您确保取消选择“启动时加载上一个项目”选项。这将确保 Unity 在启动时加载项目选择对话框。这将确保您避免更新项目的错误版本或在准备好之前更新您正在使用的 Unity 版本。

报告问题

如果你继续使用 Unity 几年,你会遇到一些 bug(真实的和想象的都有)。我从 1.6 版本开始使用 Unity,遇到了几个关于 Unity 的 bug。软件漏洞并不是 Unity 独有的。一个游戏开发引擎是一个复杂的软件,Unity 当然欣赏和重视错误报告。如果错误没有被报告,那么 Unity 很难修复它们。Unity Bug Reporter 应用提供了这个特性。如前所述,在 Unity 安装文件夹中可以找到报告错误报告程序,也可以从 Unity 编辑器的帮助菜单中找到(图 1-7 )。

img/460089_1_En_1_Fig7_HTML.jpg

图 1-7

“帮助”菜单中的“报告错误”选项

选择帮助菜单上的报告、错误选项或双击 Unity 安装文件夹中的报告错误应用,打开 Unity 报告错误应用(图 1-8 )。该应用为用户提供了菜单选项和对话框,以指定问题与什么相关、问题发生的频率、错误的标题、错误的详细信息,以及附加任何有助于修复错误的相关文件的选项。Unity Bug Reporter 要求用户指定一个电子邮件地址,以便 Unity 团队可以回复 Bug 报告。

img/460089_1_En_1_Fig8_HTML.jpg

图 1-8

Unity Bug 报告器窗口

iOS 开发要求

在本章的前面,我建议下载 Xcode 并注册苹果开发者计划是个好主意。如果你还没有记下来,现在是时候停下来做这件事了。

苹果开发者支持页面( https://developer.apple.com/ )上列出了 iOS 开发的硬件和软件要求以及关于苹果开发者计划的详细信息。您也可以在 https://developer.apple.com/Xcode/ 找到 Xcode 的需求和下载页面。

Unity 网站

随着 Unity Technologies 增加了 Unity 的特性和功能,内容的广度和深度也在增加。这个网站上有很多信息,但我建议看看常见问题部分( https://unity3d.com/unity/faq )。还有一些很棒的教程、文档和视频可以帮助你学习在 Unity ( https://unity3d.com/unity/faq )中创建游戏。

Unity 社区

在“帮助”菜单中,有到官方 Unity 社区网站的链接。这包括由 Unity 工作人员主持的官方 Unity 论坛( https://forum.unity.com )。这对任何游戏开发者来说都是一个很好的资源。在这个菜单上还有一个到 Unity Answers 的链接,它使用堆栈交换格式,包括一些对问题和答案的控制(或审核)。

Unity 反馈网站( https://feedback.unity3d.com )允许开发者请求并投票表决未来可能的特性。

欢迎来到 Unity。

二、入门指南

希望你可能已经对增强现实(或 AR)有了一个很好的想法。由于对虚拟现实(或 VR)、增强现实和混合现实之间的区别存在一些混淆,我认为可能值得尝试澄清我在本书中提到的 AR 的意思。

虚拟现实(VR)是一种计算机生成的环境,通过感官和感知来模拟体验。与传统的计算机系统不同,虚拟现实系统将用户置于一种体验之中。用户沉浸其中,能够与 3D 世界互动,而不是观看他们面前的屏幕。

现在,我们来看看增强现实(AR)。普遍的共识是,AR 被定义为真实世界环境的直接实时视图,其元素由计算机生成的信息“增强”。VR 和 AR 的关键区别在于 AR 包含了真实环境的实景。VR 系统通常不包括真实环境的实时视图。VR 头戴式耳机是完全封闭的,显示器完全由计算机生成。

混合现实(MR,虽然缩写很少使用),是微软用来区分他们的 HoloLens 的一个术语。我感觉混合现实是 AR 的另一种形式。然而,对此仍有一些争论。当我问我在微软的好朋友时,他们觉得混合现实介于 AR 和 VR 之间,并将数字对象完全融入你的世界,使它们看起来好像真的在那里。

你可能会惊讶,VR 和 AR 这两个术语已经存在很多年了。虽然对术语 VR 的首次使用有相当多的争论(主要是由于对该术语的一致定义),但有一些普遍的共识,即该术语首次使用是在 20 世纪 50 年代左右,当时作者指的是完全沉浸式系统或环境。在整个美国军方和 NASA,飞机制造商将 AR 系统用于培训、研究和开发。然而,直到 2016 年,我们才看到第一个商用的消费级 AR 系统 Oculus Rift。Occulus Rift 由 Oculus VR 制造(最终被脸书以 20 亿美元收购)。

AR 的提法也提了很多年了。难以就第一次提及 AR 达成一致也是由于对 AR 的定义达成一致。1989 年,乔治·道格拉斯写了一个计算机驱动的天文望远镜制导和控制系统,该系统具有叠加的星域和天体坐标图形显示,似乎是第一个 ar 系统。

最近,AR 领域有了一些有趣的发展。虽然有一些专有系统,但第一个最引人注目的发展是为 Android 和 iOS 手机推出了 Pokémon Go。使用手机的地理定位功能和集成摄像头,用户能够在屏幕上看到一个虚拟物体,就像在现实世界中一样。

在这本书里,我将专注于为 iOS 开发一款 AR 游戏。我选择 iOS 有很多原因。首先,使用 iOS 的设备非常多。更重要的是,苹果正在硬件和软件两方面投资 AR 开发。苹果在 iOS 11 中加入了 ARKit。ARKit 让我们可以轻松地创建 AR 游戏和模拟,将虚拟对象放入用户的环境中。通过结合设备运动传感器的信息和摄像头的数据,ARKit 可以帮助 iPhone 或 iPad 分析周围环境。苹果还增强了 iPhone 8 和 iPhone X 的摄像头功能。iPhone 8 和 iPhone X 的摄像头设计用于在弱光下拍摄 60 帧/秒的视频。iPhone X 上的双光学图像稳定和 iPhone 8 上改进的光学图像稳定也提供了改进的视觉清晰度。这些硬件和软件功能有助于让游戏在用户环境中显得更加自然。苹果也在大力投资改善他们未来 iPhones 和 iPads 的 AR 功能。

Unity 最近在 Unity 商店推出了 Unity ARKit。这让我们制作 iOS 版 AR 游戏变得容易了很多。因此,在本书中,我将使用 Unity ARKit。所以现在是安装最新版本的 Unity ARKit 的好时机。Unity ARKit 的最低要求如下:

  • 支持 ARKit 并拥有最新版本 iOS 11.3 或更高版本的 iOS 设备。

  • 装有 macOS 10.13 (High Sierra)或更高版本的 Mac。

  • Unity 版本 2017.1 或更高版本。

  • 苹果开发者网站最新版本的 XCode 9.3(或更高版本)(需要 macOS 10.13)。

现在你已经安装了 Unity,是时候熟悉 Unity ARKit 的各种元素了,我们将用它来制作和测试我们的游戏。当我们探索 Unity ARKit 的不同组件时,我将讨论开发 AR 游戏的一些技术原理。由于这是一本入门书,所以我不会太深入技术细节,尽量保持这个相对较高的水平。我的编辑问我关于额外的 AR 书籍的建议,所以我可能会为关于 AR 的第二本书保留更高级或更技术的内容。

现在让我们启动 Unity 并创建一个新项目。

当您启动 Unity 时,您将看到项目屏幕(图 2-1 )。

img/460089_1_En_2_Fig1_HTML.jpg

图 2-1

Unity 项目屏幕

选择屏幕右上角的新图标。这将打开 Unity 新项目屏幕(图 2-2 )。在对话框中,键入项目名称,设置 Unity 文件的位置,键入您的组织名称,并将模板设置为 3D。

img/460089_1_En_2_Fig2_HTML.jpg

图 2-2

Unity 新项目屏幕

在 Unity 新项目屏幕的对话框中,输入项目名称,选择要保存该文件的位置,并选择创建项目图标(图 2-2 )。我选择了 AR 项目作为文件名,并选择了硬盘上的用户文件夹。

现在 Unity 将打开一个空白的 Unity 项目(图 2-3 )。

img/460089_1_En_2_Fig3_HTML.jpg

图 2-3

空白的 Unity 项目屏幕

安装 Unity ARKit

现在是安装 Unity ARKit 的最佳时机。要从 Unity 商店安装 Unity ARKit,您需要访问 Unity 资产商店。可以通过多种方式访问 Unity Asset Store。在 Unity 屏幕的主窗口中,有一个资产存储选项卡,这将调出资产存储窗口。此窗口也可以通过使用命令按钮和 9 (⌘+9).)来访问要从资产商店下载资源,您需要向 Unity 注册以创建一个 Unity ID。创建 Unity ID 后,在 Unity Asset Store 窗口中会出现一个搜索栏。在搜索栏 ARKit 中键入,这将显示符合该搜索标准的文件列表(图 2-4 )。Unity 中的默认窗口设置将显示最小化的 Unity 商店窗口;要以全屏模式查看资产存储,屏幕右上角有一个下拉菜单。选择此项,然后用鼠标左键单击。这将显示屏幕选项,重新加载,最大化,关闭标签,并添加标签。选择最大化选项(单击鼠标左键)。在屏幕的顶部,有几个过滤器选项。在筛选选项下面,将会有符合您的搜索标准的资产。双击 ARKit,这将加载该资产的屏幕。选择导入按钮,该资产将被导入到 Unity 中(图 2-5 )。

img/460089_1_En_2_Fig5_HTML.jpg

图 2-5

场景文件夹中带有 ARKit 的 Unity 项目文件夹

img/460089_1_En_2_Fig4_HTML.jpg

图 2-4

统一资产商店

编辑器布局

现在是时候仔细看看 Unity 编辑器的布局了。主窗口分为多个面板。区域的默认显示视图(出厂设置)通过单击视图的选项卡来选择。视图可以被添加、移动、删除和调整大小,并且编辑器支持在布局之间切换,所以布局本质上是视图的特定排列。比如主窗口的默认布局(图 2-6 )有一个包含场景视图(图 2-7 )和游戏视图(图 2-8 )的区域。

img/460089_1_En_2_Fig8_HTML.jpg

图 2-8

在多标签区域中选择的游戏视图

img/460089_1_En_2_Fig7_HTML.jpg

图 2-7

在多标签区域中选择的场景视图

img/460089_1_En_2_Fig6_HTML.jpg

图 2-6

Unity 编辑器的默认布局

预设布局

默认布局只是几种预设布局中的一种。可从主窗口右上角的菜单中选择替代布局(图 2-9 )。Unity 还使我们能够创建自己的布局。在图 2-9 中,你会看到我的菜单中有一个手机游戏配置。这是我在创作手机游戏时创建的自定义布局。看看你菜单上的各种布局。图 2-6 至 2-7 显示了最终布局。

img/460089_1_En_2_Fig9_HTML.jpg

图 2-9

布局菜单

我将很快更详细地描述各种类型的视图,但现在,请注意 2 乘 3 布局(图 2-10 )是场景视图和游戏视图位于不同区域而不是共享同一区域的布局示例。4 分割布局(图 2-11 )有四个场景视图实例,表明布局并不局限于每种类型的视图。高大布局(图 2-12 )提供了人像场景视图。宽阔的布局(图 2-13 )提供了一个景观场景视图。

img/460089_1_En_2_Fig13_HTML.jpg

图 2-13

宽阔的布局

img/460089_1_En_2_Fig12_HTML.jpg

图 2-12

高大的布局

img/460089_1_En_2_Fig11_HTML.jpg

图 2-11

4 分割布局

img/460089_1_En_2_Fig10_HTML.jpg

图 2-10

2 乘 3 布局

自定义布局

预设布局提供了各种工作空间,但幸运的是,您并不局限于使用它们。Unity 提供了完全重新排列编辑器窗口的灵活性。

调整区域大小

首先,在尝试各种预设布局时,您可能会注意到一些区域太窄,例如,在宽布局的左侧面板中(图 2-13 )。幸运的是,您可以单击某个区域的边界并拖动它来调整该区域的大小。

移动视图

更酷的是,你可以四处移动视图。将视图的选项卡拖到另一个选项卡区域会将视图移动到那里。并且将标签拖动到“停靠”区域将创建一个新区域。例如,从默认布局开始,将“检查器”标签拖到“层次”标签的右侧。现在,检查器视图与层次视图共享相同的区域。结果应该如图 2-14 所示。

img/460089_1_En_2_Fig14_HTML.jpg

图 2-14

移动视图后定制的工作空间

分离视图

您甚至可以将一个视图拖到编辑器窗口之外,以便它驻留在自己的“浮动”窗口中,可以像对待任何其他区域一样对待它。将场景选项卡拖到编辑器外,使其驻留在一个浮动窗口中,然后将游戏选项卡拖到其选项卡区域中。结果应该如图 2-15 所示。类似地,将标签拖动到浮动窗口的停靠区域将向窗口添加另一个区域。

小费

我喜欢将游戏视图分离到一个浮动窗口中,因为我通常在编辑器中工作时不需要看到它,直到我点击播放,这允许我最大化游戏视图以填满整个屏幕。我也喜欢和不止一个显示器一起工作。这样,我可以最大化我的屏幕空间。

img/460089_1_En_2_Fig15_HTML.jpg

图 2-15

新视图列表

浮动窗口经常被其他窗口覆盖,所以菜单栏上的窗口菜单有使每个视图可见的菜单项。注意,每一个都有一个键盘快捷键,还有一个布局子菜单,与编辑器中的布局菜单相同。

添加和删除视图

您还可以使用区域右上角的菜单添加和删除每个区域中的视图(图 2-15 )。“关闭”选项卡项目删除当前显示的视图。“添加”选项卡项目提供了一个新视图列表供您选择。

您可能希望不同的目标平台有不同的布局,或者开发和测试有不同的布局,甚至不同的游戏有不同的布局。例如,我有一个专门为我的手机游戏定制的布局,以合适的纵向纵横比预先保存游戏视图。每次启动 Unity 时手动重新配置编辑器会很麻烦。幸运的是,您可以通过选择布局菜单中的保存布局选项来命名和保存布局,这将提示您输入新的布局名称(图 2-16 )。

img/460089_1_En_2_Fig16_HTML.jpg

图 2-16

提示新布局

保存后,新布局将在布局菜单中列出,如果选择删除布局,还会在可供删除的布局列表中列出(图 2-17 )。

img/460089_1_En_2_Fig17_HTML.jpg

图 2-17

布局的删除菜单

如果您弄乱或删除了原始布局,您可以在区域菜单中选择恢复出厂设置选项(图 2-18 )。这也将删除任何自定义布局。

img/460089_1_En_2_Fig18_HTML.jpg

图 2-18

恢复原始布局设置

如果您更改了一个布局并且没有保存更改,您可以通过在布局菜单中重新选择该布局来放弃更改。

检查员视图

首先要详细描述的最佳视图是 Inspector 视图,因为它的功能是显示有关在其他视图中选择的对象的信息。它不仅仅是一个检查器,因为它通常可以用来修改选中的项目。

检查员视图也用于显示和调整可在编辑菜单中调出的各种设置(图 2-19 )。

img/460089_1_En_2_Fig19_HTML.jpg

图 2-19

调出编辑器设置

“检查器”视图显示编辑器设置。如果项目当前有元文件,则版本控制模式设置为元文件(如果您使用资产服务器,则此选项设置为资产服务器)。要隐藏图元文件,将版本控制模式设置为隐藏(图 2-20 )。

img/460089_1_En_2_Fig20_HTML.jpg

图 2-20

检查器视图中的编辑器设置

当版本控制模式设置为禁用时,Unity 将删除元文件。现在,资产跟踪是在项目的 Library 文件夹中的二进制文件中处理的。

注意

使用元文件进行版本控制支持的 Unity 用户也可以选择将资产序列化模式设置为强制文本。在这种模式下,Unity 场景文件以纯文本 YAML (YAML 不是标记语言)格式保存。

通常,检查器视图显示最近选择的对象的属性(当您调出编辑器设置时,您实际上选择了它)。但有时您不想在选择其他对象时更改检查器视图。在这种情况下,您可以通过选择视图右上角菜单中的锁定选项将检查器视图锁定到一个对象(图 2-21 )。

img/460089_1_En_2_Fig21_HTML.jpg

图 2-21

锁定检查器视图

项目视图

虽然检查器视图可以被认为是编辑器中最低级别的视图,因为它只显示单个对象的属性,但是项目视图可以被认为是最高级别的视图(图 2-22 )。项目视图显示游戏可用的所有资源,从单个模型、纹理和脚本到包含这些资源的场景文件。所有项目资源都是位于项目的“资源”文件夹中的文件(因此您可能希望将项目视图视为“资源”视图)。

img/460089_1_En_2_Fig22_HTML.jpg

图 2-22

项目视图的顶层

在一列和两列之间切换

在几个旧版本的 Unity 中,项目视图只有一列显示。该选项在项目视图的菜单中仍然可用(单击视图右上角的小三线图标),因此您现在可以在一列和两列之间切换。

缩放图标

底部的滑块缩放右侧面板中的视图——较大的比例适合纹理,较小的比例适合没有有趣图标的脚本等项目。这是按资源类型划分资源的一个很好的理由(即,将所有纹理放在一个纹理文件夹中,将脚本放在一个脚本文件夹中,等等)。很有可能,单一比例的滑块设置对混合的资产类型并不好。

检查资产

选择右侧的资产将在检查器视图中显示该资产的属性。例如,如果您选择一个动画样本,检查器视图会显示有关动画的信息,其中一些信息您可以更改,如持续时间,它甚至允许您在编辑器中播放动画(图 2-23 )。我们将在后面的章节中讨论改变资产属性,但是现在可以在项目视图中随意选择各种类型的资产,看看在检查器视图中显示了什么。

img/460089_1_En_2_Fig23_HTML.jpg

图 2-23

在项目视图中检查选定的资产

搜索资产

在大型复杂的项目中,很难手动搜索特定的资产。幸运的是,就像在 Finder 中一样,有一个搜索框可以用来过滤显示在项目视图右侧面板中的结果。在图 2-24 中,项目视图显示了搜索名称中带有“add”的资产的结果。

img/460089_1_En_2_Fig24_HTML.jpg

图 2-24

搜索名称中带有“添加”的资产

右侧面板显示“资产”下所有内容的搜索结果(即我们的所有资产)。通过选择左侧面板中的一个子文件夹,可以进一步缩小搜索范围。例如,如果您知道您正在查找一个场景,并且您已经按照资源类型将资源排列到子文件夹中,则可以选择要搜索的文件夹。在图 2-25 中,我已经在 examples 文件夹中搜索了文件名中带有 add 的任何资产。

img/460089_1_En_2_Fig25_HTML.jpg

图 2-25

在特定文件夹中搜索资产

注意就在搜索的下面;有一个以所选文件夹名称命名的选项卡。您仍然可以单击左侧的“资产”选项卡来查看您所有资产的搜索结果,包括本地资产和 Unity 资产商店上的资产,我们将在本书中多次使用这些资产。

您还可以使用搜索框右侧的菜单,按资产类型筛选您的搜索。您可以选择场景作为感兴趣的资产类型,而不是只在示例文件夹中进行搜索(图 2-26 )。请注意这是如何导致被添加到搜索框中的。前缀 t:表示搜索应该按照以下资产类型进行筛选。你可以不用菜单直接输入。

img/460089_1_En_2_Fig26_HTML.jpg

图 2-26

按资产类型筛选的搜索

“资产类型”菜单右侧的按钮用于按标签过滤(您可以在“检查器”视图中为每个资产分配一个标签),这对于搜索资产存储也非常方便。最右边的星号按钮将在左侧面板的收藏夹部分保存当前搜索。

经营资产

项目视图中的资源可以像 Finder 中的相应文件一样进行操作。

双击资产将尝试打开合适的程序来查看或编辑该资产。这相当于右键单击资产并选择打开。双击场景文件将在 Unity 编辑器窗口中打开场景,就像您在文件菜单中选择了打开场景一样。

您还可以像在 Finder 中一样给文件重新命名、复制和删除,以及将文件拖入和拖出文件夹。有些操作可在 Unity 编辑菜单和右键单击资源时的弹出菜单中找到。在接下来的几章中,你会得到一些练习。

同样,在下一章中,您将向项目中添加资产。这包括导入文件或导入 Unity 包,使用菜单栏上的“资源”菜单,或者使用 Finder 将文件拖到项目的“资源”文件夹中。

层级视图

每个游戏引擎都有一个顶级对象,称为游戏对象实体,用来表示任何具有位置、潜在行为和名称的事物。Unity 游戏对象是 GameObject 类的实例。

注意

总的来说,当我们提到一种类型的 Unity 对象时,我们将使用它的类名来精确地说明在脚本中如何引用该对象。

层次视图是当前场景的另一种表示。虽然场景视图是场景的 3D 表示,您可以像使用内容创建工具一样在其中工作,并且游戏视图显示玩游戏时的场景,但层次视图在一个易于导航的树结构中列出了场景中的所有游戏对象。

检查游戏对象

当你在层次视图中点击一个游戏对象时,它会成为当前的编辑器选择,并且它的组件会显示在编辑器中。每个 GameObject 都有一个 Transform 组件,它指定了它在层次中相对于其父对象的位置、旋转和缩放(如果您熟悉 3D 图形的数学,则该 Transform 本质上是对象的变换矩阵)。一些组件为游戏对象提供功能(例如,灯是附加有灯组件的游戏对象)。其他组件引用网格、纹理和脚本等资源。图 2-27 显示了主相机游戏对象的组件(在层级视图中,游戏对象的整个玩家树显示为蓝色,因为它链接到一个预设,一种特殊类型的资产,用于克隆一个游戏对象或一组游戏对象)。

img/460089_1_En_2_Fig27_HTML.jpg

图 2-27

层次视图和检查器视图

父子游戏对象

你会发现许多游戏对象被安排在一个层次结构中,这就是这个视图的名字。对于概念上组合在一起的游戏对象来说,父子关系是有意义的。例如,当您要移动一辆汽车时,您希望车轮自动随汽车一起移动。因此,车轮应该被指定为汽车的子件,从汽车的中心偏移。当车轮转动时,它们相对于汽车的运动而转动。养育还允许我们一次激活或停用整组游戏对象。

场景视图

虽然层级视图允许我们在当前场景中创建、检查和修改游戏对象,但是它没有给我们一种可视化场景的方法。这就是场景视图的用武之地。场景视图类似于 3D 建模应用的界面。它允许您从任何 3D 有利位置检查和修改场景,并让您了解最终产品的外观。

浏览场景

如果你不熟悉在 3D 空间工作,这是在 2D 工作的直接延伸。在 3D 空间中,您有一个额外的 z 轴和(x,y,z)坐标,而不仅仅是在具有 x 和 y 轴和(x,y,z)坐标的空间中工作。x 轴和 z 轴定义地平面,y 轴指向上方(可以将 y 视为高度)。

注意

一些 3D 应用和游戏引擎使用 z 轴表示高度,x 轴和 y 轴表示地平面,因此在导入资源时,您可能需要调整(旋转)它们。

3D 空间中的视点通常称为相机。单击右上角的多色场景 Gizmo 的 x、y 和 z 箭头是一种快速翻转相机的方法,使其面向相应的轴。例如,单击 y 箭头会给你一个自上而下的场景视图(图 2-28 ),场景 Gizmo 下的文本显示“顶部”

img/460089_1_En_2_Fig28_HTML.jpg

图 2-28

场景视图中的俯视图

这里的相机与游戏中使用的场景中的相机游戏对象不同,所以当你在场景视图中四处查看时,你不必担心弄乱游戏。

为了演示如何使用导航工具,我从项目文件夹中选择了玩家游戏对象,并将其拖动到层次视图中。

单击场景 Gizmo 中心的框可以在透视之间切换相机投影,当对象远离时,会将对象渲染得更小;和“正交”( orthographic ),无论远近,都以原始大小呈现。透视更真实,也是你通常在游戏中使用的,但是正投影在设计时通常更方便(因此它在计算机辅助设计应用中无处不在)。场景 Gizmo 下文本前面的小图形表示当前投影。

您可以使用鼠标滚轮进行放大和缩小,也可以选择编辑器窗口右上角工具栏中的手形工具,按住 Control 键的同时单击并拖动鼠标。当选择手形工具时,你也可以通过点击拖动视图来移动相机,并且你可以通过按住 Option(或 Alt)键拖动鼠标来旋转(环绕)相机,这样你就不仅仅局限于轴相机角度,如图 2-29 所示。

img/460089_1_En_2_Fig29_HTML.jpg

图 2-29

场景视图中的倾斜透视

请注意,当你从任意角度观看时,场景 Gizmo 下的文本显示 Persp 或 Iso,这取决于你使用的是透视还是正交投影(Iso 是 isometric 的缩写,是星际争霸等游戏中常见的倾斜正交视图)。

工具栏上的其他按钮激活移动、旋转和缩放游戏对象的模式。目前没有理由更改它们,所以当您开始创建新项目时,将会更详细地解释这些模式。

小费

如果不小心更改了场景,可以从“编辑”菜单中选择“撤消”。如果你做了很多不想保留的修改,当你切换到另一个场景或退出 Unity 时,你可以拒绝保存这个场景。同时,请注意,在这些模式下,您仍然可以使用交替的键盘和鼠标组合来移动摄像机。表 2-1 列出了所有可能的选项。

表 2-1

可用的场景视图相机控件

|

行动

|

手工工具

|

单键鼠标或触控板

|

2 键鼠标

|

三键鼠标

|
| --- | --- | --- | --- | --- |
| 移动 | 单击并拖动 | 按住 Alt-Command 键并点按拖移 | 按住 Alt 键并单击拖动 | 按住 Alt 键并单击鼠标中键拖动 |
| 轨道 | 按住 Alt 键并单击拖动 | 按住 Alt 键并单击拖动 | 按住 Alt 键并单击拖动 | 按住 Alt 键并单击拖动 |
| 一款云视频会议软件 | 按住 Control 键并点按拖移 | 按住 Control 键并点按拖移或双指扫动 | 按住 Alt 并右键单击拖动 | 按住 Alt 并右键单击拖动或滚轮 |

还有一些其他方便的基于键盘的场景导航功能。按箭头键将沿着 x–z 平面(地平面)向前、向后、向左和向右移动摄像机。按住鼠标右键可以像在第一人称游戏中一样浏览场景。AWSD 键分别向左、向前、向右和向后移动,移动鼠标控制摄像机(视点)的观察位置。

当你想在场景视图中查看一个特定的游戏对象时,有时最快的方法是在层次视图中选择游戏对象,然后使用编辑菜单中的帧选择菜单项(注意便捷的快捷键 F)。在图 2-28 中,我点击了场景 Gizmo 的 x 轴以获得一个水平视图,然后在层次视图中选择玩家游戏对象,并按下 F 键(编辑菜单中所选帧的快捷键)以放大并使玩家在场景视图中居中。

你也可以在场景视图中直接选择一个游戏对象,但是你必须先退出手形工具。正如在层级视图中选择一个游戏对象会导致该选择显示在场景视图和检查器视图中,在场景视图中选择一个游戏对象同样会在检查器视图中显示该选择,并在层级视图中显示为所选的游戏对象。在图 2-30 中,当我在玩家上调用帧选择后,我点击了移动工具(在编辑器窗口右上角的手工具按钮的正右边的按钮),然后在场景视图中点击了玩家附近的游戏对象。层级视图自动更新以显示游戏对象被选中,并且游戏对象也显示在检查器视图中。

img/460089_1_En_2_Fig30_HTML.jpg

图 2-30

在场景视图中选择游戏对象

场景视图选项

场景视图顶部的按钮提供了显示选项,有助于您的游戏开发。每个按钮配置一种视图模式。

最左边的按钮设置绘图模式。通常情况下,这种模式设置为纹理化,但如果你想看到所有的多边形,你可以设置为线框(图 2-31 )。

img/460089_1_En_2_Fig31_HTML.jpg

图 2-31

场景视图中的线框显示

“下一步”按钮设置渲染路径,它控制场景是正常着色还是用于诊断。

“渲染路径模式”按钮右侧的三个按钮是简单的切换按钮。当鼠标悬停在它们上面时,它们都会弹出一些鼠标悬停文档(也称为工具提示)。

第一个控制场景照明模式。这将在场景视图中使用默认照明方案或游戏中放置的实际灯光之间切换。

中间的按钮切换游戏覆盖模式,天空,镜头眩光和雾效果是否可见。

最后,还有试听模式,可以打开和关闭声音。

场景视图小控件

右侧的小控件按钮激活与组件相关联的诊断图形的显示。图 2-32 中的场景视图显示了一些小发明。通过单击 gizmos 按钮并检查可用 Gizmos 的列表,您可以看到代表摄像机和灯光的图标。

img/460089_1_En_2_Fig32_HTML.jpg

图 2-32

场景视图中的小控件

您可以选择和取消选择 Gizmos 窗口中的各种复选框,以关注您感兴趣的对象。左上角的复选框在小控件的 3D 显示和 2D 图标之间切换。相邻的滑块控制 gizmo 的缩放(因此隐藏所有 gizmo 的一个快速方法是将缩放滑块一直拖到最左侧)。

游戏视图

现在我们来看看游戏视图。像层级视图和场景视图一样,游戏视图描述当前场景,但不是为了编辑目的。相反,游戏视图是用来玩和调试游戏的。

当你点击 Unity 编辑器窗口顶部的播放按钮时,游戏视图会自动出现。如果当您点按“播放”时没有现有的游戏视图,则会创建一个新的游戏视图。如果游戏视图在编辑器不处于播放模式时是可见的,则它显示游戏的初始状态(即,从初始摄像机位置的有利位置)。

游戏视图显示了游戏在你实际部署时的外观和功能,但可能会与最终构建目标的外观和行为有所不同。一个可能的区别是游戏视图的大小和长宽比。这可以使用视图左上角的菜单进行更改。图 2-33 显示了当您从自由宽高比切换到 5:4 宽高比时会发生什么,自由宽高比可根据视图的尺寸进行调整,5:4 宽高比会缩小游戏显示,使其适合该区域并保持所选的宽高比。

img/460089_1_En_2_Fig33_HTML.jpg

图 2-33

游戏视图

最大化播放

当游戏处于播放模式时,点击播放时最大化按钮将导致游戏视图扩展以填充整个编辑器窗口(图 2-34 )。如果视图与编辑器窗口分离,该按钮将不起作用。

img/460089_1_En_2_Fig34_HTML.jpg

图 2-34

游戏中最大化的游戏视图

统计数据

统计按钮显示关于场景的统计数据(图 2-35 ),这些数据会随着游戏的运行而更新。

img/460089_1_En_2_Fig35_HTML.jpg

图 2-35

带统计数据的游戏视图

游戏视图小发明

小控件按钮激活与零部件相关联的诊断图形的显示。图 2-36 中的游戏视图显示了两个图标,它们是音频源的小发明。gizmo 按钮右侧的列表允许您选择要显示的 gizmo。

img/460089_1_En_2_Fig36_HTML.jpg

图 2-36

带小发明的游戏视图

游戏视图和场景视图都是对当前场景的描述。Unity 项目由一个或多个场景组成,Unity 编辑器一次只打开一个场景。把项目想象成一个游戏,把场景想象成关卡(事实上,一些对场景进行操作的 Unity 脚本函数在名字中使用了“关卡”)。Unity 游戏对象通过附加组件变得有趣,每个组件提供一些特定的信息或行为。这就是检查员视图的用武之地。如果您在层级视图或场景视图中选择游戏对象,检查器视图将显示其附加组件。

控制台视图

所有预设布局中剩下的视图,控制台视图,很容易被忽略,但它非常有用(图 2-37 )。

img/460089_1_En_2_Fig37_HTML.png

图 2-37

控制台视图

信息、警告和错误消息出现在控制台视图中。错误以红色显示,警告以黄色显示,信息性消息以白色显示。从列表中选择一条消息会在下方区域显示更多详细信息。此外,Unity 编辑器底部的单行区域显示最新的控制台消息,因此即使控制台视图不可见,您也可以随时看到已记录的消息。

小费

警告信息很容易被忽略,但是你可以冒险忽略它们。他们在那里是有原因的,通常表明有些事情必须解决。如果你让警告越积越多,当一个真正重要的警告出现时,你很难注意到。

控制台会很快变得混乱。您可以使用控制台视图顶部最左边的三个按钮来管理这种混乱。清除切换按钮删除所有消息。折叠切换按钮组合了相似的消息。每次编辑器进入播放模式时,“播放时清除”开关将删除所有消息。

错误暂停按钮将导致编辑器在出现错误消息时暂停,特别是当脚本调用 Log.LogError 时。

在编辑器中操作时,日志消息最终会出现在编辑器日志中,而从 Unity 构建的可执行文件中生成的消息会被定向到播放器日志中。从视图菜单中选择打开玩家日志或打开编辑器日志(单击控制台视图右上角的小图标)将会以文本文件或控制台应用的形式显示这些日志(图 2-38 )。

img/460089_1_En_2_Fig38_HTML.jpg

图 2-38

Mac 控制台应用中的 Unity 日志

进一步探索

我们的 Unity 之旅已经接近尾声。在第三章,你将开始学习 ARKit 的一些特性。这是真正开始使用 Unity 的第一章。你还没有开始构建你自己的场景(这将在第三章开始),但是你已经能够熟悉 Unity 编辑器了。有很多官方的 Unity 资源对我将要讨论的主题进行了扩展。

统一手册

正如你所看到的,有很多 Unity 用户界面,我们几乎没有涵盖所有。这是认真阅读 Unity 手册的好时机,无论是在 Unity 编辑器(欢迎屏幕或帮助菜单)中,还是在 Unity 网站( http://unity3d.com/ )的“文档”部分的“学习”选项卡下。当你想在没有 Unity 编辑器的情况下查找一些东西或者只是阅读关于 Unity 的内容时,网页版非常方便。

本章涵盖的大部分内容与 Unity 手册的 Unity 基础部分的主题相匹配,尤其是关于“学习界面”、“定制您的工作空间”、“发布版本”和“Unity 热键”的部分我们确实跳到了 Unity 手册的高级部分,并提到了 Unity 对版本控制的支持。Unity 手册的“在 Unity 中使用外部版本控制”一页对此有更深入的介绍

教程

除了“文档”部分,Unity 网站上的“学习”标签还包括一个“教程”部分,该部分提供了大量的初级编辑视频。顾名思义,这些视频介绍了 Unity 编辑器,事实上,这组视频涵盖了本章讨论的大部分内容,包括最重要的视图(游戏视图、场景视图、层级视图、检查员视图和项目视图)的描述,甚至是发布构建的过程。

版本控制

虽然我只是简单地讨论了版本控制,但是在解释如何移除元文件的上下文中,这个主题值得再讨论一下,因为版本控制系统(或 VCS)对于软件开发是如此重要(当您第一次丢失项目或不记得做了什么破坏了游戏时,您会意识到这一点!).如果你已经有了一个最喜欢的 VCS,你可能想和 Unity 一起使用,如果你还没有用过,你可能想考虑保留你的项目的旧版本以防你需要回滚,有能力检查版本之间的差异,

在版本控制系统中,Perforce 是游戏工作室中常用的商业工具,Subversion (svn)作为开源选项有着悠久的历史。如今,像 Git 和 Mercurial 这样的分布式版本控制系统已经成为趋势。我在 Bitbucket ( http://bitbucket.com/ )上使用 Mercurial 进行我的内部项目,并在 GitHub 上发布公共项目,包括这本书的项目。

说 Unity VCS 支持是产品不可知的,实际上是另一种说法,Unity 没有任何特定的版本控制系统集成到 Unity 编辑器中。图元文件和 Unity Pro 用户的 YAML 场景文件只是提供了与面向文本的版本控制系统更好的兼容性,这些版本控制系统通常用于源代码。你还是得在联合之外亲自管理 VCS 的业务。你可以顺便在 http://yaml.org/ 上了解更多关于 YAML 的信息。

我发现使用 GitHub 网站上提供的 Mac GitHub 应用很方便,类似的 BitBucket source tree 也可以在该网站上找到。

三、Unity ARKit

现在,您已经安装了 Unity 和 Unity ARKit 插件,是时候开始学习更多关于这个工具的知识,并进行我们的第一次 AR 体验了。注意,我称之为体验而不是游戏,尽管它可能以某种方式被用作游戏;从我的角度来看,一个游戏需要一些关键元素,我将在第四章详细介绍。

如果您还没有打开我们在上一章中创建的 AR 项目,现在是这样做的好时机。如果您查看项目文件夹(图 3-1 )并查看每个文件夹,您会看到 Unity ARKit 插件附带了许多资源,我们将在本书中探索和使用这些资源。

创建场景

我们要做的第一个任务是创建游戏对象,并将其放入我们的场景中,在 AR 中查看它。从菜单中选择游戏对象➤ 3D 对象➤立方体(图 3-1 )。我们可以选择任何 3D 对象,但我希望你在 AR 中看到立方体,并在 3D 空间中围绕它移动。虽然我更喜欢球体,3D 立方体有六个顶点(多边形的角点),这些将更容易看到。然而,我们将很快添加不同形状的游戏对象。

img/460089_1_En_3_Fig1_HTML.jpg

图 3-1

创建 3D 游戏对象

一旦你完成了这个任务,你将会在场景面板中看到我们惊人的立方体(图 3-2 )。

img/460089_1_En_3_Fig2_HTML.jpg

图 3-2

场景中的立方体游戏对象

现在让我们在检查器里看一下(图 3-3 )。如果你的变换位置和我的不一样,现在不用担心这个(无论如何我们都要移动游戏对象)。注意比例是 1,1,1。Unity 使用公制标准进行测量,因此 Unity 空间中的 1 个单位相当于现实世界中的 1 米。现在对于大多数传统游戏(不是 AR),这真的不是初学者开发者需要担心的事情(太多)。然而,因为我们将把游戏资产投影到现实世界的空间中,获得正确的尺寸和比例变得非常重要。所以,如果我们把立方体的比例设为 1 米宽,1 米高,1 米深,这将是一个相当大的立方体。在 3D 图形中描述坐标的约定是 X,Y,z。我将在本书中使用这个标准。我将扩展我们这个令人惊叹的立方体,这样它就能适合我的小公寓了。一些读者可能会感到惊讶,大多数教学书籍的作者并没有住在价值数百万美元的豪宅里(至少这位作者没有)。

img/460089_1_En_3_Fig3_HTML.jpg

图 3-3

检查器中的立方体游戏对象

在检查器中,将刻度设置为 0.25,0.25,0.25(图 3-4 )。

img/460089_1_En_3_Fig4_HTML.jpg

图 3-4

立方体游戏对象缩小比例

现在如果你看场景中的立方体,它会(或者应该)看起来更小(图 3-5 )。如果你想更近距离的观察游戏对象,你可以在场景视图中移动相机靠近立方体。移动场景视图摄影机有两种主要方式。最简单的方法是在层级面板中选择游戏对象,然后按 f 键(我记得这是 f 键表示焦点)。另一种方法是使用鼠标中轮(如果你有一个 3 键鼠标)将相机移进或移出,或者双击鼠标(如果你有一个魔术鼠标)。我(非常)老派,更喜欢用我的 5 键鼠标。

img/460089_1_En_3_Fig5_HTML.jpg

图 3-5

缩小比例的立方体游戏对象的场景视图

摄像机

现在是谈论照相机的好时机。我们刚刚在场景视图中移动了摄像机。这个摄像机使你,开发者,能够看到场景中的东西。但是,如果你在层级面板中查看,你会看到一个 GameObject 主摄像头。这是玩家将要观看的摄像机。你会注意到在图 3-5 中,我的场景视图中有一个相机图标。这是玩家的摄影机在场景中的位置。我要你在层级面板中选择主摄像机。你会在场景视图的右下角看到一个小窗口(图 3-6 )。此窗口显示玩家摄像机的视图(摄像机预览)。

img/460089_1_En_3_Fig6_HTML.jpg

图 3-6

相机预览

虽然相机预览窗口为我们提供了一个很好的场景对玩家来说是什么样子的想法,但为了获得更好的视图,我们可以选择游戏视图选项卡(图 3-7 )。

img/460089_1_En_3_Fig7_HTML.jpg

图 3-7

游戏视图

正如我们在前一章中看到的,有许多设置我们可以使用(长宽比,比例,等等)。我们在这里可以看到,我们惊人的立方体有点远。我们将首先移动游戏对象,然后我们将移动主摄像机。

转换

在 Unity 中有几种移动(变换)游戏对象的方法。我们将使用的第一种方法(也是我使用的主要方法)是在检查器中设置变换设置。首先,选择我们想要转换的游戏对象。然后,在检查器中设置变换位置为 0,0,0(图 3-8 )。

img/460089_1_En_3_Fig8_HTML.jpg

图 3-8

具有更新的变换位置的游戏对象

现在让我们看看主摄像头,看看玩家会怎么看(图 3-9 )。

img/460089_1_En_3_Fig9_HTML.jpg

图 3-9

带有重置变换位置的游戏对象的相机预览

你会注意到游戏对象离主摄像头还是有点远。在屏幕的左上方(层级面板的正上方),有六个图标(图 3-10 )。

img/460089_1_En_3_Fig10_HTML.jpg

图 3-10

六个变换图标

第一个图标是手形工具(Q 快捷键),它用于在场景视图中变换(或平移)相机。选中此工具,选择层次结构中的任何游戏对象,移动鼠标,注意游戏对象的变换设置不会改变,但游戏对象的视图会改变。按住 alt (option)键的同时,“手形工具”使您能够围绕其轴点环绕摄影机。通过按住控制按钮,您可以移动(或推拉)相机靠近或远离游戏对象。

下一个图标是移动工具(W 快捷键)。正如你可能猜到的,移动工具是用来移动游戏对象在场景中的位置的。选择主相机,选择移动工具(通过选择移动图标或按下 W 键),你会注意到在场景视图中主相机图标现在有了移动 Gizmo(带箭头的红、绿、蓝线–图 3-11 )。首先,选择绿线(Y 轴)并向下移动主摄像机。请注意,当您选择此行时,其他箭头行将灰显,您选择的行将变为黄色。现在尝试将相机移动到 Y 轴的 0。您会注意到这可能需要一些时间。如果您不能正确放置,您可能希望在检查器的 Y 中输入零(这就是为什么我更喜欢在检查器中键入值)。

img/460089_1_En_3_Fig11_HTML.jpg

图 3-11

移动小控件

下一个工具是旋转工具(E 快捷键)。正如你可能猜到的,这个工具是用来旋转游戏对象的。尝试选择立方体,然后按 R 键。您将看到旋转小控件(图 3-12 )。使用旋转 Gizmo,您可以通过单击并拖动出现在其周围的线框旋转 Gizmo 的轴来更改游戏对象的旋转。使用旋转 Gizmo,红色、绿色和蓝色的圆将围绕红色、绿色和蓝色轴进行旋转(红色是 x 轴,绿色是 y 轴,蓝色是 z 轴)。外圆用于围绕场景视图 z 轴旋转游戏对象。

img/460089_1_En_3_Fig12_HTML.jpg

图 3-12

旋转小控件

下一个工具是计重收费(R 快捷键)。缩放工具用于缩放或重缩放所有轴上的游戏对象,方法是选择缩放 Gizmo 的中心,然后拖动鼠标(图 3-13 )。您也可以使用此工具,通过选择任意一个单独的轴在单独的轴上进行缩放。

img/460089_1_En_3_Fig13_HTML.jpg

图 3-13

缩放小控件

在选择了立方体游戏对象的情况下缩放立方体会设置立方体的位置,或者当我们使用变换工具时它已经被移动了;现在是将位置设置或重置为 0,0,0 的好时机(图 3-14 )。

img/460089_1_En_3_Fig14_HTML.jpg

图 3-14

立方体游戏对象位置设置

现在我们需要将主摄像机定位在原点(0,0,0)。如果你看我的立方体的位置,这将意味着我们的相机将在我们的立方体的中间。所以,让我们先把立方体移开。将立方体变换位置设置为 0,0,1,然后将主摄像机移动到 0,0,0(图 3-15 )。现在立方体将看起来像是位于离我们的摄像机 1 米远的地方。

img/460089_1_En_3_Fig15_HTML.jpg

图 3-15

新的主摄像头设置

测试

现在是时候看看我们神奇的立方体在现实世界中是什么样子了。在为 iOS 开发时,我们需要使用 Xcode,然后才能测试或部署游戏。要在 iTunes 上发布一个 AR 游戏,我们需要将游戏提交给苹果公司进行审批,然后当它获得批准后,我们可以从 iTunes 商店下载它,并在我们的设备上查看它的外观。使用 Xcode,我们可以预览我们的游戏在我们的设备上将会是什么样子,但这仍然需要我们构建并运行游戏,并使用 Xcode 来预览游戏。正如你可能想象的那样,这是一次非常耗时(并且有点令人沮丧)的经历。Unity 前来救援,为我们提供了 Unity Remote。Unity Remote 是 iTunes app store 中适用于 iOS 设备的应用(或应用)。这个工具帮助我们在 iOS 设备上测试游戏,而不需要将游戏提交到 iTunes 商店。然而,在撰写本文时,Unity Remote(版本 5)还不支持 AR。Unity 的优秀人员考虑了这个挑战,并在 Unity ARKit 中加入了一个名为 UnityARKitRemote 的小程序。Unity ARKitRemote 为我们提供了在 iOS 设备上测试我们的 AR 项目所需的工具。

ARKit 遥控器

在项目文件夹中,键入搜索文本以找到 ARKit 远程预置(图 3-16 )。现在将这个文件拖到层次选项卡上(图 3-17 )。

img/460089_1_En_3_Fig17_HTML.jpg

图 3-17

层级中的 ARKitRemote 预设

img/460089_1_En_3_Fig16_HTML.jpg

图 3-16

搜索 ARKit 遥控器

设置主摄像机

现在在主相机设置中,将清除标志设置为仅深度(图 3-18 )。

img/460089_1_En_3_Fig18_HTML.jpg

图 3-18

将相机的清除标志设置为仅深度

添加组件

现在,我们将添加一个组件到我们的相机。在本例中,我们将添加 Unity AR 视频脚本。若要添加此脚本,请选择主摄像机,在检查器中选择“添加组件”。

在检查器中,您会看到一个您可以添加的可能组件的列表(图 3-18 )。您可能需要一段时间才能找到它,所以我建议您使用 Add Component 菜单中的搜索栏来查找我们正在寻找的脚本。在图 3-19 中,在搜索栏中,我搜索了视频。

img/460089_1_En_3_Fig19_HTML.jpg

图 3-19

搜索 Unity AR 视频脚本组件

找到 Unity AR 视频脚本后,选择它(单击鼠标),现在您应该会看到该组件已添加到主摄像机中(图 3-20 )。

img/460089_1_En_3_Fig20_HTML.jpg

图 3-20

添加到主摄像机的 Unity AR 视频脚本组件

在 Unity AR 视频脚本中,有一个属性叫做 Clear Material。我们将添加一种材料。在 Unity AR 视频脚本 Clear Materials 属性中,在属性框的右边,有一个小齿轮(图 3-19);如果您选择此档位,您将看到该项目文件夹中所有可用材料的列表(图 3-21 )。同样,您可以手动搜索,或者使用搜索栏。搜索 YUV 素材。我将在下一章更详细地介绍这种材料的作用以及我们为什么要使用它。

img/460089_1_En_3_Fig21_HTML.jpg

图 3-21

为透明材质选择 YUV 材质

追踪手机移动

为了让 AR 项目看起来真实,我们需要跟踪手机在现实世界中的移动,并在手机屏幕上投影虚拟物体的准确表示。Unity 的优秀员工(再次)让我们的生活变得更加轻松,在 Unity ARKit 中有一个名为 Unity AR Camera Manager 的脚本。按照我们添加 Unity AR 视频脚本的步骤,我们将添加 Unity AR 摄像机管理器。首先选择主摄像头,在检查器中选择添加组件(图 3-22);现在搜索 AR 摄像头管理器(图 3-23 ,并将其添加到主摄像头。

img/460089_1_En_3_Fig23_HTML.jpg

图 3-23

搜索 Unity AR 摄像机管理器

img/460089_1_En_3_Fig22_HTML.jpg

图 3-22

添加组件

将主摄像机添加到 Unity AR 摄像机管理器的跟踪摄像机属性是一个很好的做法;这将确保 AR 摄像机管理器使用正确的摄像机。但是,如果您不选择此项,Unity AR 相机管理器会为您选择。要将主摄像机添加到 Unity AR 摄像机管理器的摄像机属性中,请从层级中选择主摄像机,并将其拖动到 Unity AR 摄像机管理器的跟踪摄像机属性中(图 3-24 )。

img/460089_1_En_3_Fig24_HTML.jpg

图 3-24

将主摄像机设置为跟踪摄像机

构建并运行

现在我们已经准备好构建和运行我们的应用了。确保您已将 iOS 设备连接到 Mac,然后从 Unity 文件菜单中选择构建和运行(图 3-25 )。如果您还没有下载最新版本的 Xcode,您需要现在就下载(这需要一段时间)。

img/460089_1_En_3_Fig26_HTML.jpg

图 3-26

构建设置

img/460089_1_En_3_Fig25_HTML.jpg

图 3-25

选择构建和运行

在 Build setting 菜单中,首先选择您想要构建它的平台,在我们的例子中是 iOS。另外,选中“开发构建”复选框。最后,只选择您想要构建的场景非常重要。如果您的当前场景未列出,请单击添加开放场景按钮(图 3-26 )并取消选中任何其他场景。

从构建设置屏幕中,选择播放器设置图标。这将打开播放器设置的检查器,我们将在其中输入公司名称和产品名称(图 3-27 )。

img/460089_1_En_3_Fig27_HTML.jpg

图 3-27

播放器设置的检查视图

向下滚动菜单,找到捆绑标识符(图 3-26 )。需要注意的是,一旦您在 Xcode 中为个人团队注册了一个捆绑包标识符,以后就不能将同一个捆绑包标识符注册到另一个 Apple 开发者项目团队。这意味着当你使用一个免费的 Apple ID 和一个个人团队测试你的游戏时,你应该选择一个仅用于测试的捆绑包标识符——你将无法使用同一个捆绑包标识符来发布游戏。最好的解决方案是将“Test”添加到测试包标识符的末尾——例如,com . your company name . your appname Test。接受的字符是字母数字字符、句点和连字符。在我的例子中(图 3-28 ,我使用了 com。RottenEggProductions . hello world test 作为包标识符(您需要自己的名字)。如果您有一个签名团队 ID,您可能也想包括它。但是出于测试目的,这是不需要的。

img/460089_1_En_3_Fig28_HTML.jpg

图 3-28

在播放器设置中设置捆绑标识符

现在选择构建和运行图标。Unity 将提示您保存项目。学习编程入门课程时的传统是将我们的第一个应用命名为 Hello World(不要问我为什么)。因此,在这个传统中,我将把我的第一个 AR 应用命名为 Hello WorldAR。注意在图 3-29 中,我将它保存在我的 Unity 项目所在的文件夹中。有些人会认为这不是好的实践,但是现在已经足够好了。

img/460089_1_En_3_Fig29_HTML.jpg

图 3-29

保存 Hello WorldAR 菜单

保存文件后,Unity 将开始编译应用(图 3-28 ),并最终打开 Xcode(图 3-29 )。当 Xcode 打开时(图 3-31 ,确保你选择了正确的设备(iPhone 或 iPad),选择 play 按钮在你的设备上启动你的游戏(图 3-30 )。如果 Unity 报告任何错误,请确保在重试之前检查错误并解决这些问题。

img/460089_1_En_3_Fig31_HTML.jpg

图 3-31

x mode(x mode)-x mode(x mode)-x mode(x mode)(x mode)(x mode)(x mode)(x mode)(x mode)(x mode)(x mode)

img/460089_1_En_3_Fig30_HTML.jpg

图 3-30

Unity 编译我们的应用

您将被提示允许 Unity ARKit 访问您的相机,如果一切正常,您应该可以在现实世界中看到您的神奇立方体。在我的例子中,你可以看到我的神奇立方体投影在我的奥拉基山照片前面(图 3-32 )。

img/460089_1_En_3_Fig32_HTML.jpg

图 3-32

我的 Hello WorldAR 应用

拯救现场

现在是拯救我们现场的好时机。从文件菜单中,选择文件➤将场景另存为并将该场景命名为(图 3-33 )。我选择了 Hello WorldAR 作为这个场景的名字(图 3-34 )。

img/460089_1_En_3_Fig34_HTML.jpg

图 3-34

保存场景并选择其位置

img/460089_1_En_3_Fig33_HTML.jpg

图 3-33

将场景另存为菜单

理解场景

现在可能是讨论 Unity 场景和项目之间的区别的好时机。一个 Unity 项目包含了游戏或应用可能用到的所有场景和必要的代码。场景是项目的一个元素(或组件)。将项目想象成一部完整的电影,将场景想象成电影的一部分。在一个游戏中,这些场景可以是菜单、关卡、演职员表等等。

视觉惯性里程计简介

现在我们来看看更多的用于创建 AR 游戏的重要工具。在我们的 Hello WorldAR 项目中,我们创建了一个放置在 iPhone 摄像头前面的立方体,并在我们移动摄像头位置时保持在那里。摄像头怎么知道自己定位在哪里?你可能已经知道,iPhone 有一些很酷的方式来知道它的位置。我最常用的是加速度计。加速度计允许 iPhone 知道它在 3 个轴(X,Y,Z)上的位置。这对于在纵向和横向模式之间切换非常有用。我使用的另一个工具是指南针(或磁力计),你可能已经知道,这对导航非常有用。最后一个工具是陀螺仪。陀螺仪跟踪 iPhone 的旋转或扭曲。虽然这些都是很好的导航工具,但它们没有在 AR 中跟踪手机移动所需的精确度。为了跟踪增强现实所需的 iPhone 的运动,苹果最近在手机的摄像头中加入了一些技术。通过结合视觉信息(来自相机)和惯性信息(来自加速度计和陀螺仪),可以精确地测量 iPhone 的位置。

特征点

那么摄像头是如何追踪手机位置的呢?问得好!iPhone(目前是 iPhone 8 或更高版本)中的摄像头足够智能,可以识别现实世界中的关键点(或特征点),当摄像头移动时,可以跟踪这些点的位置。这个过程需要一些令人印象深刻的数学知识,但最近的 iPhones 有足够的处理能力来做到这一点。

点云

Unity ARKit 包括一个帮助手机识别物理世界特征点的预置。我们要使用的第一个是点云预置。

随着你的 Hello WorldAR 应用在 Unity 中打开,我们将创建一个空的游戏对象。从文件菜单中,选择游戏对象➤创建空白(图 3-35 )。

img/460089_1_En_3_Fig35_HTML.jpg

图 3-35

创建一个空的游戏对象

在检查器中选择空的游戏对象,将其重命名为点云。现在添加一个组件。在搜索栏中,搜索 Unity 点云示例,并将其添加到点云游戏对象中(图 3-36 )。

img/460089_1_En_3_Fig36_HTML.jpg

图 3-36

搜索点云示例

添加了 Unity 点云示例脚本后,现在将显示的最大点数设置为 120(图 3-37 )。您可以设置任意多的点云。

img/460089_1_En_3_Fig37_HTML.jpg

图 3-37

设置要显示的最大点数

现在我们需要添加一个点云粒子预置到点云。选择点云预置框右边的小齿轮,然后搜索预置(图 3-38 )。在点云粒子示例脚本中,选择点云预设并将其拖动到点云粒子预设框中(图 3-39 )。

img/460089_1_En_3_Fig39_HTML.jpg

图 3-39

设置为点云预设的点云预设

img/460089_1_En_3_Fig38_HTML.jpg

图 3-38

搜索点云预置

测试

现在我们要测试我们的点云。当我们测试我们的 Hello WorldAR 应用时,我们经历了构建应用的漫长(可能是乏味的)任务,在 Xcode 中启动它。然后终于可以在我们的 iOS 设备上看到我们的应用了。Unity 的优秀员工已经考虑到了这一点,并为我们创造了一种减少测试开发时间的方法。在 Unity ARKit 中,有一个场景可以让我们在 Unity 的游戏标签中预览构建。如果每次想预览开发都要经历使用 Xcode 的过程,那也没问题。然而,我将向您展示一种您可能重视的更有效的方法。

Unity ARKitRemote

因为 Unity Remote Connection 目前不支持 AR,所以我们需要在我们的 iOS 设备上构建和部署一个应用。Unity 的好人们在 Unity ARKit 中加入了一个叫做 ARKit Remote 的场景。您可以使用搜索栏在项目文件夹中找到它。在图 3-40 中,我使用了搜索字符串 remote。

img/460089_1_En_3_Fig40_HTML.jpg

图 3-40

搜索 UnityARKitRemote 场景

双击场景将其打开。如果您尚未保存对当前场景的任何更改,在 Unity 打开另一个场景之前,系统会提示您保存更改。你会看到这是一个非常简单的场景,由一个主摄像头和一个方向灯组成(图 3-41 )。

img/460089_1_En_3_Fig41_HTML.jpg

图 3-41

UnityARKitRemote

如果您在层级中选择主摄像机,您将看到主摄像机添加了几个脚本(图 3-42 )。这些脚本将使手机摄像头跟踪其位置,并使我们能够在 Unity 编辑器中看到相机视图。

img/460089_1_En_3_Fig42_HTML.jpg

图 3-42

主摄像机脚本

就像我们创建的 Hello WorldAR 应用一样,我们需要将这个应用部署到我们的手机上。从文件菜单中,选择文件➤构建设置(图 3-43 )。

img/460089_1_En_3_Fig43_HTML.jpg

图 3-43

选择构建设置

在构建设置菜单中,选择播放器设置菜单,并对产品名称和捆绑包标识符进行更改(图 3-44 )。

img/460089_1_En_3_Fig44_HTML.jpg

图 3-44

播放器设置的检查视图

注意,我已经将产品名改为 ARKitRemote,将包标识符改为 com。RottenEggProductions . ARKitRemoteTest(图 3-45 )。

img/460089_1_En_3_Fig45_HTML.jpg

图 3-45

捆绑标识符设置

确保您有正确的场景来构建,并从“构建”菜单中选择“构建并运行”。现在 Unity 将编译我们的应用并运行 Xcode,Xcode 将把它部署到我们的设备上(图 3-46 )。

img/460089_1_En_3_Fig46_HTML.jpg

图 3-46

我的 iPhone 上安装了 ARKitRemote

现在我们需要将 ARKit 连接预置添加到 Hello WorldAR 项目中。打开你的 Hello WorldAR 场景(双击)。

使用 ARKit 远程连接

在项目文件夹中,搜索一个名为 ARKitRemoteConnection 的预置(图 3-47 )。

img/460089_1_En_3_Fig47_HTML.jpg

图 3-47

搜索 UnityARKitRemoteConnection 预置

选择这个预设,并将其添加到场景中(将其拖动到层次中)(图 3-48 )。

img/460089_1_En_3_Fig48_HTML.jpg

图 3-48

场景中的 UnityARKitRemoteConnection

现在我们要在 iOS 设备上打开 ARKitRemote。在 Unity 中,打开 Hello World AR 场景,然后选择游戏选项卡并按下播放按钮。Unity 会在控制台菜单中提示你连接播放器(图 3-49 )。

img/460089_1_En_3_Fig49_HTML.jpg

图 3-49

Unity 连接到玩家消息

在控制台表中,选择编辑器并选择您的 iOS 设备(图 3-50 )。

img/460089_1_En_3_Fig50_HTML.jpg

图 3-50

在控制台菜单中选择 iOS 设备

然后 Unity 会提示你启动远程 ARKit 会话(图 3-51 )。在 Unity 中点击游戏屏幕上的图标,您的应用现在可以在您的 iOS 设备上运行。

img/460089_1_En_3_Fig51_HTML.jpg

图 3-51

启动远程 ARKit 会话提示

在图 3-52 中,你可以看到我已经成功地能够在我的 iPhone 上查看 Hello WorldAR 应用,并在 Unity 中看到场景。如果您移动您的设备,您应该在 Unity 场景选项卡中看到摄像机移动,在游戏选项卡中看到画面变化。我想指出的是,这会有点慢(滞后),但 ARKitRemote 是目前开发和测试 iOS 版 Unity AR 开发的最佳方式。

img/460089_1_En_3_Fig52_HTML.jpg

图 3-52

游戏视图中的立方体和点云

而点云系统对于识别非对称物体(如沙发)非常有用。如果我们使用 UnityARKit 中提供的另一个功能来帮助识别平面(如地板、墙壁或桌子),将会更加高效和有效。

平面可视化

首先,创建另一个包含所需脚本的空游戏对象。要创建一个空的游戏对象,从菜单中选择游戏对象➤创建空的(图 3-53 )。

img/460089_1_En_3_Fig53_HTML.jpg

图 3-53

创建一个空的游戏对象

选择游戏对象,在检查器中,命名这个创建的平面(图 3-54 )。

img/460089_1_En_3_Fig54_HTML.jpg

图 3-54

命名新游戏对象创建的飞机

现在我们需要添加一个组件。在创建的平面检查器中选择添加组件按钮,并在搜索栏中搜索 Unity AR 生成平面脚本(图 3-55 )。

img/460089_1_En_3_Fig55_HTML.jpg

图 3-55

搜索 Unity AR 生成平面脚本

Unity AR 生成的平面脚本包含在创建的平面游戏对象中,在 Unity AR 生成的平面脚本的平面预设设置中。选择选项框右侧的小齿轮,搜索并选择 DebugPlanePrefab(图 3-56 )。

img/460089_1_En_3_Fig56_HTML.jpg

图 3-56

搜索调试计划预设

测试

现在,将您的 iOS 设备连接到 Mac,运行 UnityARKitRemote 应用。现在 Unity 一致。在编辑器中连接到您的设备,然后单击播放按钮。使用您的 iOS 设备,转动相机以查看一个平面,您应该会在 Unity Game view 屏幕中看到您的点云和一个矩形(图 3-57 )。

img/460089_1_En_3_Fig57_HTML.jpg

图 3-57

点云和创建的平面

点云和创建的平面在我们创建的游戏中都很有用,可以从 iOS 摄像头中找到并跟踪参考点。如果你觉得自己很勇敢,你可以试着将最终版本部署到你的 iOS 设备上。然而,目前,我们的立方体还没有准备好真正使用相机的参考点跟踪。

摘要

在本章中,我们学习了如何使用 Unity ARKit 并配置我们的 iOS 设备来实时预览我们的应用和游戏。我们还学到了一些关于 Unity ARKit 如何追踪设备位置的理论。最后,我们使用了一些工具来帮助我们准确地跟踪设备的细微运动。

四、命中测试和照明

在上一章中,我们使用了云点和生成的平面来帮助相机跟踪设备的移动。然而,你可能已经注意到,我们惊人的立方体继续停留在原点。虽然这对于我们的第一个 AR 应用来说可能没什么问题,但我敢肯定,随着时间的推移,你可能会想要创建看起来位于现实世界中的物理对象上的虚拟对象。为了做到这一点,我们将使用 Unity ARKit 的一个名为 hit testing 的特性。你可能也注意到了,你的 iOS 设备屏幕上的 GameObject 的光照与现实世界中的光照并不一致;我们也将在本章中讨论这个问题。

点击测试

点击测试将使我们能够在我们在第三章创建的生成平面上放置一些东西。这也将使 AR 应用能够将对象放置在真实世界中的某个位置,该位置与用户在设备屏幕上点击的位置相关。

让我们打开我们在上一章创建的 Hello WorldAR 场景。随着你好世界 AR 场景在 Unity 中打开,现在在层级中选择创建的飞机游戏对象(图 4-1 )。

img/460089_1_En_4_Fig1_HTML.jpg

图 4-1

在层级中选择创建的平面游戏对象

在层级中选择创建的平面游戏对象,选择添加组件;并在搜索栏中搜索编辑器点击测试(图 4-2 )。现在选择它来添加到我们创建的飞机游戏对象中。该脚本将使我们能够在编辑器中测试点击测试的基本功能。

img/460089_1_En_4_Fig2_HTML.jpg

图 4-2

搜索编辑器点击测试

到现在为止,你可能很想在 AR 应用中加入一些比我们的立方体更有趣的东西。我们可以在资产库中搜索感兴趣的或相关的资产,或者我们可以创建自己的资产。由于制作我们自己的游戏资产非常耗时,超出了本书的范围,现在,让我们使用 Unity ARKit 中现有的资产之一。在项目文件夹中搜索资产播放器(图 4-3 )。如果你下载的 Unity ARKit 版本中没有这个 GameObject,可以从 Unity Asset Store(Asset Store)下载。Unity。com/packages/essentials/tutorial-projects/survival-shooter-tutorial-40756)。

img/460089_1_En_4_Fig3_HTML.jpg

图 4-3

搜索玩家游戏资产

选中该资产,将其拖至层级(图 4-4 )。

img/460089_1_En_4_Fig4_HTML.jpg

图 4-4

添加到层级中的玩家角色

现在是时候和我们神奇的立方体说再见了。在层次中选择立方体,右键单击并选择删除(图 4-5 )。

img/460089_1_En_4_Fig5_HTML.jpg

图 4-5

删除多维数据集

规模

你可能还记得,在第二章中,我讨论了规模在 AR 中的重要性。如果你在层级中选择玩家游戏对象,你会看到这个资产有 1 米高。这可能没问题,但我想让这个资产在现实世界中看起来小很多。我怀疑这是创建该资产的人的意图。选中玩家游戏对象,将比例改为 0.25,. 25,. 25(图 4-6 )。

img/460089_1_En_4_Fig6_HTML.jpg

图 4-6

重新缩放的玩家游戏对象

转换

如果你选择了主摄像头并查看摄像头预览窗口,你会注意到我们的玩家游戏对象对玩家是不可见的。如果您查看检查器或主摄像机和玩家游戏对象,您会看到这两个资源的位置都是 0,0,0。让我们移动玩家游戏对象。选择玩家,游戏对象,在检查器中改变位置到 0,0,1(图 4-7 )。

img/460089_1_En_4_Fig7_HTML.jpg

图 4-7

玩家游戏对象重新定位

你会注意到在图 4-7 中,玩家游戏对象正背对着摄像机。我认为如果玩家游戏对象面向玩家会更好。选择玩家游戏对象,使用旋转工具,在 Y 轴旋转玩家游戏对象,直到它面对主摄像机(图 4-8 )。

img/460089_1_En_4_Fig8_HTML.jpg

图 4-8

旋转玩家游戏对象

当旋转游戏对象时,也有可能无意中改变另一个轴。在图 4-8 中,注意 X 轴和 Y 轴的变换位置也发生了变化。让我们将 X 轴的位置重置为 0,将 Z 轴的位置重置为 1。我更喜欢整数,所以我将 Y 轴的旋转设置为 156(图 4-9 )。

img/460089_1_En_4_Fig9_HTML.jpg

图 4-9

旋转的玩家游戏对象

编辑点击测试脚本

现在选择创建的飞机游戏对象中的编辑器点击测试脚本。编辑器点击测试脚本有三个可变参数:点击变换、最大光线距离和碰撞层遮罩(图 4-10 )。

img/460089_1_En_4_Fig10_HTML.jpg

图 4-10

编辑器点击测试脚本

点击变换

点击变换参数框指定游戏对象的变换。在我们的例子中,这将是我们的玩家游戏对象的 x,y,z,它将被移动到玩家选择的位置。编辑器点击测试脚本目前不支持点击或触摸,因此在这种情况下,游戏对象将被放置在玩家在 Unity 编辑器的游戏标签中点击的位置。

在层级中选择玩家游戏对象,并将其拖至点击编辑器测试脚本中的点击变换属性框(图 4-11 )。

img/460089_1_En_4_Fig11_HTML.jpg

图 4-11

点击转换属性中的玩家游戏对象转换集

最大光线距离

在本练习中,我们不会更改最大光线距离。如果您有兴趣了解这个参数,互联网上有大量关于光线投射的信息。简而言之,这是一个投射不可见光线来检测光线路径上是否有任何东西(如对撞机)的过程。

碰撞层遮罩

碰撞层遮罩下拉菜单有几个选项(图 4-12 )。

img/460089_1_En_4_Fig12_HTML.jpg

图 4-12

碰撞层遮罩选项

我们将选择 ARKitPlane 选项。“碰撞层遮罩”选项设置在碰撞测试期间要考虑的碰撞层遮罩。在我们的例子中,我们将选择 ARKitPlane。

测试

现在将您的 iOS 设备连接到 Mac,并在您的设备上运行 UnityARKitRemote 应用。在 Unity 的控制台中,从编辑器中选择您的设备,然后按播放按钮。在游戏屏幕中,单击开始 ARKitRemote 图标,然后慢慢移动设备,以便相机找到合适的平面。当你在 Unity 的游戏选项卡中看到一个平面时,在那个平面内点击,你将在游戏视图屏幕中看到你的玩家头像(图 4-13 )。

img/460089_1_En_4_Fig13_HTML.jpg

图 4-13

游戏视图屏幕中的玩家游戏对象

在我们的设备上测试

现在我们已经成功地在编辑器中测试了我们的 AR 应用,是时候看看它在我们的设备上是什么样子了。您可能还记得,在我们的测试构建期间,我们添加了编辑器点击测试脚本。这个脚本对于在编辑器中测试我们的应用非常有用,但是我们发现,它不支持我们设备上的点击或触摸用户交互。如果我们想在我们的设备上测试应用,有一个更好的选择。

移除组件

要从创建的平面游戏对象中移除编辑器点击测试脚本组件,我们需要选择右边的档位(图 4-14 )。选择移除组件选项。

img/460089_1_En_4_Fig14_HTML.jpg

图 4-14

移除组件菜单选项

添加组件

现在让我们添加一个组件,它将在我们的设备上支持全功能的用户交互。在我们创建的飞机游戏对象的检查器中,选择添加组件按钮,并在搜索栏中搜索 hit(图 4-15 )。现在选择 Unity AR 点击测试示例脚本,将其添加到我们创建的平面游戏对象(4-16)中。

img/460089_1_En_4_Fig16_HTML.jpg

图 4-16

Unity AR 点击测试示例脚本添加到生成的飞机游戏对象

img/460089_1_En_4_Fig15_HTML.jpg

图 4-15

搜索 Unity AR 点击测试示例

添加点击转换

正如我们对编辑器点击测试示例所做的那样,我们需要添加点击转换参数。为此,选择玩家游戏对象并将其拖至 Unity AR 套件测试示例中的点击变换属性框(图 4-17 )。如果 ArKitPlane 未设置为碰撞层,请使用下拉菜单将其更改为 ARKitPlane。

img/460089_1_En_4_Fig17_HTML.jpg

图 4-17

添加到点击变换属性的播放器变换

准备部署

在构建和运行我们的新应用之前,我们需要更改构建设置。从菜单中选择文件➤构建设置(图 4-18 )。

img/460089_1_En_4_Fig18_HTML.jpg

图 4-18

选择构建设置

更改生成设置

在构建设置菜单中,检查你正在构建场景选项中的当前场景(Hello WorldAR)(图 4-19 )。

img/460089_1_En_4_Fig19_HTML.jpg

图 4-19

选择要构建的场景选项

选择播放器设置,并在检查器中更改产品名称和捆绑包标识符(图 4-20 )。

img/460089_1_En_4_Fig20_HTML.jpg

图 4-20

播放器设置检查器

在我们选择构建和运行之前,我建议首先打开 Xcode,并确保我们已经选择了目标设备,并在签名菜单中设置了团队(图 4-21 )。如果您现在不选择此项,您将会看到一条构建失败的消息。现在在构建设置菜单中。选择构建并运行。

img/460089_1_En_4_Fig21_HTML.jpg

图 4-21

Xcode 菜单签名团队选择框

在您成功构建应用并将其部署到您的 iOS 设备后,您应该能够运行该应用;当你点击设备上的屏幕时,你应该会看到你屏幕上的玩家游戏对象被放置在现实世界中的一个位置,这个位置与你点击屏幕的位置相关(图 4-22 )。

img/460089_1_En_4_Fig22_HTML.jpg

图 4-22

部署在 iPhone 上的 Hello WorldAR 应用

虽然我们的玩家游戏对象比我们的立方体有趣得多,但我们可以改进这个应用。如果我们观察玩家游戏对象的光照,光照与现实世界中的光照并不完全一致。我们将改变 AR 图像的照明,使其更接近真实世界中的照明。我的孩子认为我们应该将我们的玩家游戏对象重命名为梦魇追逐者,所以我们也将我们的玩家游戏对象重命名为梦魇追逐者。

更改玩家游戏对象名称

更改玩家游戏对象名称可以通过在层级中选择这个游戏对象,然后在检查器中选择当前名称并键入我们的新名称来完成(图 4-23 )。另一个选项是右击层级中的玩家游戏对象,从下拉菜单中选择重命名选项(图 4-24 )。

img/460089_1_En_4_Fig24_HTML.jpg

图 4-24

改变层级中玩家游戏对象的名称

img/460089_1_En_4_Fig23_HTML.jpg

图 4-23

在检查器中更改玩家游戏对象的名称

照明设备

你们中的一些人可能已经注意到了,噩梦追逐者的灯光与现实世界中的灯光并不一致。Unity 的优秀人员再一次为我们提供了解决方案(声明一下,我与 Unity 没有任何关系;我确实认为他们在 Unity ARKit 上做得很好。

关灯

我们将为我们的应用使用不同的光源。然而,为了获得最佳效果,让我们确保已经关闭了场景中的所有灯光。

从主菜单中选择窗口➤照明➤设置(图 4-25 )。

img/460089_1_En_4_Fig25_HTML.jpg

图 4-25

选择照明设置

在照明设置中,在环境设置中将强度乘数更改为零。在混合照明设置中,取消烘焙照明设置(图 4-26 )。

img/460089_1_En_4_Fig26_HTML.jpg

图 4-26

更改照明设置

现在选择平行光,在检查器中,改变颜色为白色。有许多方法可以改变颜色。首先在检查器中,选择颜色属性框,颜色选择器将会出现(图 4-27 )。在颜色选择器菜单中,有一个颜色选择器滚轮用于选择颜色。要使用此滚轮,请选择并拖动小颜色选择圆,直到找到您想要的颜色。在圆圈的中心,有一个正方形用于选择音调。一旦你选择了一个接近你想要的颜色,然后你可以使用正方形中的小圆圈来完善你的选择。这种方法可能适用于某些人,但我只需在属性框中输入我想要的颜色的 RGB 或 HSV 值(图 4-28 )。

img/460089_1_En_4_Fig28_HTML.jpg

图 4-28

键入颜色属性

img/460089_1_En_4_Fig27_HTML.jpg

图 4-27

使用色轮

设置环境光源

现在我们可以设置环境光源。选择方向灯,选择添加组件按钮并搜索环境(图 4-29 )。

img/460089_1_En_4_Fig29_HTML.jpg

图 4-29

搜索 Unity AR 环境组件

你会看到 Unity ARKit 还包含了一个名为 Unity AR Ambient 的脚本。选择这个脚本将其添加到我们的平行光中(图 4-30 )。

img/460089_1_En_4_Fig30_HTML.jpg

图 4-30

添加到平行光的 Unity AR 环境脚本

这个脚本估计了真实世界的照明,并将在我们的应用中对照明进行更改。这将使我们的应用看起来更真实。现在让我们在不同的光照条件下测试这个应用。现在,您应该已经知道如何构建和运行场景了。在我们这样做之前,我建议在播放器设置中做一个小小的改变。

构建和运行–版本控制

我是版本控制的超级粉丝。我认为在进行任何重大或微小的更改时,用不同的版本号保存我们的工作是一个好的做法。其实在写这本书的时候,我已经使用了版本控制。我有太多的系统崩溃的例子,无法恢复我正在工作的项目的最后版本。幸运的是,大多数时候,我有一个先前的版本可以使用,并且可以相对快速地恢复工作。

因为我们已经有了 Hello WorldAR Hit 测试的早期版本,所以我将用不同的版本号保存下一个测试。从主菜单中选择构建设置,然后选择播放器设置(图 4-31 )。在播放器设置的检查器中,向下滚动以查看识别设置,并在版本下将版本更改为 2.0。有些人可能认为版本应该是 1.1(因为这只是一个微小的变化),但是只要我们改变了版本号,那就是最重要的。

img/460089_1_En_4_Fig31_HTML.jpg

图 4-31

在检查器视图中更改版本标识

现在打开 Xcode,确保您已经登录,将您的 iOS 设备连接到 Mac,然后选择“构建并运行”。如果你的构建是成功的,你应该注意到在不同的光照条件下,应用中的光照会发生变化。

定位摄像机

你可能已经发现,即使我们小心地将我们的噩梦追逐者放置在面对玩家摄像头的位置,当我们在设备上运行应用时,他并不总是面对摄像头。噩梦追逐者的位置将取决于当你启动应用时你的 iOS 设备正对着哪里。虽然这是一本面向初学者的书,但我们将不得不编写一些代码。希望这对你来说不会太痛苦。这段代码将自动旋转我们的噩梦追逐者,使其在每次启动应用时都面对摄像机。

编辑 Unity AR 点击测试脚本

在层次结构中,选择创建的平面游戏对象;在检查员那里。在“脚本属性”框中选择 UnityARHitTestExample。这应该会在项目文件夹中找到并突出显示 UnityARHitTestExample.cs 脚本(图 4-32 )。

img/460089_1_En_4_Fig32_HTML.jpg

图 4-32

选择 UnityARHitTestExample.cs 脚本

如果你没有 Visual Studio 或 Mono developer 的副本,我强烈建议你下载一份并立即安装。虽然我们不会在整本书中写很多代码,但是如果你真的想为 iOS 开发 AR 游戏,那么你需要一个 IDE。

选中 UnityARHitTestExample.cs 脚本后,双击该文件,它应该会在您的 IDE (Visual Studio 或 MonoDevelop)中打开。在第 18 行,输入以下代码:

//Automatically Face the Camera
m_HitTransform.LookAt (Camera.main.transform.position);
m_HitTransform.eulerAngles = new Vector3 (0, m_HitTransform.eulerAngles.y, 0);

现在保存脚本并测试它,看看它是否能运行。//向代码添加注释,编译时会被忽略。如果您遇到任何运行时错误或代码 bug,只需注释掉这三行代码,它应该会运行(尽管,我们的梦魇追逐者不会自动定位,使其面向摄像机)。

摘要

在这一章中,我们学习了点击测试,这有助于我们的应用识别现实世界中的表面,并将游戏对象“放置”在这些表面上。我们还学习了如何改变灯光,使其与现实世界中的灯光一致。

五、制作 AR 游戏

现在你已经学会了使用 ARKit 的一些基础知识,并且掌握了 Unity,我们将开始制作一个 AR 游戏。在这个过程中,我们还将介绍 ARKit 的一些更高级的功能。

河豚保龄球游戏

现在是时候创建一个 AR 游戏了。我决定恢复我们在上一本书中创作的游戏,学习 iOS 游戏开发的 Unity(2017 年出版)。如果你是少数没有得到这本书的人之一,我们的游戏是 Fugu Bowl,这是一个适用于 iOS 设备的小型保龄球游戏。在我们的上一本书中,我们使用了 JavaScript,但对于 AR 版本,我们将使用 C#。虽然 JavaScript 是一种很棒的编程语言,但如果你打算继续使用 Unity,那么学习 C# 将会重要得多,也有价值得多。如果你不知道如何用 C# 编程,我强烈推荐你学习这种语言。这本书的重点是学习制作一个 AR 游戏,我就不重点教怎么用 C# 编程了。然而,我在代码中加入了注释,试图帮助不熟悉 C# 的人理解代码要做什么。

创建新场景

由于我们已经下载并安装了 Unity ARKit 包到我们的 AR 项目中,让我们继续使用它。通常,我更喜欢(也推荐)为每个新游戏创建一个新项目。然而,由于这将涉及到下载 Unity ARKit 包,这次我们就不做了。

要创建一个新场景,从主菜单中选择文件➤新场景(图 5-1 )。使用快捷键(⌘-N)可能更有效,我还将为那些喜欢使用快捷键的读者提供常用命令的快捷键。

img/460089_1_En_5_Fig1_HTML.jpg

图 5-1

创建新场景

让我们保存我们的场景。从主菜单中选择文件➤将场景另存为(图 5-2 )。

img/460089_1_En_5_Fig2_HTML.jpg

图 5-2

将场景另存为

你将看到另存为对话框(图 5-3 )并输入我们场景的名称。我已经决定将这个游戏命名为 Fugu BowlAR(看到我在那里做了什么吗?).

img/460089_1_En_5_Fig3_HTML.jpg

图 5-3

将场景保存为 Fugu BowlAR

选择“保存”以保存该场景。您会注意到该文件现在保存在 Assets 文件夹中。我相信在软件开发中,最好是组织良好的(有些人可能称之为强迫症)。因此,这个场景可能应该保存在场景文件夹中。在项目文件夹中,选择河豚鲍拉尔场景(图 5-4 )并将其拖动到场景文件夹中(图 5-5 )。

img/460089_1_En_5_Fig5_HTML.jpg

图 5-5

场景项目文件夹中的 Fugu BowlAR

img/460089_1_En_5_Fig4_HTML.jpg

图 5-4

在项目资源文件夹中选择 Fugu BowlAR 场景

创建 AR 资产

你可能记得创建我们的惊人的立方体,我们将重复这个过程。首先,我们要创造一个惊人的保龄球。我们可能会在网上或 Unity Asset Store 中找到一个非常棒的游戏,但我非常喜欢在我有时间但没有预算支付给比我更有艺术天赋的人来为我创建自己的游戏资产(我的艺术天赋非常有限)。

在主菜单中,选择游戏对象➤ 3D 对象➤球体(图 5-6 )。

img/460089_1_En_5_Fig6_HTML.jpg

图 5-6

场景中的球体游戏对象

让我们改变一些属性。第一个任务是重命名这个游戏对象。我将把这个游戏命名为 BowlingBall。选择球体游戏对象,在检查器中,选择游戏对象名称(图 5-7 )并选择当前文本,键入我们的新名称(图 5-8 )。

img/460089_1_En_5_Fig8_HTML.jpg

图 5-8

球体游戏对象重命名为保龄球

img/460089_1_En_5_Fig7_HTML.jpg

图 5-7

选定的球体游戏对象

变换保龄球

您可能还记得,在 Unity 中,我们使用公制。这意味着我们的保龄球游戏对象将是 1 米,1 米,1 米。我没有花很多时间打保龄球,但即使我知道这将是一个非常大的保龄球。让我们调整它的大小(缩放)并将保龄球放在原点(0,0,0)。

首先,选择刻度并输入以下刻度设置 0.25、0.25、0.25。现在让我们将变换位置设置为 0,0,0(图 5-9 )。

img/460089_1_En_5_Fig9_HTML.jpg

图 5-9

重新定位和重新缩放保龄球

添加刚体

当我们创建我们的立方体时,它漂浮在空中,这很酷。但是当我们希望球在真实世界的地板上滚动时,我们需要添加一个刚体组件。刚体组件提供刚体模拟,模拟不变的形状如何对力和碰撞做出反应。我们希望我们的保龄球游戏对象对重力做出反应(保持在地板上,我们还将对它施加一些力,使它移动)。最后,我们希望它与我们的保龄球瓶相撞。因此,我们需要添加一个刚体组件到我们的保龄球。

在层级视图中选择 BowlingBall,在检查器中,选择添加组件(图 5-10 )。

img/460089_1_En_5_Fig10_HTML.jpg

图 5-10

添加组件

在“添加组件”菜单中,有一个搜索栏。在搜索栏中,键入 Rigid 并选择刚体组件(图 5-11 )。

img/460089_1_En_5_Fig11_HTML.jpg

图 5-11

搜索刚体组件

刚体组件的默认设置非常好,但是 1 千克的质量对于保龄球来说有点轻。让我们把质量设为 5,因为 5 公斤,对于一个保龄球来说是合适的。其他的设置现在很好(但是我们可能需要在测试后调整这些设置)。图 5-12 显示保龄球的设置。

img/460089_1_En_5_Fig12_HTML.jpg

图 5-12

保龄球刚体设置

在图 5-12 中,我们可以看到我们的保龄球有一个组件叫做球体碰撞器。碰撞器组件为我们的游戏对象提供了碰撞形状。在这种情况下,当我们创建我们的球体游戏对象时,还添加了一个球体形状的碰撞器。碰撞器组件将决定一个游戏对象将在什么点碰撞。但是,碰撞器并不决定它将如何碰撞(反弹、滑动或根本不移动)。为了设置游戏对象如何对碰撞做出反应,我们需要添加一个物理材质。要获得物理材料,我们需要从 Unity Store 下载 Unity Standard Assets 包(我们可以在第一次创建它时将其添加到我们的项目中)。资产商店中还有其他可用的物理材料,其中一些是免费的,其他的则需要付费。

打开资产商店

选择资产存储视图选项卡以显示资产存储(图 5-13 )。在搜索栏中,键入标准资产。如果您想添加过滤器以仅显示自由资产,这将限制搜索结果(图 5-14 )。

img/460089_1_En_5_Fig14_HTML.jpg

图 5-14

搜索标准资产(免费)

img/460089_1_En_5_Fig13_HTML.jpg

图 5-13

Unity 资产商店视图

选择标准资产包,这将打开该资产包的信息屏幕(图 5-15 )。选择 Install(或 Update,如果您在创建项目时已经安装了它)。

img/460089_1_En_5_Fig15_HTML.jpg

图 5-15

包裹信息屏幕

几分钟后(取决于你的下载速度),Unity 会打开导入 Unity 包菜单(图 5-16 )。虽然我们不需要所有这些资产,但我们只需选择 Import(我们可以随时删除任何我们不需要或以后不想要的东西)。

img/460089_1_En_5_Fig16_HTML.jpg

图 5-16

Unity 导入包屏幕

几分钟后,包将被导入,您将在您的项目文件夹中看到一些额外的资产(图 5-17 )。

img/460089_1_En_5_Fig17_HTML.jpg

图 5-17

项目文件夹中的 Unity 标准资产包

如果我们选择 PhysicsMaterials 文件夹,我们可以看到现在我们有一系列物理材料可供选择(图 5-18 )。

img/460089_1_En_5_Fig18_HTML.jpg

图 5-18

Unity 标准资产包物理材料文件夹

物理材料

标准资产包为我们提供了一个物质基础。然而,它们都没有为我们的保龄球提供最好的物理材料。现在,让我们使用木质材料。因为我们可能需要在游戏的另一部分使用这个材料,所以让我们复制它。从主菜单中选择“编辑➤副本”(或 Command+D)。现在在项目文件夹中,选择复制的 PhysicsMaterial (Wood 1)并将其重命名为 Ball(图 5-19 )。

img/460089_1_En_5_Fig19_HTML.jpg

图 5-19

选择球物理材料

现在,在选择保龄球游戏对象和层次结构中,选择球体碰撞器组件中材质属性的属性框旁边的小齿轮,然后选择我们刚刚创建的球物理材质(技术上是复制的)(图 5-19 )。在“项目”选项卡中,双击“球物理”材质以设置物理属性。将动态摩擦力设置为 1,静态摩擦力设置为 1,弹力设置为 0,摩擦力组合为最大,弹力组合为最小(图 5-20 )。

img/460089_1_En_5_Fig20_HTML.jpg

图 5-20

设置球的物理材质属性

创建(临时)平面

如果我们现在测试我们的游戏,我们会看到我们的球掉下来(并且永远不会停止)。虽然,我们将使用真实世界的表面,现在,让我们安装一个临时的平面游戏对象来帮助我们在游戏视图中测试我们的游戏。

从主菜单中,选择游戏对象➤ 3D 对象➤平面(图 5-21 )。在层次中选择平面,并将其重命名为 Plane(t)。如果你在场景视图中查看,你会注意到该平面已在原点创建,因此,穿过我们的保龄球。让我们重新定位我们的飞机(t),让它正好位于保龄球的下面(图 5-22 )。

img/460089_1_En_5_Fig22_HTML.jpg

图 5-22

平面(t)变换设置

img/460089_1_En_5_Fig21_HTML.jpg

图 5-21

创建一个平面

如果我们看场景视图,平面(t)和保龄球的颜色是相同的。让我们改变飞机(t)的颜色。在项目文件夹中搜索素材(图 5-23 ,你会看到有几个我们可以使用的资产;我将为飞机(t)使用球材料。有几种方法可以改变材质属性,但最简单的是在场景视图中选择球体材质并将其拖放到平面(t)上(图 5-24 )。

img/460089_1_En_5_Fig24_HTML.jpg

图 5-24

球料所在的平面(t)

img/460089_1_En_5_Fig23_HTML.jpg

图 5-23

搜索球料

现在,让我们添加一些大头针(或彩虹糖,取决于你来自哪里)。如果我们在资产商店中寻找保龄球瓶,我们会发现唯一的选择是有偿资产。然而,我们在谷歌的好朋友在 https://poly.google.com/ 上有一个奇妙的 AR 和 VR 资产库。用你最喜欢的浏览器打开这个站点,搜索大头针。你会发现有几个不错的选择(图 5-25 )。

img/460089_1_En_5_Fig25_HTML.jpg

图 5-25

在 Google Poly 中搜索图钉

选择您要使用的 Pins 我将使用谷歌保利的保龄球瓶。如果我们检查许可证,我们可以看到它在知识共享许可下是可用的,这允许我们使用它(更多细节见 https://creativecommons.org/ )。选择下载链接,并选择 OBJ 下载此图像。当你在谷歌聚合页面上的时候,查看一些令人惊奇的内容。

将 OBJ 文件导入 Unity

文件下载完成后,打开保存文件的文件夹,右键单击(或双击)解压文件夹(图 5-26 )。在文件夹中,你会看到有一个 OBJ 文件(这是我们需要的)。现在在 Unity 中,从主菜单“资产”“➤”“导入新资产”,浏览到带有 Pin OBJ 文件的解压缩文件夹,选择 OBJ 文件,然后选择“导入”。

img/460089_1_En_5_Fig26_HTML.jpg

图 5-26

解压缩 Bowling_Pin.obj 文件夹

Unity 完成导入该资产后,它将出现在资产文件夹中(图 5-27 )。我将创建一个新文件夹来保存我可能会用到的任何导入的图片。如果在“资产”文件夹中没有找到该资产,请确保在“项目视图”选项卡中进行搜索。

img/460089_1_En_5_Fig27_HTML.jpg

图 5-27

资产文件夹中的 Bowling_Pin 资产

创建新的项目文件夹

要在项目视图中创建新文件夹,在项目文件夹中右击并从菜单中选择并选择创建➤文件夹(图 5-28 )。

img/460089_1_En_5_Fig28_HTML.jpg

图 5-28

创建新的项目文件夹

Unity 将在 Assets 项目文件夹中创建文件夹,现在我们需要命名它并将我们的 Bowling_Pin 资产拖放到这个文件夹中。我将把这个文件夹命名为艺术资产(图 5-29 )。

img/460089_1_En_5_Fig29_HTML.jpg

图 5-29

包含 Bowling_Pin 资源的“艺术资源”文件夹

将保龄球瓶添加到场景中

选中 Bowling_Pin 资产,将其拖动到层次(或场景视图)(图 5-30 )。你会注意到,我们再次需要转换这个游戏对象的位置和比例。

img/460089_1_En_5_Fig30_HTML.jpg

图 5-30

层次结构中的保龄球瓶

变换 Bowling_Pin 和 BowlingBall 的设置

让我们首先缩放我们的 Bowling_Pin,因为它当前设置为 1,1,1 的比例。然而,正确的尺寸是 121 毫米宽(最宽处)和 380 毫米高。让我们将 Bowling_Pin 缩放到 0.4,0.4,0.4。这不是完美的比例,但看起来很好。让我们也按相对比例缩放保龄球。根据维基百科,保龄球的周长可以在 67.83 厘米和 68.59 厘米之间,直径在 21.59 厘米到 21.83 厘米的范围内。让我们将保龄球级别设置为 0.1,0.1,0.1。这不是完全成比例的,但现在已经足够好了。图 5-31 显示我的保龄球在我的保龄球瓶旁边。(在我看来)它们看起来相当不错。

img/460089_1_En_5_Fig31_HTML.jpg

图 5-31

重新缩放保龄球和保龄球瓶的游戏视图

向 Bowling_Pin 添加刚体

我们将遵循同样的过程添加刚体和物理材料到保龄球瓶,就像我们处理保龄球一样。在层级中选择 Bowling_Pin,在检查器中选择添加组件,搜索并添加一个刚体组件(图 5-32 )。

img/460089_1_En_5_Fig32_HTML.jpg

图 5-32

带有刚体组件的 Bowling_Pin 游戏对象

向 Bowling_Pin 添加碰撞器

如果我们看看 Bowling_Pin 的检查员,你会注意到没有碰撞器。这是因为它没有配备碰撞器,因为它是非凸形的。我们要添加一个对撞机,这样我们就可以添加一种物理材料。选中 Bowling_Pin,在检查器中选择添加组件并搜索网格(图 5-33 )。

img/460089_1_En_5_Fig33_HTML.jpg

图 5-33

搜索网格碰撞器组件

现在,选择并添加网格碰撞器组件。网格碰撞器将使我们能够创建一个包围游戏对象的网格。在我们刚刚添加的网格碰撞器组件中,有一个属性框供我们设置想要使用的网格类型。网格碰撞器组件使我们能够添加凸形网格(圆柱体、立方体、球体或平面)。因为我们的 Bowling_Pin 最接近圆柱体形状,所以让我们搜索一个圆柱体网格并将其添加到 Bowling_Pin 游戏对象中。选择网格碰撞器网格设置属性框右边的小齿轮,搜索圆柱体(图 5-34 )。选择圆柱体网格,将其设置为网格碰撞器的形状(图 5-35 )。还要注意,我已经将刚体组件设置为运动学组件。

img/460089_1_En_5_Fig35_HTML.jpg

图 5-35

将圆柱体网格设置为网格碰撞器

img/460089_1_En_5_Fig34_HTML.jpg

图 5-34

搜索圆柱体网格

将物理材质添加到保龄球瓶

就像我们为保龄球所做的一样,我们需要添加一个物理属性来设置保龄球瓶如何对碰撞做出反应。由于保龄球瓶的物理属性类似于保龄球,让我们复制球的物理材质,并将其重命名为 bowling pin,并更改设置。

首先,选择并复制球物理材质,并将其命名为 BowlingPin(图 5-36 )。选择 BowlingPin PhysicsMaterial 并将设置更改为以下内容;动摩擦= 1,静摩擦= 1,弹性= 0.5,摩擦结合=最大,弹跳结合=最小(图 5-37 )。

img/460089_1_En_5_Fig37_HTML.jpg

图 5-37

BowlingPin 物理材质设置

img/460089_1_En_5_Fig36_HTML.jpg

图 5-36

保龄球瓶的物理材料

现在将 BowlingPin PhysicsMaterial 添加到 BowlingPin 游戏对象网格碰撞器中(图 5-38 )。

img/460089_1_En_5_Fig38_HTML.jpg

图 5-38

将 BowlingPin 物理材质设置为材质

让保龄球滚动

为了让我们的 Bowling_Ball 根据玩家的输入滚动,我们需要创建一个脚本。正如我已经指出的,这不是一本介绍性的编程书籍,所以我不会花太多时间去探究每一行代码的目的。可能有一些我认为值得注意的重要代码部分,我将在脚本中包含注释来解释这些代码行的目的。让我们首先创建一个文件夹来保存我们所有的脚本。在项目视图中,单击鼠标右键并选择“创建➤文件夹”。让我们给这个脚本命名(图 5-39 )。您可能希望将此文件夹命名为非常有趣或酷的东西,但是使用文件命名约定是一种很好的做法,这样,如果其他人需要编辑或修改您的游戏,他们可以很容易地确定在项目中的何处可以找到资源。

img/460089_1_En_5_Fig39_HTML.jpg

图 5-39

脚本文件夹

现在,我们将创建一个脚本来测试 Unity 中的用户输入。因此,我们将让保龄球游戏对象根据键盘(或鼠标)输入移动。我们稍后将更改这一点,以便输入基于触摸、点击或滑动。在层次结构中,选择我们的保龄球游戏对象,然后选择添加组件。在添加组件中,选择新脚本(图 5-40 )。首先,让我们将这个脚本命名为 PlayerController,并选择 Create and Add。这个选项使我们能够创建脚本并将其添加到保龄球游戏对象中。Unity 会将该脚本放在资产文件夹中。我们需要选择并移动(拖放)这个脚本到我们的脚本菜单(图 5-41 )。

img/460089_1_En_5_Fig41_HTML.jpg

图 5-41

添加到脚本文件夹中的 PlayerController 脚本

img/460089_1_En_5_Fig40_HTML.jpg

图 5-40

添加新的脚本组件

编辑 PlayerController 脚本

现在让我们编辑 PlayerController 脚本。如果选择 PlayerController 脚本,可以在检查器中看到该资源的代码。让我们编辑这段代码。双击 PlayerController 脚本,这将打开您的默认 IDE。我用的是 Visual Studio。输入如下代码,如清单 5-1 所示。

using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {public float speed;private Rigidbody rb;void Start (){rb = GetComponent<Rigidbody>();}void FixedUpdate (){float moveHorizontal = Input.GetAxis ("Horizontal");float moveVertical = Input.GetAxis ("Vertical");Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);rb.AddForce (movement * speed);}
}Listing 5-1The PlayerController Script

现在我们准备看看我们的代码是否有效。如果我们运行并测试我们的游戏,当我们按下任一箭头键时,保龄球会向任一方向移动(这很好,因为我们只需要球向一个方向移动)。但是,你会注意到 Bowling_Pin 上的碰撞器太大了,碰撞不真实。现在,我们可以编辑这个碰撞器,但是我们要创建我们自己的碰撞器。

创造我们自己的对撞机

为了创建我们自己的碰撞器,我们将使用一点游戏设计魔法(也称为伪装)。为此,在层级中选择 Bowling_Pin 游戏对象,并在网格碰撞器组件中选择小齿轮,右键单击并移除当前碰撞器(图 5-42 )。现在从主菜单中,选择游戏对象➤ 3D 对象➤胶囊(图 5-43 )。

img/460089_1_En_5_Fig43_HTML.jpg

图 5-43

创建 3D 胶囊游戏对象

img/460089_1_En_5_Fig42_HTML.jpg

图 5-42

添加到脚本文件夹中的 PlayerController 脚本

你会注意到我们的胶囊游戏对象有点大,因此,我们需要改变比例。还要注意,太空舱有自己的碰撞器。在图 5-44 中,我已经变换了比例和位置,所以它和 Bowling_Pin 的高度和宽度差不多。

img/460089_1_En_5_Fig44_HTML.jpg

图 5-44

重新缩放和重新定位的胶囊

现在我们在胶囊中加入一种物理材料,这样它就能对保龄球的力量做出反应。现在,让我们使用 BowlingPin 物理材料。选中胶囊,在检查器中,选择材质属性框旁边的小齿轮,右键单击并添加 BowlingPin PhysicsMaterial(图 5-45 )。

img/460089_1_En_5_Fig45_HTML.jpg

图 5-45

添加 BowlingPin 物理材质

选中胶囊游戏对象,让我们给它起一个有意义的名字。我选 BowlingPinCollider。

现在我们已经移动了 BowlingPinCollider,使它完全覆盖 Bowling_Pin 游戏对象,下一步是使它对玩家不可见。要使 BowlingPinCollider 游戏对象对玩家不可见,在层级中选择 BowlingPinCollider 游戏对象,并在检查器的网格渲染器组件中,选择右侧的齿轮并选择移除组件(图 5-46 )。

img/460089_1_En_5_Fig46_HTML.jpg

图 5-46

移除网格渲染器组件

记住父母

你可能还记得在这一章的前面,我讨论了软件开发中的父母和孩子。我们将使保龄球瓶成为保龄球瓶碰撞器的子代。这样,保龄球瓶碰撞器发生的事情也会发生在保龄球瓶上。

成为父母

成为父母是我一生中最激动人心也最令人生畏的经历之一。幸运的是,Unity 使得创建一个父游戏对象的过程不那么令人生畏(可能也不那么令人兴奋)。要使我们的 BowlingPinCollider 成为 Bowling_Pin 游戏对象的父对象,我们只需将 Bowling_Pin 游戏对象拖动到 BowlingPinCollider,它将成为 BowlingPinCollider 的子对象(图 5-47 )。要是生活有那么简单就好了。

img/460089_1_En_5_Fig47_HTML.jpg

图 5-47

BowlingPinCollider 作为 Bowling_Pin 的父级

现在让我们测试我们的工作,看看我们的碰撞器是否做了它应该做的。咳,我的对撞机工作了(图 5-48 )。但是 BowlingPinCollider 父代和子代 Bowling_Pin 仍然没有倒下。老实说,这很大程度上反映了我在现实生活中的保龄球能力。然而,我认为如果玩家不能打翻保龄球瓶,他们会有点沮丧。所以,让我们做一些改变,使它更真实一点。

img/460089_1_En_5_Fig48_HTML.jpg

图 5-48

碰撞的游戏视角

使保龄球瓶翻倒

如果你的保龄球瓶没有倒下,检查每个游戏物体上的刚体组件。在我的设置中,我已经将保龄球的刚体组件的质量设置为 5(即保龄球为 5 kg)。我已经把保龄球瓶设定为 1 公斤。从技术上讲,保龄球瓶应该重 1.6 公斤。因此,我将保留我的设置。如果你的保龄球没有让保龄球瓶倒下,试着调整重量。玩家永远不会亲自捡起它们,也永远不会知道确切的重量。另外,在游戏设计中,过分强调现实有时很有趣。

img/460089_1_En_5_Fig49_HTML.png

图 5-49

保龄球和保龄球瓶刚体组件

摘要

在这一章中,我们已经创建了一个新的场景并添加了游戏对象。我们添加了刚体组件和物理材料。我们已经成功地测试了我们的游戏,看看它是否能在游戏视图中工作。在下一章中,我们将在 AR 中测试游戏,看看它看起来如何。

六、触摸介绍

在 AR 中测试游戏

在上一章中,我们能够在 Unity 游戏视图中测试我们的游戏;现在,让我们看看游戏在 AR 中会是什么样子。随着 FuguBowlAR 游戏在 Unity 中打开,让我们将 Unity AR 相机管理器添加到我们的主相机中。在层次中选择主摄像机,然后在检查器中选择添加组件(图 6-1 )。在添加组件搜索栏中,搜索 Camera 并选择 Unity AR Camera Manager(图 6-2 )。

img/460089_1_En_6_Fig2_HTML.jpg

图 6-2

添加 Unity AR 摄像机管理器组件

img/460089_1_En_6_Fig1_HTML.jpg

图 6-1

添加组件

添加了 Unity AR 摄像机管理器组件后,现在从层级中选择并拖动主摄像机,并将其添加到 Unity AR 摄像机管理器组件的摄像机属性框中(图 6-3 )。

img/460089_1_En_6_Fig3_HTML.jpg

图 6-3

将主摄像机添加到摄像机属性

现在,随着 Unity AR Camera Manager 组件添加到主摄像头,让我们使用我们安装在设备上的 Unity AR Kit Remote 应用来预览游戏在游戏视图中的外观。首先,将设备连接到 Mac,然后在设备上启动 Unity AR Kit Remote 应用。在 Unity 中,选择控制台视图并选择编辑器,然后选择您的设备(图 6-4 )。现在,从 Unity 游戏视图中选择播放按钮,然后在游戏视图中,选择(图 6-5 )。你应该在 Unity 的游戏视图中看到游戏正在运行(图 6-6 )。

img/460089_1_En_6_Fig6_HTML.jpg

图 6-6

AR 版本的游戏视图

img/460089_1_En_6_Fig5_HTML.jpg

图 6-5

启动远程 ARKit 会话

img/460089_1_En_6_Fig4_HTML.jpg

图 6-4

连接到 iPhonePlayer

一些挑战

你会注意到我们的游戏有几个挑战。首先,不出所料,保龄球不动。这是因为我们最初设置 BowlingBall 代码来响应键盘输入。我们这样做是有意的,因为 Unity 游戏视图(目前)不允许我们用触摸来测试用户迭代。另一个挑战是我们的平面(t)仍然可见。我们先禁用飞机(t)。我现在不想删除它,因为我以后可能会用它来测试。

禁用飞机(t)

禁用平面(t)游戏对象相对简单。在层次视图中,选择平面(t)游戏对象,然后在检查器中,选择游戏对象名称左侧的复选框(图 6-7 )。您将立即看到飞机(t)游戏对象不再可见。当我们测试我们的游戏时,这种影响将会清晰可见。

img/460089_1_En_6_Fig7_HTML.jpg

图 6-7

飞机(t)游戏对象被禁用

测试

要测试我们的游戏,有两种方法。第一个也是最有效的方法是在游戏视图中测试它。为此,我们需要禁用添加到摄像机的 Unity AR 摄像机管理器组件。选择主摄像机,然后取消选择文件名左边的复选框(图 6-8 )。

img/460089_1_En_6_Fig8_HTML.jpg

图 6-8

取消选择 Unity Camera Manager

现在按下 play 按钮,您应该会看到保龄球和 Bowling_Pin 下降到无穷大(很可能超过无穷大)。

测试我们游戏的第二种方法是选择 Unity AR Camera manager,将我们的设备连接到 Mac,然后在我们的设备上运行 Unity AR Kit Remote 应用。然后在控制台选项卡中,选择我们的设备并选择 Unity 中的播放按钮。选择播放按钮后,会出现启动 ARKit 远程会话提示,游戏预览会出现在 Unity 游戏选项卡中。然而,保龄球和保龄球瓶游戏对象又一次下落,并继续下落。

实现触摸控制

现在,我们将尝试让 Bowling_Ball 对用户在设备上触摸屏幕做出响应。多年来,Unity 在如何使用带触摸控制的设备管理用户输入方面做出了许多改变。在我的例子中,我将使用 Unity CrossPlatformInput 管理器,这是我写这本书时管理多种形式输入(包括触摸)的方法。

导入 Unity CrossPlatformInput 包

让我们导入 Unity CrossPlatformInput 包。从菜单中选择资产➤导入包➤交叉平台输入(图 6-9 )。

img/460089_1_En_6_Fig9_HTML.jpg

图 6-9

导入 Unity CrossPlatformInput 包

文件将被下载,完成后将打开导入 Unity 软件包实用程序(图 6-10 )。虽然我们不需要所有这些内容,但我们还是选择 Import。导入 Unity 软件包实用程序现在将添加完整的软件包。

img/460089_1_En_6_Fig10_HTML.jpg

图 6-10

导入 Unity CrossPlatformInput 包

添加触摸控制

现在我们要创建一个图形用户界面(或 GUI ),以便玩家可以通过触摸屏幕来控制保龄球。由于我们正在创建一个增强现实版的河豚碗,我们需要做一些不同的事情。我们将创建一个游戏杆控制器,并把它放在屏幕上,这样玩家可以在 X 轴和 Y 轴上移动保龄球。现在,我不怎么打保龄球,但即使是我也知道这不是我们通常控制保龄球的方式。

下载操纵杆资源包

首先,我们需要一些好的资产,所以我们去 Unity 资产商店买些东西。在 Unity Asset store 选项卡中,从搜索栏中搜索操纵杆(图 6-11 )。如果你想添加免费的唯一过滤器,这可能会节省你一些时间。

img/460089_1_En_6_Fig11_HTML.jpg

图 6-11

搜索操纵杆包资源包

选择操纵杆包资源包(带有绿色图标的那个)并选择导入(图 6-12 )。

img/460089_1_En_6_Fig12_HTML.jpg

图 6-12

导入操纵杆资产包

从 Unity 导入软件包实用程序中,选择导入全部(图 6-13 )。

img/460089_1_En_6_Fig13_HTML.jpg

图 6-13

导入 Unity 软件包实用程序

创建画布

在 Unity 中创建一个 UI,我们需要创建一个画布。在层次结构中,右键单击并选择 UI ➤画布(图 6-14 )。

img/460089_1_En_6_Fig14_HTML.jpg

图 6-14

创建画布

当我们创建画布时,Unity 还添加了 EventSystem GameObject(图 6-15 )。EventSystem 是 Unity 目前处理 UI 事件的方式。

img/460089_1_En_6_Fig15_HTML.jpg

图 6-15

事件系统游戏对象添加到层次

将操纵杆 UI 添加到画布

现在我们将把固定游戏杆预置从项目标签中的虚拟游戏杆文件夹移动到画布上。为此,在项目选项卡中,搜索固定(图 6-16 )并选择固定操纵杆预置,然后将其拖动到层次结构中的画布文件夹(图 6-17 )。一旦添加,你实际上可以测试操纵杆,看看它的行动。它不会移动我们的保龄球;为此,我们需要添加一个脚本。

img/460089_1_En_6_Fig17_HTML.jpg

图 6-17

添加到画布上的固定操纵杆预置

img/460089_1_En_6_Fig16_HTML.jpg

图 6-16

搜索固定操纵杆预置

添加脚本

在层次中,选择保龄球游戏对象,并在检查器中,禁用或移除玩家控制器脚本。要移除播放器控制器脚本组件,在检查器中右键单击播放器控制器脚本组件右侧的小齿轮,并选择移除组件(图 6-18 )。

img/460089_1_En_6_Fig18_HTML.jpg

图 6-18

删除播放器控制器脚本组件

现在在项目选项卡中,搜索并选择 PlayerExample 脚本(图 6-19 )并将该脚本拖动到保龄球游戏对象上(图 6-20 )。

img/460089_1_En_6_Fig20_HTML.jpg

图 6-20

添加到保龄球的球员示例脚本

img/460089_1_En_6_Fig19_HTML.jpg

图 6-19

搜索 PlayerExample 脚本

在你做其他事情之前,确保速度已经设定好。从层次结构中,选择固定的 Joysick 游戏对象(图 6-21 )并将其拖动到保龄球游戏对象的玩家示例组件的游戏杆属性框中(图 6-22 )。我已经把速度调到了 5。这可能有点快,但是我们可以在以后改变它。

img/460089_1_En_6_Fig22_HTML.jpg

图 6-22

设置移动速度和操纵杆属性

img/460089_1_En_6_Fig21_HTML.jpg

图 6-21

选择固定操纵杆游戏对象

测试

现在我们可以测试我们的虚拟操纵杆,看看它是否工作。首先,我强烈建议你在游戏选项卡中测试它。这将避免你将构建导出到你的设备上,然后发现它不工作(然而,仅仅因为游戏将在 Unity 中工作,这并不总是意味着它将在我们的设备上工作)。

如果游戏能在 Unity 上运行,现在就在设备上测试一下。

开启设备测试

从 Unity 菜单中,选择文件➤构建设置(图 6-23 )。在构建设置中选择播放器设置,并在检查器中更改版本号(图 6-24 )。

img/460089_1_En_6_Fig24_HTML.jpg

图 6-24

播放器设置

img/460089_1_En_6_Fig23_HTML.jpg

图 6-23

构建设置

成功

在我们从构建菜单中选择构建和运行之后,Unity 将编译代码并打开 Xcode。代码在 Xcode 中编译后,游戏将被安装到您的 iOS 设备上。在图 6-25 中,我已经成功地创建了应用,虚拟操纵杆开始工作。如上所述,保龄球速度太快,但现在,让我们保持原样。

img/460089_1_En_6_Fig25_HTML.jpg

图 6-25

我的 iPhone 上的 FuguBowlAR

七、添加平面检测和点云

现在我们要将生成的平面添加到我们的游戏中,这将有助于 ARKit 相机跟踪设备的移动。

创建生成的平面游戏对象

就像我们在第三章中所做的一样,创建一个空的游戏对象。从文件菜单中,选择游戏对象➤空白(图 7-1 )。

img/460089_1_En_7_Fig1_HTML.jpg

图 7-1

创建一个空的游戏对象

选择游戏对象,在检查器中,命名这个创建的平面(图 7-2 )。

img/460089_1_En_7_Fig2_HTML.jpg

图 7-2

命名游戏对象创建的平面

现在我们需要添加一个组件。在创建的平面检查器中选择添加组件按钮;并在搜索栏中搜索 Unity AR 生成的平面脚本(图 7-3 )。

img/460089_1_En_7_Fig3_HTML.jpg

图 7-3

搜索 Unity AR 生成的平面脚本

在 Unity AR 生成的平面脚本包含在 Created Planes 游戏对象中的情况下,在 Unity AR 生成的平面脚本的 Plane Prefab 设置中,选择选项框右侧的小齿轮,搜索并选择 DebugPlanePrefab(图 7-4 )。

img/460089_1_En_7_Fig4_HTML.jpg

图 7-4

搜索调试计划预设

创建点云游戏对象

创建一个空的游戏对象(图 7-5 )。在检查器中选择空的游戏对象,将其重命名为点云。现在添加一个组件。在搜索栏中,搜索 Unity 点云粒子实例,并将其添加到点云游戏对象中(图 7-6 )。

img/460089_1_En_7_Fig6_HTML.jpg

图 7-6

搜索点云粒子示例

img/460089_1_En_7_Fig5_HTML.jpg

图 7-5

创建一个空的游戏对象

添加了 Unity 点云粒子示例脚本后,现在将最大点数设置为 120(图 7-7 )。您可以设置任意多的点云。

img/460089_1_En_7_Fig7_HTML.jpg

图 7-7

设置要显示的最大点数

现在添加一个点云粒子预设到点云预设属性框。选择点云预设属性框右边的小齿轮,然后搜索点云预设(图 7-8 )。在点云粒子示例脚本中,选择点云预设并将其拖动到点云粒子预设框中(图 7-9 )。

img/460089_1_En_7_Fig9_HTML.jpg

图 7-9

设置为点云预设的点云预设

img/460089_1_En_7_Fig8_HTML.jpg

图 7-8

搜索点云预置

设置主摄像机

你可能还记得在第三章中,我们需要为 AR 设置游戏。我们需要做的第一件事是改变主摄像头的设置。如果你记得如何做,你可以跳过这一节。然而,我将为那些不久前读过第三章的读者提供一个设置指南,他们可能需要我们如何设置的提示,

在层次结构中,选择主摄像机,并在检查器中,将清除标志设置为仅深度(图 7-10 )。

img/460089_1_En_7_Fig10_HTML.jpg

图 7-10

仅将清除标志设置为深度

选择主摄像机后,在检查器中选择“添加组件”。现在搜索并添加 Unity AR 视频脚本(图 7-11 )。

img/460089_1_En_7_Fig11_HTML.jpg

图 7-11

搜索 Unity AR 视频脚本组件

现在选择 Unity AR 视频脚本(单击鼠标左键),该组件应添加到主摄像机中(图 7-12 )。

img/460089_1_En_7_Fig12_HTML.jpg

图 7-12

添加到主摄像机的 Unity AR 视频脚本组件

设置 Unity AR 视频脚本清除素材

在 Unity AR 视频脚本组件的属性框右侧,有一个小齿轮(图 7-12);选择该档位,搜索 YUV 材质(图 7-13 )。

img/460089_1_En_7_Fig13_HTML.jpg

图 7-13

为透明材质选择 YUV 材质

添加 Unity AR 摄像机管理器

在主摄像机仍然被选中的情况下,在检查器中选择添加组件(图 7-14);现在搜索 AR 相机管理器(图 7-15 ,现在将其添加到主相机中。

img/460089_1_En_7_Fig15_HTML.jpg

图 7-15

搜索 Unity AR 相机跟踪器

img/460089_1_En_7_Fig14_HTML.jpg

图 7-14

添加组件

现在添加主摄像机作为跟踪摄像机。要将主摄像机添加到 Unity AR 摄像机管理器的摄像机属性中,请从层级中选择主摄像机,并将其拖动到 Unity AR 摄像机管理器的跟踪摄像机属性中(图 7-16 )。

img/460089_1_En_7_Fig16_HTML.jpg

图 7-16

将主摄像机设置为跟踪摄像机

添加 Unity 远程连接

为了在游戏选项卡中测试我们的游戏,我们还需要将 Unity Remote 连接添加到我们的层次结构中。在项目选项卡中,搜索名为 ARKitRemoteConnection 的预置(图 7-17 )。

img/460089_1_En_7_Fig17_HTML.jpg

图 7-17

搜索 UnityARKitRemoteConnection 预置

选择这个预设,并将其添加到场景中(将其拖动到层次中)(图 7-18 )。

img/460089_1_En_7_Fig18_HTML.jpg

图 7-18

场景中的 UnityARKitRemoteConnection

现在我们需要在我们的 iOS 设备上打开 ARKitRemote。首先,将您的 iOS 设备连接到您的开发电脑。在 Unity 中,选择游戏选项卡,然后按播放按钮。Unity 会在控制台菜单中提示你连接播放器(图 7-19 )。

img/460089_1_En_7_Fig19_HTML.jpg

图 7-19

Unity 连接到玩家消息

在控制台表中,选择编辑器并选择您的 iOS 设备(图 7-20 )。

img/460089_1_En_7_Fig20_HTML.jpg

图 7-20

在控制台菜单中选择 iOS 设备

然后 Unity 会提示你启动远程 ARKit 会话(图 7-21 )。在 Unity 中点击游戏屏幕上的图标,您的应用现在可以在您的 iOS 设备上运行。

img/460089_1_En_7_Fig21_HTML.jpg

图 7-21

启动远程 ARKit 会话提示

在图 7-22 中,你可以看到我已经成功地在我的 iPhone 上查看了 Hello WorldAR 应用,并看到了 Unity 中的场景。如果您移动您的设备,您应该在 Unity 场景选项卡中看到摄像机移动,在游戏选项卡中看到画面变化。我想指出的是,这会有点慢(滞后),但 ARKitRemote 是目前测试 iOS 版 Unity AR 开发的最佳方式。

img/460089_1_En_7_Fig22_HTML.jpg

图 7-22

游戏视图

休斯顿,我们有一个问题…

如果你得到的结果和我在图 7-23 中得到的结果相似,不要惊慌!场景正在实时渲染。保龄球和保龄球瓶被渲染,虚拟操纵杆也被渲染。我们可以看到点云。但是…窗格(t)仍然可见。

img/460089_1_En_7_Fig23_HTML.jpg

图 7-23

取消选择网格渲染器

为了解决这个问题,我们将禁用平面(t)的网格渲染器组件。为此,在层次中,选择平面(t)游戏对象,并在检查器中,取消选择网格渲染器(图 7-24 )。为此,用鼠标左键单击网格渲染器组件左侧复选框中的复选标记。

现在重新测试你的构建,看看结果。你的结果应该和我差不多(图 7-24 )。

img/460089_1_En_7_Fig24_HTML.jpg

图 7-24

没有飞机的游戏视图(t)

在 iOS 设备上测试

由于我们已经成功地在游戏视图中测试了当前版本,现在是时候看看这是否能在我们的设备上运行了。

从主菜单中选择文件➤构建设置(图 7-25 )。确保您已经选择了 iOS 作为平台,并且选中了 Development Build 复选框。此外,一定要检查你是否构建了正确的场景(图 7-26 )。在“构件设置”菜单中,选择“播放器设置”,并在检查器中确定其他设置选项设置正确。我已将我的版本设置为 3.0 版。然而,您可能想要使用不同的版本号(图 7-27 )。

img/460089_1_En_7_Fig27_HTML.jpg

图 7-27

其他设置菜单选项

img/460089_1_En_7_Fig26_HTML.jpg

图 7-26

构件设置菜单

img/460089_1_En_7_Fig25_HTML.jpg

图 7-25

选择构建设置

从“生成设置”菜单中,选择“生成并运行”。Unity 会编译代码,然后打开 Xcode。确定您的 iOS 设备已连接,并且您已在 Xcode 中正确设定了预置描述文件。如果一切设置正确,Xcode 会将您的游戏部署到您的 iOS 设备上,您可以测试构建。

为原力带来平衡

当我们在游戏视图中测试我们的游戏时,我们发现保龄球游戏对象可能有点太快了。如果你能够在你的 iOS 设备上测试这个游戏,你可能会觉得我们也有类似的情况。让一个游戏变得公平或平衡的过程并不容易;这需要大量的计划和测试。在我们的游戏中,我们将保龄球游戏对象设置为 5 米/小时。正如你可能想象的那样,普通的保龄球手不太可能以 5 米/小时的速度投球。然而,由于这是一个游戏,我们有一些自由和创作许可。但是,我们不想让游戏太难或太容易。找到这种平衡很有挑战性。像所有伟大的烹饪节目一样,我将测试设置并报告结果。然而,如果你想尝试测试保龄球的不同速度,这将是一个很好的体验。然而,我建议在游戏视图中测试游戏,不要在你的 iOS 设备上部署这个版本。

减慢保龄球的速度

有两种方法可以让保龄球慢下来。我们可以增加它的质量(使它更重)或者我们可以减慢它的移动速度。我倾向于第二种选择。在层次中,选择保龄球游戏对象,并在检查器中将玩家示例组件中的移动速度设置为 0.5(图 7-28 )。

img/460089_1_En_7_Fig28_HTML.jpg

图 7-28

调整后的移动速度设置

我对这个设置相当满意,但是一些用户测试将帮助我们确认这个速度是否太慢。

照明设备

就像我们在第四章中所做的一样,我们将调整我们的灯光,使游戏中的灯光更接近真实世界的灯光。

关灯

我们将为我们的应用使用不同的光源。然而,为了获得最佳效果,让我们确保已经关闭了场景中的所有灯光。

从主菜单中选择窗口➤照明➤设置(图 7-29 )。

img/460089_1_En_7_Fig29_HTML.jpg

图 7-29

选择照明设置

在“照明设置”的“环境设置”中,将“强度倍增”更改为零。在混合照明设置中,取消烘焙照明设置(图 7-30 )。

img/460089_1_En_7_Fig30_HTML.jpg

图 7-30

更改照明设置

现在选择平行光,在检查器中,改变颜色为白色。并在属性框中输入所需颜色的 RGB 或 HSV 值(图 7-31 )。

img/460089_1_En_7_Fig31_HTML.jpg

图 7-31

键入颜色属性

设置环境光源

现在我们可以设置环境光源。选择方向灯,选择添加组件按钮并搜索环境(图 7-32 )。

img/460089_1_En_7_Fig32_HTML.jpg

图 7-32

搜索 Unity AR 环境

你会看到 Unity ARKit 还包含了一个名为 Unity AR Ambient 的脚本。选择这个脚本将其添加到我们的平行光中(图 7-33 )。

img/460089_1_En_7_Fig33_HTML.jpg

图 7-33

添加到平行光的 Unity AR 环境脚本

摘要

在这一章中,我们在游戏中添加了平面探测和点云。我们还改进了照明,使游戏中的照明看起来更接近真实世界中的照明。在我们的下一章中,我们将会看到给我们的游戏添加声音。

阅读本章的更有经验的开发者可能会意识到我们在游戏中仍然有 Plane(t) GameObject。如果我们完全移除平面(t)游戏对象,保龄球和保龄球瓶将继续下落。这是因为这些游戏对象是在创建的平面之前实例化的。在第八章中,我们将介绍如何在创建的平面创建后在 Unity 中实例化这些游戏对象。目前,我们有一个相当可靠的测试环境。

八、最后的步骤

在前一章中,我们发现为了阻止保龄球和大头针穿过我们生成的平面,我们需要在场景中保持平面(t)游戏对象。这样做的原因是 Unity 在生成生成的平面之前创建(或实例化)保龄球并固定游戏对象。在这一章中,我们将对我们的项目进行一些修改,以便能够做到这一点

创建预设

我们需要做的第一步是将我们的保龄球和保龄球瓶游戏对象变成预设。为此,我们需要在 Assets 文件夹中创建一个 Prefabs 子文件夹。为此,在项目选项卡中选择资产文件夹,右键单击并选择创建文件夹(图 8-1 )。

img/460089_1_En_8_Fig1_HTML.jpg

图 8-1

在资产文件夹中创建子文件夹

选中新的子文件夹,将其重命名为预设(图 8-2 )。

img/460089_1_En_8_Fig2_HTML.jpg

图 8-2

创建预设文件夹

首先,我将把我的 BowlingPinCollider 游戏对象重命名为 BowlingPin。要在层级选项卡中执行此操作,请选择 BowlingPinCollider 游戏对象,右键单击游戏对象并选择重命名(您也可以在层级中选择游戏对象,然后左键单击文件名)。现在重命名这个文件为 BowlingPin。这不仅将保持我们的文件命名惯例的一致性,而且还将有助于在创建预制品时识别它。

现在在层次选项卡中,选择保龄球和保龄球瓶游戏对象,并将它们拖到预设文件夹中(图 8-3 )。

img/460089_1_En_8_Fig3_HTML.jpg

图 8-3

保龄球和保龄球瓶预制品

现在 Unity 已经很好地将这些游戏对象转换为预置,现在我们可以在运行时包含它们来实例化这些新创建的资产。要检查这些资产现在是否是预设,请在层级中选择 BowlingPin,在检查器中,您会看到属性已经更改(图 8-4 )。

img/460089_1_En_8_Fig4_HTML.jpg

图 8-4

保龄球预制品的属性

在图 8-4 中,查看检查器的顶部(标签属性的正下方),你会看到我们现在有了预设属性(选择、还原、应用)。这证实了我们已经成功地将这个游戏对象变成了一个预置。现在,我们可以在运行时实例化这些预置。额外的好处是,我们也可以实例化尽可能多的预置。为了在运行时实例化这些游戏对象,我们需要创建一些代码。

添加更多保龄球瓶

第一步是我们要添加更多的保龄球瓶。为此,我们将更新我们的 BowlingPin 预置。在层级中,选择 Bowling_Pin 游戏对象并复制九次。现在,我们将重命名这些副本,并转换它们的起始位置。如果你在场景视图或游戏视图中查看,你会注意到我们制作的所有副本都很好地定位在相同的变换位置。虽然这对玩家来说可能很棒,但我们想让它变得更有挑战性。

虽然有正确的尺寸来设置销架的位置,但我们将把销放置在一个倒三角形中,但会给我们的设计增添一点艺术气息。

在层次结构中,选择第一个 Bowling_Pin 游戏对象,并将其重命名为 BowlingPin 5,然后在预设设置的检查器中,选择“应用”。虽然在这种情况下并不完全必要,但我们将对所有的 Bowling_Pin 游戏对象进行更改,因此对所有对象都进行更改是一种很好的做法。

在层次中,选择第二个保龄球瓶游戏对象,并将其重命名为 BowlingPin 4。现在,在检查器中,将 X 变换位置设置为-1.12,然后选择“应用”将所有更改应用到该预设。对于剩余的保龄球瓶,我们将遵循相同的步骤。然而,为了避免在每个引脚上重复这些步骤,我在表 8-1 中总结了这些步骤。完成后,你应该有一个类似于我在图 8-5 中看到的视图。

img/460089_1_En_8_Fig5_HTML.jpg

图 8-5

最终销架视图

表 8-1

保龄球瓶设置

|

BowlingPin 号

|

X

|

Y

|

Z

|
| --- | --- | --- | --- |
| 保龄球瓶 1 | −2.40 | Zero | Zero |
| 保龄球瓶 2 | −0.50 | Zero | −1.24 |
| 保龄球瓶 3 | Zero point five | Zero | −1.24 |
| 保龄球瓶 4 | −1.12 | Zero | Zero |
| 保龄球瓶 5 | Zero | Zero | Zero |
| 保龄球瓶 6 | One point one two | Zero | Zero |
| 保龄球瓶 7 | One point seven two | Zero | One point one two |
| 保龄球瓶 8 | Zero point six | Zero | One point one two |
| 保龄球瓶 9 | Zero point six | Zero | One point one two |
| 保龄球瓶 10 | −2.40 | Zero | One point one two |

最后,将父 BowlingPin GameObject 重命名为 Pin Rack(这在技术上是保龄球瓶倒三角形的正确术语)。

在运行时实例化游戏对象

由于我们将在运行时实例化 BowlingBall 和 BowlingPin 预置,我们可以禁用层次中的相关资产。选择保龄球游戏对象,并在检查器中,取消选择预设名称旁边的复选框(图 8-6 )。

img/460089_1_En_8_Fig6_HTML.jpg

图 8-6

从场景中取消选择保龄球

你会注意到保龄球预设在场景视图中不再可见。对销架重复相同的步骤。

创建 Instantiate_GameObjects 脚本

为了防止您忘记如何创建脚本,我将在这里重复这些步骤。如果你已经知道了,那么请随意跳过下面几段。

在项目视图中,选择脚本文件夹,右键单击并选择创建➤ C# 脚本(图 8-7 )。

img/460089_1_En_8_Fig7_HTML.jpg

图 8-7

创建 C# 脚本

选中新的脚本,将这个脚本重命名为 Instantiate_GameObjects(图 8-8 )。

img/460089_1_En_8_Fig8_HTML.jpg

图 8-8

脚本文件夹中的 Instantiate_GameObjects 脚本文件

现在,我们已经准备好输入脚本,在运行时实例化游戏中的预设。双击我们刚刚在 IDE 中创建的新的 Instantiate_GameObjects 脚本文件,并输入清单 8-1 中的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Instantiate_GameObjects : MonoBehaviour
{public GameObject bowlingBallPrefab;    //Used to store the bowling ball prefab and create an object based on that.public GameObject bowlingPinPrefab;     //Used to store the bowling pin prefab and create an object based on that.public Transform terrain; //Here just to easily double check if we are finding the correct plane object.public bool once = false;// Update is called once per framevoid LateUpdate(){//Look for a plane with the tag "Terrain" that will be generated based off another script and a prefab attached to it.terrain = GameObject.FindWithTag("Terrain").transform;if (once && (terrain != null)){once = false;InstantiateGameObjects(terrain.position);}}//Create a Bowling Ball and Pin Rack slightly above the plane/terrain/bowling lane.//Called from the ARGeneratePlane script, so that immediately after the plane is created, the game objects are too with minimal resource usage.public void InstantiateGameObjects(Vector3 plane){once = false;plane.y += 0.5f;   //Make sure that the objects appear above the plane.//Make sure the the objects appear towards the middle of the plane.if(plane.x >= 0){plane.x += 2;}else{plane.x += -2;}Instantiate(bowlingBallPrefab, plane, Quaternion.identity);  //Create the Pin Rack}
} Listing 8-1The Instantiate_GameObjects script

从场景中禁用游戏对象

以防你不确定如何禁用游戏对象,在层级中选择平面(t)游戏对象,在检查器中,通过单击游戏对象名称旁边的复选框取消选择它(图 8-9 )。

img/460089_1_En_8_Fig9_HTML.jpg

图 8-9

禁用的游戏对象

创建游戏管理器

我们现在要创建一个游戏管理器。游戏管理器是保存评分系统、音频管理器等资产的好地方,也是包含我们创建的 Instantiate_GameObjects 脚本的好地方。

在层级中,创建一个空的游戏对象,并将其命名为 GameManager。从项目视图的脚本文件夹中,将 Instantiate_GameObjects 脚本拖到这个游戏对象上(图 8-10 )。

img/460089_1_En_8_Fig10_HTML.jpg

图 8-10

带有 Instantiate_GameObjects 脚本的游戏管理器

在图 8-10 中,我已经将保龄球和保龄球瓶预设添加到游戏管理器中。

FindWithTag

敏锐的读者会注意到,在我们的 Instantiate_GameObjects 脚本中,我们引用了 FindWithTag 函数。我们需要更新我们创建的飞机游戏对象来添加这个标签。

在层次结构中,选择创建的平面游戏对象,在检查器中,选择标签属性的下拉菜单并选择标签地形(图 8-11 )。

img/460089_1_En_8_Fig11_HTML.jpg

图 8-11

为创建的飞机游戏对象选择地形标签

由于我们不再使用点击测试组件,我们可以禁用它(图 8-12 )。

img/460089_1_En_8_Fig12_HTML.jpg

图 8-12

创建的飞机游戏对象设置

对于我们的游戏,我们真的不需要点云,所以我也要从场景中禁用它们。

现在是拯救我们游戏的好时机。

测试

在游戏开发(和应用开发)的世界里,我们无法避免测试和再测试。然而,这一次,我将构建并尝试在我的设备上运行我的精彩游戏。我们需要做的第一件事是禁用场景中的 ARKitRemote 游戏对象。我还不打算删除它,因为我觉得我们可能有更多的测试和开发要做。

在层次中,选择 ARKitRemote 游戏对象并取消选择。

现在是拯救我们游戏的好时机。我已经决定对我的场景文件名使用版本控制。这样,如果出现任何问题,我可以回到正常工作的场景。因此,从菜单中,我选择了文件➤另存为,我选择调用我的场景文件名为 fugubowlar 测试,我保存在场景文件夹中。

现在从主菜单中,选择构建设置。确保您选择了当前场景,并在播放器设置中更改版本号。

现在选择构建并运行。

嗯,成功了。现在,我们可以移除所有不使用的游戏对象和组件,并再次进行测试。如果不起作用,请检查您的设置,然后重试。这对我来说很有效,我承认,这离一个完全成熟的可发行游戏还很远,但这是一个很好的起点。

最后的话

在前面的章节中,我指出我将在 Unity AR 视频脚本中的透明材质设置的属性框中解释 YUV 材质的作用。YUV 材质是一种着色器,它用真实世界的视频填充背景缓冲区。在这种情况下,我们使用着色器将摄像机中的真实视频“投影”到游戏中。YUV 是一种颜色编码系统,通常用作彩色图像管道的一部分。它将人类感知考虑在内,对彩色图像或视频进行编码。关于 YUV 颜色编码系统的详细解释,这里有一个非常好的解释: https://docs.microsoft.com/en-us/windows/desktop/medfound/about-yuv-video

游戏开发比我们在这本书里讨论的要多得多。下一步将是添加一个用户界面,当完全完善后,我们可能想在资产商店上发布我们的游戏。资产商店上已经有许多关于出版的好书和教程(例如: https://unity3d.com/learn/tutorials/topics/mobile-touch/how-submit-ios-app-store-overview ,或者 https://developer.apple.com/app-store/resources/ )。我建议你查看这些资源,并希望你在发布你的 AR 游戏时让我知道。Ganbatte kudasai(好运)!

摘要

在这一章中,我们将两个游戏对象转换成了预设。然后我们创建并更新了保龄球预制品。然后我们添加了一个脚本来实例化 GameManager 脚本,它将在运行时将这些预置添加到游戏中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780981.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络架构系列】内网 DNS 架构之办公网 DNS

需求分析一、DNS 安全性:二、DNS 请求转发能力:三、域名管控和审计能力:架构设计架构分析技术建议需求分析办公网 DNS 不同于业务网 DNS,主要承担的是企业或组织机构内部员工的日常办公的域名解析需求,比如:日常的办公系统的访问:OA/ERP/CRM/财务系统/文件共享系统/内部…

在线客服源码全开源搭建

在线客服系统源码全开源搭建是一个涉及多个步骤的过程,这里提供一个基本的指南来帮助你理解整个过程:需求分析:确定你需要的在线客服系统的基本功能,例如即时消息、访客追踪、聊天记录、自动回复等。选择技术栈:根据你的需求和团队的技术背景,选择合适的编程语言和框架。…

PyCharm如何汉化

重启后,就是中文版的了

# games101 作业3分析 详解bump mapping

games101 作业3分析 详解bump mapping 代码分析 整体代码结构 其实变化还是不大 主要是引入了vertexshader(什么都没做) 与 fragmentshader(使用了不同的着色方法 直接用法线作为rgb 使用blingphong光照模型 纹理贴图 bumpmapping displacementmapping) 主要变化在光栅化…

企业如何搭建一个稳定、高效的在线客服系统?

在当今竞争激烈的市场环境中,企业要想在众多竞争者中脱颖而出,除了提供高质量的产品外,优质的客户服务体验同样至关重要。客服中心作为企业与消费者之间的桥梁,其管理水平的高低直接影响到客户的满意度。因此,客服中心的精细化管理显得尤为重要。以下是客服中心精细化管理…

010.Vue3入门,数组变化侦听,实时在界面显示变化后的数据

1、代码如下:<template><h3>数组变化侦听</h3><button @click="addListHandle">添加数据</button><ul><li v-for="(item,index) of names" :key="index">{{ item }}</li></ul><butto…

自动化运维-《日常运维手册接入手册》之 服务器端口表

前言:脚本编写不是一蹴而就,需要根据当前场景和实际需求不断测试和调整,最重要的是勇于踏出敢于尝试的这一步。 任务需求:在ansible-vault加密环境下,使用root权限批量将项目上所有服务器的tcp端口过滤掉22, 25, 53, 443,631,9100,10050端口 后显示出来;判断服务器上如…

transformer的位置编码具体是如何做的

Vision Transformer (ViT) 位置编码 body { font-family: Arial, sans-serif; line-height: 1.6; margin: 20px; background-color: rgba(244, 244, 244, 1) } h2 { color: rgba(51, 51, 51, 1) } p { margin-bottom: 10px } ul { margin-bottom: 20px } .code { background-co…

第六周学习mysql

本周学习到了mysql中的视图距离学习完进阶篇的mysql还差五十节课,下周就可以完全学完,对于本周,并没有完整的完成上周定制的任务,不过整体本周表现还行。 下周至少学完mysql之后开始学习jdbc,jdbc内容看了一下,相对较少,希望下周可以提前开始学习。 总结:进度来说还是相…

009.Vue3入门,事件修饰符的使用方法

1、代码如下:<template><h3>事件修饰符</h3><a @click.prevent="clickHandle" href="http://www.baidu.com">百度</a><div @click="click1"><p @click="click2">测试1</p></div&…

php程序对微信你昵称的表情处理导出excel文件

php程序对微信昵称的表情处理,若转义存数据库,怎么读出并导出成excel文件.<?phpinclude(dirname(__FILE__) ./phpexcel-1.7.7/Classes/PHPExcel.php); include(dirname(__FILE__) ./phpexcel-1.7.7/Classes/PHPExcel/IOFactory.php);$name2 = "[[EMOJI:%F0%9F%91%BF]]…