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

164 阅读33分钟

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

原文:Beginning iOS AR Game Development

协议:CC BY-NC-SA 4.0

六、触摸介绍

在 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 frame
    void 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 脚本,它将在运行时将这些预置添加到游戏中。