UDK-IOS-游戏开发初学者指南-全-

UDK IOS 游戏开发初学者指南(全)

原文:zh.annas-archive.org/md5/6a8f8bcb952dae60b61cbff6a630251a

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

成为应用开发者从未有过如此吸引人的时刻。随着苹果 iOS 设备在移动场景中的统治地位,以及 UDK,最受欢迎的第三方游戏引擎的免费版本,进入应用业务从未如此容易。

这本书,UDK iOS 游戏开发入门指南,采用清晰、逐步的方法,使用 Unreal Development Kit 构建一个小型第三人称射击游戏,并提供了大量如何创建独特游戏的示例。

在创建第三人称射击游戏之前,你将开始学习 Unreal Engine 的基础知识。游戏创建完成后,你将学习如何对任何项目进行优化以适应 iOS 平台,并发现需要考虑的特殊因素。最后,你将在 App Store 上发布你的游戏,让全世界都能看到并参与游戏,同时提供与发布相关的不同成本详情。

本书涵盖内容

第一章在 iOS 上使用 UDK 入门,简要概述了 iOS 上 UDK 开发的激动人心的世界,同时使用 UDK Remote 在 PC 上通过我们的 iOS 设备作为输入设备来玩 UDK 游戏。

第二章开始 Urban Warrior:第三人称射击,让读者了解 UDK 的界面,从构建一个房间、添加灯光,并在房间中填充模型开始。

第三章提升至下一个层次:内容丰富,在为我们的关卡添加外观的同时,还添加了针对移动设备的特定灯光和雾效。读者还可以使用移动预览选项来展示我们的关卡在 iOS 设备上的外观,并通过粒子系统为我们的世界注入活力。

第四章使用 Kismet 和 Matinee,让我们了解 Kismet 和 Matinee,这两种在静态世界中创建运动和交互的最受欢迎的方法,创建了一个电影效果、自动门,并使用移动输入为我们的游戏添加功能。我们还了解了专门为移动设备制作的序列对象。

第五章Urban Warrior 的动作序列,在为我们的游戏开发战斗场景并使用 AI 敌人时,教读者关于序列、子序列和预制件的知识。

第六章整合一切,展示了如何使用 Geometry Mode 的工作流程快速原型化关卡,将 Urban Warrior 完善为一个完成的关卡。

第七章为城市战士的高级内容创作,讨论如何通过引入自定义内容使游戏成为你自己的,例如主菜单、音频、纹理、静态网格,以及如何创建在 PC 和 iOS 上都能正常工作的材料,还有一些针对 iOS 游戏的优化和调试技巧。

第八章发布和盈利你的游戏,将你的完成游戏带入到将游戏安装到你的设备上的过程,并最终到 iOS 应用商店,讨论你需要了解的所有关于 Epic Games 为 UDK 开发的 iOS 游戏所实施的版税模式,以及链接引导对学习如何为他们的游戏添加更多功能感兴趣的读者。

你需要这本书什么?

为了使用本书,你需要一台能够运行虚幻开发工具包(UDK)的 Windows 电脑。UDK 需要一台具有以下系统配置的个人电脑:

  • Windows XP SP3(仅 32 位)与 DirectX 9.0c

  • 2GHz 或更好的 CPU

  • 2+ GB RAM

  • 支持 Shader Model 3.0 的图形卡,例如 nVidia GeForce 7800

注意,Windows 7 64 位目前是主流的开发环境。

以下是为内容开发的要求:

  • Windows 7 64 位

  • 2.0+ GHz 多核处理器

  • 8 GB 系统 RAM

  • NVIDIA 8000 系列或更高图形卡

  • 足够的硬盘空间

如果您还没有安装.NET Framework 3.5 Service Pack 1,UDK 将安装它,这需要互联网连接。

本书面向的对象

如果你想使用虚幻开发工具包制作 iOS 游戏,或者对将你的游戏从 PC 移植到 iOS 感兴趣,这本书就是为你准备的。本书假设你对 UDK 没有先前的知识,因此是学习 UDK 的好起点,尽管更侧重于为 iOS 平台构建游戏。

术语约定

在本书中,你会发现一些标题频繁出现。

为了给出清晰的操作说明,我们使用以下方法:

行动时间—标题

  1. 动作 1

  2. 动作 2

  3. 动作 3

指令通常需要一些额外的解释,以便它们有意义,因此它们后面跟着:

刚才发生了什么?

这个标题解释了你刚刚完成的任务或指令的工作原理。

你还会在书中找到一些其他的学习辅助工具,包括:

快速问答—标题

这些是简短的多项选择题,旨在帮助你测试自己的理解。

尝试一下英雄—标题

这些设定了实际挑战,并为你提供了实验你所学内容的想法。

你还会发现许多不同风格的文本,用于区分不同类型的信息。以下是一些这些风格的示例,以及它们含义的解释。

新术语重要词汇以粗体显示。您在屏幕上看到的单词,例如在菜单或对话框中,在文本中显示如下:“从顶部菜单,选择视图 | 视口配置 | 2x1 分割。”

注意

警告或重要注意事项以这样的框形式出现。

小贴士

技巧和窍门以这样的形式出现。

读者反馈

我们欢迎读者的反馈。让我们知道您对这本书的看法——您喜欢什么或可能不喜欢什么。读者反馈对我们开发您真正从中获得最大收益的标题非常重要。

要向我们发送一般反馈,只需发送一封电子邮件到<feedback@packtpub.com>,并在您的邮件主题中提及书名。

如果您在某个主题上具有专业知识,并且您对撰写或为书籍做出贡献感兴趣,请参阅我们的作者指南www.packtpub.com/authors

客户支持

现在您已经是 Packt 图书的骄傲拥有者,我们有多种方式可以帮助您从您的购买中获得最大收益。

下载示例代码

您可以从您在www.packtpub.com的账户下载您购买的所有 Packt 书籍的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

下载本书的彩色图像

我们还为您提供了一个包含本书中使用的截图彩色图像的 PDF 文件。彩色图像将帮助您更好地理解输出的变化。您可以从 http://downloads.packtpub.com/sites/default/files/downloads/1901EXP_UDK iPhone Game,Development.pdf 下载此文件。

勘误

尽管我们已经尽最大努力确保我们内容的准确性,但错误仍然可能发生。如果您在我们的某本书中发现错误——可能是文本或代码中的错误——如果您能向我们报告这一点,我们将不胜感激。通过这样做,您可以避免其他读者感到沮丧,并帮助我们改进本书的后续版本。如果您发现任何勘误,请通过访问www.packtpub.com/support,选择您的书籍,点击勘误提交表单链接,并输入您的勘误详情来报告它们。一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站,或添加到该标题的勘误部分现有的任何列表中。

海盗行为

互联网上版权材料的盗版是一个跨所有媒体的持续问题。在 Packt,我们非常重视我们版权和许可证的保护。如果您在互联网上遇到我们作品的任何非法副本,无论形式如何,请立即提供位置地址或网站名称,以便我们可以追究补救措施。

请通过 <copyright@packtpub.com> 联系我们,并提供涉嫌盗版材料的链接。

我们感谢您在保护我们作者以及为我们提供有价值内容的能力方面的帮助。

问题

如果你在本书的任何方面遇到问题,可以通过 <questions@packtpub.com> 联系我们,我们将尽力解决。

第一章:使用 iOS 开始 UDK

现在,一切都将开始!在短短几页之内,您将迈出成为 UDK iOS 开发者第一步。但在我们一头扎进去之前,让我们花点时间了解 UDK 最初是如何产生的,并确保一切准备就绪,以使您的体验达到最佳。

在本章中,我们将:

  • 了解 Unreal 引擎以及我们期望创建的内容

  • 在我们的计算机上安装 UDK

  • 概述 UDK 的目录结构

  • 下载并安装 UDK Remote

  • 将移动预览器设置与您的 iOS 设备匹配

  • 描述我们将要创建的项目

现在我们已经对我们需要的内容有了坚实的基础,也对整本书的内容有了概览,让我们开始做第一件事,安装程序。

本章将专门从初学者的角度提供一个关于 UDK iOS 开发的精彩世界的简要概述。

在本章中,我们将详细介绍 UDK 是什么以及它是如何获得当前人气的,包括它从 Epic Games 的先前版本专有游戏开发软件中的演变。

此外,我们还将探讨如果您完成本书中展示的所有工作,不要期待什么。例如,如果您认为您将在手机上开发下一部《战争机器》游戏,那么恐怕您会有些惊讶!

我们还将探讨如何在您的机器上安装和运行 UDK,并确保您为 iOS 开发做好准备。这其中的关键部分是 UDK 提供的 Unreal Remote/Mobile Previewer 功能,我们将在本章中详细探讨。

最后,我们将探讨我们将要开发的名为 Urban Warrior 的原型游戏的基本概念,正如之前提到的,这并不是《战争机器》系列的下一部续作,但同时也将带有许多典型的第三人称射击游戏的特点,这是我们所有人都熟悉和喜爱的!

定义 UDK

Unreal Development KitUDK)是 Epic Games 的一个免费版本,是一个非常流行的 Unreal 游戏开发引擎。

该引擎最初于 1998 年开发,用于驱动原始的 Unreal 游戏,它基于 C++,已经从强到更强,不仅成为了知名游戏公司 Epic Games 的许多游戏(如非常受欢迎的《战争机器》系列)的支柱,而且还非常成功地授权给了第三方开发者。后续的游戏从《蝙蝠侠:阿卡姆城》到《质量效应 3》,其中许多游戏与母公司开发的游戏一样成功。

目前,虚幻引擎本身已经发展到第四代,被认为是顶级的可视化工具。它不仅用于游戏行业,还被用于任何需要实时计算机图形的工作。UDK 使用虚幻引擎 3,但本身就是一个强大的工具,完全能够在 iOS 软件上提供令人惊叹的体验。

UDK 作为一个概念,从 Epic Games 的早期虚幻游戏内容生成工具开始发展;这些工具证明能够孕育出一个非常健康且繁荣的修改(modding)社区。最初,像这样的工具,如 UnrealEd(用户可以使用它创建自己的游戏关卡编辑工具),对任何购买游戏的用户都是开放的。

然而,在 2009 年,Epic 通过使他们的工具对任何人都可用(无论他们是否拥有虚幻游戏),颠覆了这种逻辑。这证明是一个非常成功的举措,彻底扩大了虚幻开发者用户群。

最近,Epic Games 作为他们持续不断的 UDK 更新的一部分,增加了 iOS 功能(2010 年),确保 UDK 可以为苹果的 iPhone/iPad/iPod Touch 设备所引入的日益扩大的移动客户群提供游戏。这是通过一个名为Epic 城堡的现场技术演示首次向公众展示的;在 iTunes 商店上免费提供的下载,它就像是一个中世纪城镇的交互式导览。它吸引了创纪录的下载量,因为在当时,在移动设备上体验高质量实时图形确实是一项突破性的创新。请看以下截图:

定义 UDK

实际上,尽管这不在本书的范围内,最近某些演示已经出现,突出了 UDK/Adobe Flash Player 管道的潜力,展示了这款游戏开发应用在多个不同平台上的令人印象深刻的渗透力。

当然,我们对 iOS 感兴趣,本书将从最基本的概念开始,逐步深入到一些更高级的概念。

那么,我们需要了解 UDK 及其移动 iOS 限制的什么?它有吗?

不要期待制作出战争机器

让我们从一条相当现实的说法开始;我们无法在 iOS 上使用 UDK 制作出像当代游戏机或 PC 上看到的 AAA 级游戏大作,例如战争机器!这是使用 UDK 进行移动开发的一般限制。

主要原因相当明显;我们无法访问相同的硬件。问题不在于软件!UDK 可以在 PC 或 iOS 设备上部署相同的游戏,但最终决定能否实时处理的是终端硬件规格。

在过去几年中,移动设备(当然包括 iOS 设备)取得了飞跃性的进步,经过许多尝试和失败,移动游戏如今在商业和技术上都是一个不容忽视的力量。然而,这仍然不能改变这样一个事实,即作为一个 iOS UDK 开发者,你将使用比例如 Xbox 360 平台开发者更受限的硬件。

让我们更详细地看看;以下是一些当前 iPhone 4S 的技术规格:

  • 960 x 640 像素显示屏

  • 16 GB,32 GB 或 64 GB 闪存驱动器

  • 双核 1 GHz Cortex-A9PowerVRSGX543MP2GPU

  • 512 MB RAM

2012 年初发布的最新的 iPad 具有以下规格:

  • 2048 x 1056 像素显示屏

  • 16 GB,32 GB 或 64 GB 闪存驱动器

  • 四核 PowerVRSGX543MP4GPU

  • 1 GB RAM

与过去的移动设备相比,以及我们谈论的实际上是一个口袋大小的设备这一事实,这些规格相当令人印象深刻,但它们真的无法与顶级游戏 PC 或当前一代游戏机的规格相提并论。

当然,这并不意味着我们只能用 UDK 开发质量差或二流的游戏。实际上,一些它的当代例子突显了它在提供 AAA 游戏体验方面具有巨大的潜力,即使在其当前的限制下,这些限制如前所述,源于移动设备的硬件限制。

最好的例子无疑是 Chair Entertainment 和 Epic Games 的《无尽之剑》,这是一款史诗般的第三人称剑斗游戏,于 2010 年底发布,被认为是 UDK 在苹果设备上技术实力的理想展示。

已经产生了续集,并且在其 iTunes Store 商业模式下取得了巨大的商业成功,《无尽之剑》不仅曾经是,现在也是所有希望使用虚幻引擎技术为 iOS 游戏带来非常现代的感觉和视觉效果的梦想游戏开发者的重要启示。

要了解 iOS 游戏有多强大,只需看看以下截图,这是一个很好的例子:

不要期望制作《战争机器》

下载和安装 UDK

我们将在电脑上下载并安装 UDK 来开发游戏!

行动时间——在您的 PC 上安装 UDK

可以按照以下步骤安装 UDK。

  1. 启动您选择的网络浏览器并访问 UDK 的网站,www.udk.com。以下截图显示了这一过程:行动时间——在您的 PC 上安装 UDK

    我们将在下一步讨论如何下载 UDK,但对于那些刚开始使用 UDK 的用户,我也强烈建议您花些时间进一步探索这个网站。它对 UDK 及其功能有非常详尽的解释,定期更新的展示项目(包括商业可用游戏),有关许可的信息,简而言之,这是一个必须访问的网站(实际上,对于任何自重的 UDK 开发者来说,这是一个必须定期访问的网站),在这里您还可以找到适用于您的最新 UDK 版本。

    备注

    Epic Games 作为其社区的一部分,也拥有一个非常活跃的论坛。对于那些像我们一样从事 iOS 开发的用户,也有专门为我们设立的社区论坛。您可以通过点击页面顶部的 社区 标签,或者选择 iOS 开发,或者直接访问 forums.epicgames.com/forums/396-iOS-Development 来找到它。

  2. 点击页面右上角的蓝色 下载 UDK 按钮。这在上面的截图中有展示。

  3. 通过右键单击左侧的最新版本并选择 另存为... 来下载它。操作时间——在您的电脑上安装 UDK

    首先,请记住,您现在正在安装完整的 UDK 应用程序,而不仅仅是面向 iOS 的版本。实际上并不存在这样的版本;UDK 在多平台开发方面采取了一种非常全面的方法。

    备注

    记住,Epic Games 会定期发布 UDK 的更新。

    然而,由于可能存在与旧版和新版的不兼容性问题,他们已经将每个更新(其安装程序文件)与其发布日期清晰地列出,从最初发布的(2009 年 11 月)到当前的(2012 年 5 月)。

    请注意,2012 年 5 月的 UDK 测试版将是本书中我们将使用的版本,尽管本书中我们做的所有事情都应该与后续版本兼容,但 UDK 是不断发展的,在未来几个月中,引擎中可能会有某些问题无法工作,直到 Epic 在后续版本中修复它们。

  4. 您很可能会收到一个提示,要求安装 Microsoft .NET,请也安装它。这不应该花的时间比 UDK 下载时间长(如以下截图所示)。操作时间——在您的电脑上安装 UDK

    然而,请注意,这一步也可能触发您电脑的重启,因此请事先在其他应用程序中保存您的作品。

  5. 一旦 UDK 安装程序下载完成,打开文件并选择 运行 文件,如果出现安全警告,允许安装程序对您的电脑进行更改,如果您的电脑要求的话。

  6. 在此阶段,安装程序将要求您签署 最终用户许可协议EULA)。要继续安装程序,您必须通过点击 我接受 按钮同意条款。

    请注意,Epic Games 希望您在此阶段签署最终用户许可协议。

    通常情况下,尤其是对于从互联网下载的免费应用程序,人们往往会忽视这一点,不会仔细阅读,只是通过点击我接受按钮来签署。

    然而,我强烈建议您阅读此内容,尤其是如果您有成为专业 UDK 开发者的抱负。您需要理解您所签订的协议,原因有很多。

    通常情况下,使用 UDK 进行教育用途或非营利目的的大部分内容是完全免费的,但如果您打算为您的游戏收费或从中获得任何收益,您将不得不在游戏收入超过 50,000 美元之前一次性支付 Epic 99 美元,以及超过 50,000 美元后的收入百分比。有关许可的更多详细信息,请参阅第八章商业化部分**Chapter 8,发布和盈利你的游戏

  7. 接下来,将程序安装到您选择的目录中。我使用了默认位置。安装过程通常需要几分钟才能完成(记住您下载的可执行文件的大文件大小!)。

  8. 安装完成后,您将可以选择启动 UDK。这样做,我们将在本章后面使用它。

  9. 前往您安装 UDK 的目录(您在步骤 6 中选择的目录)。默认目录是C:\UDK\UDK-2012-05,如下截图所示:安装 UDK 到您的 PC 的时间——安装 UDK

刚才发生了什么?

您现在已在您的计算机上安装了 UDK,并迈出了 UDK 开发的第一步。

UDK 目录概览

Epic Games 提供了一些示例地图和文件,值得探索(包括移动设备上的),在开始开发自己的游戏之前。现在软件已安装,让我们看看我们创建的目录具体包含什么。

Binaries

Binaries文件夹包含许多可执行文件,包括主要的 UDK 程序和用于艺术家和动画师的工具。除了 UDK 的可执行文件外,我们可能不会触及这里的其他任何内容,但我将简要介绍其他文件夹包含的内容。

  • ActorX:它包括用于从 3dsMax 或 Maya 导出模型的插件

  • FaceFX 插件:它包含用于角色面部动画的工具

  • GFx:它包含用于与 Flash 集成 Scaleform 的工具,用于游戏中的 HUD 或其他事物

  • iPhone/Mac:它包含用于将游戏导出至 iOS 或 Mac 平台的打包程序。这将在第八章(在 iOS 方面)详细讨论,发布和盈利你的游戏

  • SpeedTreeModeler:这是一种快速制作游戏关卡中漂亮树木和植被的方法

  • Win32/Win64: 它包含 UDK 的 32 位和 64 位版本以及运行它所需的全部库。

Development

开发 包含了为游戏创建的不同类别的 UnrealScript 文件。我们在这本书中不会查看它,但你可以随时查看,以了解游戏玩法逻辑是如何工作的。对于那些熟悉编码的人来说,你可以自由地阅读和扩展已经创建的内容,但重要的是要提到,你永远不应该修改 Epic 的代码。

Engine

引擎 是存放引擎文件、资源文件和配置文件的目录。我们在这本书中不会涉及它们,但特别需要注意的是 iPhone 文件夹,它可以用来为你的游戏设置特定的 iPhone 功能。

UDKGame

UDKGame 将包含以下目录:

  • 自动保存: 这个文件夹目前还不存在,因为我们还没有使用 UDK,但当你稍后工作在关卡上时,这个文件夹将会被创建,以便备份你正在工作的文件。这并不是替代你自己保存工作,但以防 UDK 突然关闭,你可能会有机会恢复大部分已完成的工作。

  • 构建: 这个文件夹包含在不同平台上发布所需的资源。值得注意的是,iPhone 文件夹包含了我们将在书中稍后使用的资源,例如 App Store 的音乐和图形。

  • 配置: 这个文件夹包含 .ini 文件,我们可以使用这些文件来更改游戏本身的功能。虽然我们在这本书中不会涉及,但我们会使用文件中包含的知识,例如 DefaultInput.ini 文件中找到的按键绑定。

  • 内容: 这是我们将创建的所有资源将放入的文件夹。文件组织并不重要,只要对你有意义即可。只要它在这里,UDK 就能找到它。如果你进入 UDKGame 文件夹,然后在 Content | Maps | Mobile 中,你将能够找到许多针对 iOS 的关卡,包括前面提到的 Epic Citadel,还有一个他们最早游戏的一个非常酷的版本(在 UDK 上被深情地重新制作);Jazz the Jackrabbit。这原本是一个 2D 平台游戏,看到它用现代工具 UDK 重新制作,是对 Epic Games 历史的一个很好的致敬。

  • Flash: 对于那些对将 Scaleform 集成到你的项目中感兴趣的人,这里有一些专门为此目的创建的文件示例。你需要有 Flash 才能打开这些文件,并且除非你正确设置,否则它们将无法工作。有关更多信息,请参阅 udn.epicgames.com/Three/SettingUpScaleformGFx.html

  • 本地化: 这个文件夹包含将你的游戏转换为其他语言的文件。

  • 日志:UDK 会记录运行时的所有操作,所以如果发生错误,你可以确切地看到出了什么问题。这对于调试很有用,但你不需要它。

  • 电影:如果你正在为 PC/Mac 开发,并希望使用任何剪辑场景电影,它们将被放置在这里。我们不会在 iOS 开发或本书中使用这个文件夹。

  • 脚本:所有编译生成的源代码最终都会出现在这里。由于本书中没有任何编码,它对我们来说不会很有用。

  • 启动画面:这个文件夹包含游戏启动时显示的图像,以及指向Unreal 开发者网络UDN)和 Epic 论坛的链接。

使用 UDK 进行 iOS 开发的设置

在我们将 iPhone 与 UDK 交互之前,这里有一些简要的注意事项你应该知道。我们已经查看在 PC 上安装 UDK,但移动设备的要求是什么?

虽然我们将在后续的逐步和图解章节中详细介绍如何在实际设备上部署你的游戏以及涉及的所有问题,但在成为 UDK iOS 开发者方面,还有一些非常重要的初始话题需要澄清。

首先,根据 Epic Games 的说法,目前支持 UDK iOS 游戏制作的设备如下:

  • iPhone 3GS

  • iPhone 4/4S

  • iPad

  • iPad2

  • iPod Touch 第三代(除 8GB 容量的第三代设备外)

  • iPod Touch 第四代

如果你有一台较旧的 iOS 设备,那么很遗憾,你将无法为其执行 UDK 开发。值得注意的是,iPad 第三代目前可以通过使用 iPad 2 的系统设置在 UDK 中运行,并且在你拿到这本书的时候,它很可能将拥有自己的系统设置而得到全面支持。

此外,你需要在设备上运行 iOS 3.2 或更高版本,并在你的 PC 上安装 iTunes,以便进行 UDK 开发。然而,为了将你的游戏发布到 iOS App Store,你将需要使用 Macintosh 计算机,我们将在第八章 发布和盈利你的游戏中使用它。

如果你能够满足所有给定的要求,那么我们可以继续开发这一章和随后的章节。

然而,我们将在最后几章回到这个领域,涵盖如 Unreal 前端和 iOS 配置文件等主题,这些主题对于游戏后期制作、部署和最终分发至关重要。

Unreal Remote 的指南

因此,在处理完这些实际问题之后,让我们来尝尝使用 UDK 为 iPhone 开发的感觉吧!

在本节和本章中,我们将进行的第一次尝试确实是一次小规模的尝试,但它仍然是 iOS 游戏开发使用 Unreal 引擎能力的良好展示,特别是在与玩家交互方面。

它使用了我们在本书后面将要利用的两个重要概念;UDK 远程和移动预览器。

UDK 远程是一个由 Epic Games 设计的应用程序,用于推送、触摸以及倾斜控制——基本上您需要控制 iPhone 或 iPad 游戏的所有操作——从移动设备传输到您的开发机器(PC)。

移动预览器是一个可以在主 UDK 可执行文件内部触发的选项,它可以用来在您的 PC 上运行移动 UDK 游戏。它是为了进行小规模测试而创建的,与在编辑器中直接玩游戏一样,也是主 UDK 可执行文件中的一个选项。想象一下,这个选项就像是模拟您游戏在特定移动设备上的外观。然而,这个选项并不完全完美,请记住,PC 上的图形处理单元会比您的 iOS 设备更强大,这可能导致渲染内容时速度更快。一些视觉效果的结果也可能不同,例如抗锯齿。一个好的做法是偶尔将游戏部署到移动设备上,以确保您没有超出其技术能力,并且一切看起来都如预期的那样。我们将在后面的章节中学习如何做到这一点。

这两个应用程序(UDK 远程和移动预览器)可以协同工作——正如我们将看到的!

本节中的示例在没有您的 PC 和 iOS 设备连接到 Wi-Fi 网络的情况下将无法工作;仅连接到 3G 网络是不够的。请确保您的设备已开启 Wi-Fi 设置,并且与同一网络连接,否则以下示例将无法工作。

本书的前两章将使用 iPhone 3GS 作为示例,而后续章节将使用 iPad 2。

操作时间——下载和安装 UDK 远程

  1. 在做任何事情之前,启动 UDK 编辑器。然后,转到 iTunes Store,作为一个 iOS 用户,您应该已经相当熟悉了。在以下屏幕截图中输入udk remote操作时间——下载和安装 UDK 远程

  2. 点击免费按钮将其更改为安装。再次点击按钮以在您的 iOS 设备上安装 UDK 远程应用程序。

    Epic Games 实际上也将这个应用程序免费提供,就像 UDK 本身一样,所以它不会花费您任何费用。

    操作时间——下载和安装 UDK 远程

  3. 使用新应用程序同步您的设备。确保您的 iOS 设备已经正确同步,通过断开连接并查看您的设备菜单,直到找到已安装的应用程序。操作时间——下载和安装 UDK 远程

  4. 通过点击图标启动 UDK 远程应用程序。您将被提示填写有关您机器的详细信息。

    为了让 UDK Remote 正常工作,您需要更改的唯一设置是输入您计算机的 IP 地址,以便您的 iOS 设备能够与其通信。现在我们先保留其他设置不变。

    然而,在我们解决 IP 地址问题之前,您可以快速点击您的 iOS 设备上的完成按钮来检查 UDK Remote。

    现在,您应该会进入 UDK Remote 的运行时屏幕,如您所见,它非常基础。

    当然,如果没有在这台计算机(您的计算机)和主机机之间设置通信,这是不可能工作的,正如您可以从错误信息中看到的。

  5. 您可以通过点击屏幕右上角的i按钮回到设置,如以下屏幕截图所示:操作时间——下载和安装 UDK Remote

    那么,“我的 IP 地址是什么?”您可能会问。如果您不知道,有一个快速的方法可以找到它。

  6. 在您的计算机上,点击开始菜单并选择所有程序|附件|命令提示符,如以下屏幕截图所示:操作时间——下载和安装 UDK Remote

  7. 当您到达命令提示符时,输入ipconfig并记下出现的 IPv4 地址。回到您 iPhone 上的 UDK Remote,点击计算机地址并输入命令提示符中显示的 IPv4 地址,然后点击确定按钮完成。操作时间——下载和安装 UDK Remote

  8. 返回到设置中的UDK Remote(如您所见,您可以使用多个计算机与该应用程序进行接口)并点击完成操作时间——下载和安装 UDK Remote

  9. 现在,在您的 IP 地址和端口旁边,您将看到以下信息,如以下屏幕截图所示:操作时间——下载和安装 UDK Remote

  10. 您的 IP 地址和端口也将以黄色突出显示,这意味着您还没有与 UDK 连接,所以让我们接下来做这件事。

  11. 打开我们在上一节中启动的 UDK 编辑器。在主工具栏上,您会在右上角看到一个看起来像 iPhone 的图标,旁边有一个播放按钮。这是在移动预览器中播放按钮。

  12. 或者,您也可以从上面的菜单中选择构建|在移动预览器中播放。这在上面的屏幕截图中显示:操作时间——下载和安装 UDK Remote

  13. 等待它启动(即使是像默认场景这样非常基础的场景,也需要几分钟时间)然后查看您的 iPhone。之前提到的等待连接...将变为连接到...,如以下屏幕截图所示:操作时间——下载和安装 UDK Remote

你将看到 UDK Remote 的设置(其中大部分都是相当直观的)。

发生了什么?

当你在 iPhone 上用手指拖动时,请看你的电脑屏幕,你现在可以通过无线网络使用你的 iPhone 在电脑上的三维空间中导航基本 UDK 场景!

使用多点触控功能来尝试这个功能,感受一下你可以用提供的交互做什么。

如以下截图所示,左侧的圆形触摸板可用于移动,而右侧的触摸板可用于侧滑。

发生了什么?

如果你之前玩过 3D 游戏,特别是第一人称射击游戏(不一定是 iOS 平台上的),这将是一个非常熟悉的方式来控制场景中的玩家!

在 iOS 游戏开发的第一尝试上花些时间进行实验!

发生了什么?

操作时间——匹配移动预览器设置与你的 iOS 设备

现在我们已经在 iOS 设备和我们的 PC 之间建立了交互,让我们确保它是为我们要使用的特定设备创建的。幸运的是,这样做非常简单。

  1. 在我们继续之前,你应该知道你可以更改 Mobile Previewer 上的某些选项,实际上你也应该这样做,以便适应你的设备。点击以下截图所示的编辑移动预览器设置按钮:操作时间——匹配移动预览器设置与你的 iOS 设备

  2. 由于在本章中我们使用的是 iPhone 3GS,我将其更改为允许这样做,如果你想的话,你也可以将显示方向从横幅更改为纵向。这完全取决于你正在开发的游戏类型。

    让我们保持横幅模式。这就像以下截图所示:

    操作时间——匹配移动预览器设置与你的 iOS 设备

发生了什么?

无论你拥有哪种 iOS 设备,你现在都可以使用 UDK Remote 和 Mobile Previewer 来测试所有想法,并在后续章节中最终测试我们的原型游戏,所以我们已经迈出的这一步是非常重要的!

说到原型游戏,我们到底要开发什么?

描述《城市战士》的概念,一个第三人称射击游戏标题

我们之前讨论过《战争机器》以及尝试在 iOS 设备上以相同程度详细和复杂地重新创建它的难度,记住,《战争机器》是基于同一引擎开发的(UDK)。

那么,我们不妨试试看,看看我们能接近到什么程度?

与其试图用 UDK 制作一个更休闲、更基础的游戏,不如将本书中完成的工作视为创建你自己的 AAA 级游戏的小型构建块,这可能会更有趣!

我们将游戏(暂时且可能不是特别富有想象力)命名为城市战士,它将具有以下特点:

  • 它是一个非常典型的单人第三人称射击游戏,非常类似于《战争机器》的风格

  • 可玩 3D 环境将(主要是)一个大型开放式城市区域,将具有交互式元素,例如当你走近时门会打开

  • 玩家将在游戏世界中穿越,根据他移动时选择的路径参与不同的场景

  • 我们将为敌人创建自己的自定义 AI 系统

  • 我们将添加我们自己的自定义资产,为玩家提供独特的体验

目前,尽管范围很广,但这份简报对我们来说已经足够好了,我们可以开始探索 UDK 的非常广泛的功能,以适应一些先前的目标,并逐步深入到游戏的一些更细微的细节。

我将在接下来的每一章中回到这个关键的游戏想法,讨论我们已经取得的进展,更重要的是,它是如何融合成一个连贯的游戏体验的。

快速问答

让我们看看你是否能回答这些问题,你应该只需阅读这一章的简介就能回答所有这些问题。

  1. 以下哪些 iOS 设备不支持 UDK?

    a. iPad

    b. iPhone 2G

    c. iPad 2

    d. iPad(第三代)

  2. 我们如何找到我们的 IP 地址?

    a. 它已经在 UDK Remote 中为我们提供了

    b. 我们从 ipconfig 输出中获得的 IPv4 地址

    c. 输入随机数字,直到它工作

    d. 使用命令提示符使用 Link-Local IPv6 地址

  3. 我们在哪里以及如何找到 Epic Games 为我们提供的 UDK 中的示例/样本地图?

    a. Epic 不提供示例

    b. 在 UDK 网站上单独下载它们

    c. 查看 Epic Games 社区页面上的教程

    d. 它们位于我们的 UDK 安装中的“内容 | 地图 | 移动”文件夹中

  4. 我们如何确保移动预览器已定制到我们的 iOS 设备或更改 iOS 游戏的屏幕方向?

    a. 当我们玩游戏时,它会自动完成,取决于它的握持方式

    b. 它是我们设置的 UDK Remote 应用程序上的设置

    c. 它位于“编辑移动预览器设置”中

    d. 我们无法更改使用的设备

摘要

希望你喜欢用 UDK 成为 iOS 游戏开发者的第一步!

尽管还有很多事情要做,但我们已经在本章中涵盖了以下内容:

  • 了解 UDK 是什么

  • 看到了使用示例可以/不能实现什么

  • 探索了 Epic Games 的专用 UDK 网站,并下载和安装了应用程序

  • 下载并安装了 UDK Remote

  • 在 iOS 平台上使用 UDK 开发游戏的概述

  • 将您的设备与 PC 上的 UDK 接口,并使用它进行与移动预览器的基本交互

  • 讨论了我们将要在后续章节中探讨的基本原型游戏的简要概述/概念

在下一章中,我们将更深入地探讨使用 UDK 编辑器(以及做比仅仅玩 UDK 远程和移动预览器更多的事情!),从了解应用程序界面的基础知识到为你的第一个射击游戏添加基本构建模块。

第二章. 开始成为城市战士,第三人称射击游戏

到目前为止,我们现在已经安装了 UDK,并且已经让 UDK 远程工作,这样我们就可以使用 iOS 设备的输入在 PC 上玩游戏了。这是一个很好的开始,但现在是我们动手开始构建东西的时候了。在本章中,我们将基于第一章的内容,迈出构建我们第一个级别的第一步。

在本章中,我们将:

  • 了解 UDK 环境和您需要了解的界面方面

  • 将画笔构建到我们的世界中,以创建室内空间

  • 在该空间中添加纹理、照明和 3D 模型

那么,让我们开始吧!

开始

当开始使用 UDK 时,您可能会对编辑器初次看起来多么复杂或它可能不会按您想象的方式工作感到沮丧。为了帮助过渡到这些工具,我们将通过查看 UDK 的基本知识来逐步进行这个过程,从我们创建第一个级别时应该知道其存在的 UDK 界面的关键部分开始!

UDK 界面的简要浏览

让我们先看看 UDK 界面,这是您启动应用程序并关闭欢迎菜单后看到的界面。虽然我们在上一章中只是简单地了解了所有菜单和按钮的功能,只是为了让移动预览器工作,但了解您可用的所有工具非常重要,因为游戏开发者可以做的最重要的事情之一就是知道如何使用某个工具来完成特定任务。这样您就可以在屏幕上实现您所想象的任何内容。

在一定程度上,这真的需要时间,尽管我肯定会推荐通过点击它们并尽可能多地实验它们(而不是在实际项目的最后阶段)来探索界面和截图中所显示的所有功能,这样界面的基础知识最终会变得像第二本能一样自然。我还应该指出,我不会涵盖所有界面;其中一些涉及我们现在不需要或由于我们创建 iOS 游戏的目标而无法使用的先进功能,尽管如果您想进行多平台开发,我会简要介绍一些由于它们在非 iOS 游戏中的重要性而没有使用到的功能。

UDK 界面的简要浏览

工具箱侧边栏

我们将首先介绍您在左侧看到的图标。这是按模式、画笔、CSG、体积、选择转到分类的工具箱,标签位于与它们相关的按钮上方。模式非常重要,所以让我们首先看看这些。

小贴士

如果您不记得某物是什么,如果您的鼠标光标在某个东西上停留一段时间,图标的名字/功能就会显示出来;这将非常方便使用以下指南并识别您所在的界面部分及其功能!

模式

模式包含与你的级别交互的所有不同方式。具体来说,它包含以下功能:

  • 相机模式: 这是 UDK 的基本默认相机模式。你将在这个模式下工作很多!

  • 几何模式: 这提供了编辑几何形状和特别是 CSG 刷子的基本工具。(对于与在应用程序中执行的操作类似的多方面操作,例如 Autodesk 的 3D Studio Max)。它允许我们做的其中一件好事是构建到网格中的对象,这使得在级别中不出现空洞变得更容易。我们将在第六章 整合一切中广泛使用它。

  • 地形编辑模式: 此模式用于创建地形。

  • 纹理对齐模式: 此模式用于在刷子上正确对齐纹理,例如旋转等操作。

  • 网格绘制模式: 这是一个编辑器中的顶点颜色绘制工具。

  • 静态网格模式: 这是一个工具,用于在级别中快速添加静态网格(通过加快其放置过程)。如果,例如,使用多个静态网格来填充场景,这将非常有用。

  • 景观模式: 这是一个具有改变地形能力的景观创建工具。如果你熟悉高度图数据,你可以导入高度图数据。然而,iOS 系统上的 UDK 不支持地形,因此我们不会使用它。

  • 植被模式: 这是一个用于创建植被的半自动工具。

请参考截图了解这些模式。

模式

刷子

刷子是我们可以带入世界的几何形状。以下是我们可以创建的可能选项,我们将在讨论界面之后讨论几何形状实际上是什么以及它是如何工作的。刷子中可用的功能包括:

  • 立方体: 这是一个立方体/盒子形状的刷构建器

  • 圆锥体: 这是一个圆锥体形状的刷构建器

  • 曲线楼梯: 这是一个曲线楼梯刷构建器

  • 圆柱体: 这是一个圆柱体形状的刷构建器

  • 直线楼梯: 这是一个标准的、直线的楼梯刷构建器

  • 平面: 这是一个类似于二维平面的刷构建器(如果需要,也可以添加细分)

  • 螺旋楼梯: 这是一种另一种曲线楼梯刷构建器,但这次在底座角度上没有限制(之前的曲线楼梯有一个限制,即 360 度,因此这个的名称是螺旋而不是曲线)

  • 四面体(球体): 这是一个类似于球体的 CSG 刷构建器

  • 卡片: 这是一个刷构建器,由于其外观,可以用于使用纹理(例如使用两个纹理而不是模型来创建低成本树木)创建各种特殊/视觉效果

请参考截图了解这些选项:

刷子

工具箱的下一部分包含笔刷 CSG 操作(再次,有关术语的更详细解释,请参阅下一节“体积和选择”,但可以简单地说,这些是在将笔刷塑造成有意义的可玩水平中的关键):

  • 添加:这使用笔刷构建模式中的最后一个选择,并以此作为模板,在水平面上创建一个加法笔刷

  • 减去:这与前面的选项使用方式相同,但这次会创建一个减法笔刷

  • 相交:这将仅显示与其他相交笔刷重叠的部分,其余部分不可见

  • 去交:这是先前操作的逆操作

这些工具在以下屏幕截图中显示:

笔刷

体积和选择

体积选择包括以下功能:

  • 添加特殊笔刷:这有助于创建更复杂的笔刷。

  • 添加体积:与点击 CSG 操作将创建一个新的笔刷类似,点击添加体积将创建一个具有特殊属性的几何体。体积是不可见的,但可用于所有 sorts of effects like creating water, lava, or triggering different events. Feel free to play around and see all of the kinds of things you can do. We will be using many different kinds of volumes in this book.

  • 仅显示所选内容:这个功能(与其他三个选择按钮一样)在处理繁忙和/或杂乱的水平面上进行选择时非常有用;这是一个仅显示您编辑器/游戏水平中选定角色的工具。

  • 隐藏所选内容:这是一个用于隐藏您水平面上选定角色的工具(与前一个功能的相反)。

  • 反转选择:这是一个用于反转先前操作的工具。

  • 显示所有内容:这是一个重置工具,用于选择操作,以便在编辑器中再次显示所有角色。

请参考屏幕截图了解这些功能:

体积和选择

转到并构建笔刷

最后,我们有转到演员构建笔刷),与前面的工具一样,它们是选择工具,用于帮助恢复到视口中的演员或笔刷。再次强调,这些工具可能非常有用,也许在本章中不是那么有用(因为在一个只有一间房的水平中很难找不到您的构建笔刷!)但一旦您的游戏开始扩展,您会发现您会越来越多地使用它们,以节省在日益复杂的 UDK 编辑器结构中查找时间。以下屏幕截图显示了此工具:

转到并构建笔刷

视口工具栏

现在让我们看看视口工具栏。您目前正在使用的每个视口上方都有一组图标,我们称之为视口工具栏。默认情况下,UDK 使用四个视口,就像大多数 3D 建模程序一样。然而,还有其他选项,我们将在第五章中讨论,即城市战士的动作序列

我们有以下视口从左到右:

  • 视口选项:这为您提供了许多选项,例如在视口中显示每秒帧数。应注意的是,许多选项可以打开和关闭(例如上述选项),但也可以作为图标(如下所述)使用。

  • 视口类型:您可以在透视、顶、前之间切换。

  • 实时预览:这将显示游戏运行时的外观,打开音效和粒子系统。然而,这确实会影响编辑器的速度和性能,因此应谨慎使用,或仅在必要时使用。

  • 下一个 11 个图标从Brush WireframeLighting Only with Texel Density切换视口中的各种视图到用户所需的任何视图。

  • 游戏视图:这展示了运行时将看到的可视化(例如,点击默认透视视图端口以查看所有线框消失)。

  • 锁定视口:这在一定程度上是自解释的,但将锁定的是之前描述的转到动作,而不是视口本身。

  • 锁定选定的演员到相机:这将“锁定”按钮/图标点击后的下一个演员选择到视口相机。然后您可以移动相机并再次点击此按钮,演员也会被移动。这实际上是一个在视口中非常快速地移动关卡/游戏部分的有用工具。

  • 级别流体积预览和后处理体积预览:这将启用在给定/选定的视口中可视化流和后处理操作。后处理在 iOS 设备上的 UDK 中不起作用,并且由于我们没有使用多个关卡,我们没有必要使用级别流体积,因此我们将不会使用这些。

  • 相机移动速度:这将允许您更改视口相机速度(提供四种设置/不同速度)。

  • 在视口中播放:这将允许您在视口中播放游戏,这对于原型设计非常有用,但不会代表您在 iOS 上的游戏。

  • 拆分浮动副本:这将取消连接给定的视口到四个视口模式。

  • 最大化视口:这将最大化一个视口(暂时消除四个视口模式),再次点击时将恢复到原始状态,这对于快速缩放查看区域或特定视角非常有用。

请参考截图中的这些选项:

视口工具栏

工具栏

现在让我们移到屏幕顶部,紧接在主菜单栏下方,探索工具栏中找到的所有图标:

  • 创建新关卡: 这将创建一个新关卡,但在 UDK 询问你保存当前关卡之前不会创建

  • 打开现有文件: 这将加载一个已保存的关卡;同样,前面的提示也适用于此

  • 下拉菜单: 这是一个用于查找最近访问过的关卡的功能

  • 切换地图文件为收藏: 这是一种将 UDK 关卡标记为收藏关卡的方式

  • 保存当前关卡: 这将保存你的关卡

  • 保存所有关卡: 这将保存多个关卡

  • 保存所有可写包: 这将保存所有可写包

  • 撤销...: 这相当自解释,但请记住,在关卡进行构建...过程之后,这将不起作用

  • 重做...: 与前面的规则相同!

  • 选择模式: 这是一个工具,只能选择关卡的部分,而不能以任何方式操作

  • 平移模式: 这是一个工具,可以移动关卡的部分

  • 旋转模式: 这是一个工具,可以旋转关卡的部分

  • 缩放模式: 这是一个工具,可以均匀地缩放关卡的部分,在 X、Y 和 Z 轴上组合

  • 非均匀缩放模式: 这是一个工具,可以非均匀地缩放关卡的部分,例如,在特定的一个轴上而不是三个轴上拉伸

  • 参考坐标系: 世界和本地空间适用(两种可用模式)作为影响变换的坐标系

  • 查找演员: 这是一个在包含许多不同演员的更复杂关卡中定位演员的有用工具

  • 打开内容浏览器: 这将打开 UDK 的资产库窗口;我们将在本章后面查看它

  • 打开 Unreal Kismet: 这将打开 Unreal Kismet,它是 UDK 用于脚本事件、序列和其他复杂任务的视觉脚本工具

  • 打开 Unreal Matinee: 这将打开 Unreal Matinee,它是 UDK 创建电影场景以及涉及定向运动的其他许多事情的方式

参考以下截图:

工具栏

沿着工具栏继续,我们有以下选项:

  • 到远裁剪平面的距离: 这是一个远裁剪平面滑块,通常用于性能优化

  • 允许半透明选择: 这是一个图标,有助于选择 UDK 关卡/游戏中的半透明部分

  • 包含到选择: 这是一个自解释的选择工具

  • 低质量材质: 这允许用户在允许的情况下在对象上显示低质量材质

  • 为可见关卡构建几何形状: 这将为你在工作的关卡创建关卡几何形状

  • 构建照明: 这将为你在工作的关卡创建照明

  • 构建路径: 这将为你在工作的关卡创建路径

  • 构建覆盖节点: 这将为你在工作的关卡创建覆盖节点

  • 构建所有:这将创建上述所有内容。通常,当你正在制作关卡时,你不需要每次对游戏进行小改动时都使用此选项来查看游戏运行的效果。但记住,你不能撤销构建的内容。同样,对于较大的关卡,如果你只在工作照明上并且想要更新你的地图,你不需要构建所有内容,只需使用上述按钮即可。

  • 构建所有并提交到源控制:这将构建所有内容,并使用版本控制,这对于跟踪特别是大型/团队项目非常有用。然而,这并不是默认选项。

  • 照明质量设置:这些是照明设置;可用的选项有预览、中等、高和制作。

  • 全屏模式:这会将编辑器本身切换到全屏模式。

  • 切换实时音频:这是编辑器中的音频按钮,可以通过右键单击并使用结果滑块来调整音量。

  • 模拟移动功能:这用于渲染模拟,将其更改为移动模拟,以更好地近似移动设备上的结果(从图形角度来看)。

  • 在 iOS 设备上安装:这一点不言而喻,这是一个我们将在第八章 发布和盈利你的游戏 中使用的按钮。

  • 移动预览器:我们已经使用过这个功能了,所以你应该知道它是什么!不用说,我们还会更多地使用它。

  • 编辑移动预览器设置:我们已经使用过这个功能了,所以你应该知道它是什么。

  • 在 PC 上启动此关卡:这启动了游戏/关卡的 PC 运行时,但由于我们只进行 iOS 开发,我们不会使用它,因为它不模拟移动输入或使用用于模拟移动渲染的 OpenGL 渲染器。

  • 启用 Kismet 调试:这可以打开或关闭,有助于 Kismet 序列调试。

  • 在编辑器窗口中播放此关卡:这一点不言而喻,对于快速原型设计非常有用,但它并不能代表 iOS 设备能够做到的事情。

参考以下截图:

工具栏

探索主菜单栏

现在让我们转到屏幕顶部的工具栏。我将比之前的功能更快地介绍这一部分,因为大多数功能都是重复的(我们已经介绍过它们,并且在工具栏菜单的不同部分都有重复)并且其中一些功能较为高级,我希望避免在本书的这一章中使 UDK 的前几个步骤过于复杂。然而,快速浏览这些选项仍然是有价值的,因为这里也有很多有用的选项。

这些是主菜单栏选项:

文件

和大多数程序一样,在文件菜单下,你可以打开文件、保存它们,并创建新的文件。你有机会将文件导入到你的关卡中,或者将你的关卡导出为文件。菜单底部允许你轻松选择你最喜欢的关卡以及你最近打开的关卡。

注意,在 UDK 中保存没有快捷键,通过点击Ctrl+S你实际上是在创建一个减法刷子。确保通过选择文件 | 保存来保存你的关卡。

编辑

这是正常撤销/重做功能的位置,程序通常都有,以及访问我们之前讨论过的一些额外功能的方式,例如平移、旋转缩放对象的能力。你还可以访问你关卡内对象的剪切、复制、粘贴、复制删除功能。底部部分允许以不同的方式选择不同的对象,值得注意的是查找演员,它将带你到一个菜单,显示你关卡中的所有内容,这使得找到你正在寻找的特定内容变得容易。

查看

视图菜单提供了查看 UDK 内部所有窗口的能力。可以访问所有不同类型的浏览器窗口,以及演员、表面或关卡本身的属性。你可以调整关卡在拖动、缩放和旋转对象时的吸附属性。还有选项自定义你的 UDK 界面,例如更改你的视口或切换全屏模式的使用。

刷子

刷子菜单包含了我们之前在工具栏侧边栏中讨论的所有内容,并额外提供了导入或导出你创建的不同刷子的选项。

构建

构建下拉菜单包含各种关于重建你的关卡选项。该菜单还允许你只构建你更改的内容,使其运行更快;除非你之后有所更改,否则你不需要每次都重建你的光照,因为通常在大关卡中这需要很长时间。

播放

主菜单栏的播放部分提供了根据你创建的平台以不同方式播放你的游戏的选择。我们将在本书的大部分内容中使用移动预览器,但我们将展示如何在第八章中安装到 iOS 设备上,发布和盈利你的游戏

工具

然而,工具菜单似乎包含了很多独家(非图标)内容,例如检查错误地图(编译它而不实际构建它)的能力,清理 BSP 以及其他功能,尽管目前这些对我们来说并不那么重要,因为它们不会显著影响初学者创建基本游戏的道路。所有这些选项都在下面的屏幕截图中显示:

工具

预设

偏好设置工具栏,这是最长的工具栏,有许多不同的选项可以切换开启或关闭,以自定义您的 UDK 体验。也值得注意,很多初学者经常会在这里勾选或取消勾选某些选项,通常是通过使用键盘快捷键或意外操作,然后当某些功能无法正常工作或不可见时,会感到非常困惑!因此,了解这些选项是很有价值的,这样您可以尝试自己解决问题。以下截图显示了偏好设置中可用的选项:

偏好设置

帮助

最后,帮助部分包含有关在线帮助、论坛、正在使用的 Unreal 版本、启动提示以及 Swarm-UDK 为多核计算机提供的分发解决方案(这有助于加快照明计算速度)的信息。

控制台栏

在结束对界面的查看之前,让我们最后关注屏幕底部被称为控制台栏的部分。请参考以下截图:

控制台栏

在这部分,有一个命令行,您可以直接在 Unreal 编辑器中输入控制台命令。我们将在本书的后面部分使用控制台命令,但是在实际游戏而不是编辑器中,但这个选项是存在的。

此外,还有一个源代码控制图标(默认情况下未设置),一个照明和路径构建状态按钮以及一个包图标。

将鼠标光标移动到 UDK 编辑器这一部分的底部右端,您还可以获取鼠标光标位置(坐标)的信息,如果您已选择了一个对象,还可以获取该对象本身的信息。

此外,您还可以使用四个 DrawScale 文本框(DrawScaleDrawScale3D XDrawScale3D YDrawScale3D Z)对项目执行手动操作。还有拖动、旋转和缩放网格,这在创建关卡时非常重要。如果禁用此选项,当项目被转换时,它可以被移动到任何位置,造成空洞。例如,如果您尝试通过在添加式笔刷上放置减式笔刷来创建门,如果笔刷偏移很小,未被笔刷覆盖的部分将形成一堵墙。在构建我们的实际游戏关卡时,我们将充分利用这一点。

最后,自动保存功能也在这里,如果 Unreal 崩溃或破坏了您的关卡,它将自动将地图保存到备份文件中。安全总比后悔好!以下截图显示了所有这些设置:

控制台栏

键盘快捷键

最后一点注意事项;键盘快捷键。

UDK,就像所有 3D 设计应用一样,大量使用了这些功能(正如您已经从截图中所见),您可以使用键盘随心所欲。不过,这里有一条建议;如果您使用其他 3D 应用(或者确实任何带有快捷键的应用),请注意,因为 UDK 是一个复杂的工具,您可能会像我之前提到的那样,不小心启动了某个功能或更改了您不想更改的设置,仅仅是因为您当时没有记住正确的键盘快捷键。

这是我们所有人都会遇到的情况,但如果我们能避免的话,最好还是避免。

话虽如此,随着本书的继续,除了展示如何从菜单中访问内容之外,我还会介绍我在使用该工具时经常使用的快捷键。

创建环境和关卡设计的基础

在我们深入探讨之前,利用之前描述的界面以及将到目前为止获得的知识应用于创建一个交互式关卡(您的第一个关卡!)之前,让我们先深入研究一些理论。

CSG 笔刷

我们一直在使用“笔刷”和“CSG”这两个词,所以定义一下它们实际上是什么是个好主意。构造实体几何CSG)是 UDK 中用于世界几何的一个术语,UDK 通过您在关卡中创建的笔刷来创建世界几何。另一方面,笔刷是用于定义空间的三个维度对象。我们以四种不同的方式定义这个空间:添加、减去、相交非相交

静态网格

静态网格,另一方面,是用于在 Unreal/UDK 中形成游戏关卡的多边形创建,这些网格在世界上不移动,但不用担心,我们也会在未来的章节中介绍如何创建移动对象。在本章中,我们将放置网格,让我们的环境除了墙壁之外还有其他东西可以看。

在本书的后面部分,我们将探讨如何从 3D 建模包中导入静态网格到 UDK 中,从而展示出该引擎在创建世界和世界网格方面的无限潜力,前提是开发者具备一些基本的 3D 资产创建技能。

CSG 笔刷和静态网格之间的区别

那么,使用笔刷和/或静态网格之间的区别是什么呢?为什么使用其中一个而不是另一个?

您应该知道,在 UDK 中,静态网格现在实际上是专业人员在世界创建中的首选,有两个简单的原因:性能和美学。使用静态网格要快得多,并且(如果您使用的是高质量的网格!)它们看起来会比笔刷好得多。笔刷也导致了或导致了相当多的问题,如造成孔洞,而静态网格提供了解决此类低效问题的必要解决方案。

然而,刷子仍然有其位置。在游戏行业中,许多游戏设计师会使用刷子来勾勒出关卡,并确保脚本正确运行。这样设计师就能专注于使游戏有趣,并确保关卡的功能性完成,以确保一切都能正常工作。我们将在这个章节以及接下来的章节(直到第六章 Chapter 6,整合一切)中使用这种思维方式。关卡完成后,关卡设计师可以将关卡交给环境艺术家,然后艺术家将用他们创建的网格替换刷子,这就是我们在第七章 Chapter 7,为城市战士的高级内容创建中将要做的。话虽如此,每个工作室都是不同的,所以一个公司的流程可能与另一个公司完全不同。

在视口中移动

点击视口内部将为你提供访问该摄像机的权限。在本书的整个过程中,我们将使用各种视口进行工作,因此你将使用以下方法在关卡中高效导航:

  • 按住左鼠标按钮LMB)并向左或向右移动将使摄像机左右旋转,而向上或向下移动将使摄像机沿 X 轴前进或后退。

  • 为了四处查看,使用右鼠标按钮RMB

  • 左键(LMB)和右键(RMB)的组合会使你的摄像机在 Z 轴上下平移,或在 Y 轴的左右两侧移动。

鼠标的滚轮滚动将沿着摄像机的 X 轴平移,从而产生放大和缩小的效果。

在游戏中添加世界几何和纹理

现在我们已经完成了所有的基础工作,让我们开始从头创建我们自己的第一个关卡!

行动时间——创建一个基本房间

  1. 首先,在文件下选择新建,然后从弹出的菜单中选择空白地图选项。此时,你应该能看到以下截图所示的内容:行动时间——创建一个基本房间

  2. 右键点击立方体刷子以打开刷子构建器对话框。在弹出的窗口中更改设置,如图所示(在X填充1024,在Y中输入512,在Z中填充16)。点击构建关闭。现在你的构建刷子大小就是你想要的了!!行动时间——创建一个基本房间

  3. 点击位于侧工具栏下CSG选项下的CSG 添加操作图标。你应该能看到你创建的第一个几何形状。行动时间——创建一个基本房间

  4. 左键单击建造刷以选择对象。你应该在建造刷的某个地方看到三个箭头,它们各自面向不同的轴,并具有自己的颜色。这被称为小部件,但如果每个轴看起来都像箭头,那么它处于平移模式。如果不是这样,按Space键直到它看起来像以下截图中的样子。使用平移工具,设置为平移,将刷子向上拖动,然后再次点击CSG 添加按钮。因为我们只是展示工具,所以不必太担心高度,但尽量与截图匹配。你现在有了你的天花板几何形状。在这个阶段,你可能想要开始最大化视图(在这个例子中是透视),来回切换以获得更好的操作视图。创建基本房间的操作时间

  5. 选择建造刷后,点击旋转图标(或按Space键直到你看到下一张截图中的工具),在前视图中沿适当的轴旋转-90 度,直到得到以下截图所示的结果:创建基本房间的操作时间

  6. 将它移动到左侧墙的位置,然后在右侧轴上非均匀缩放以将其挤压到位。这一点很重要;现在它需要完美对接。正是在这一点上,你将不得不开始使用我们之前提到的底部右边的拖动、旋转缩放网格对接工具。参考以下截图:创建基本房间的操作时间

    这些会将你的变换对接到网格上,无论是移动、旋转还是缩放,从而为你提供一种更精确地将几何形状放置在精确位置的方法。

    真的非常重要,这些部分需要干净利落地对接,因为这是你需要习惯的练习。确保你的前两个部分(天花板和地板)也对接得很好,以及新创建的侧墙。

    要找到这个的正确设置需要一些练习,而且你经常会根据你正在做的事情(以及你所在的视图)改变你的对接设置,所以你现在需要习惯这一点。

    创建基本房间的操作时间

  7. 再次在左侧墙面上使用CSG 添加,然后按照同样的步骤对右侧墙、前墙和后墙进行处理,以创建一个封闭的房间。

    这与到目前为止我们所做的是相似的,应该不会出现问题。

    你现在正在逐渐习惯使用建造刷、移动、旋转和缩放变换、CSG 添加操作和对接工具。

    记住要在所有视图中工作,以确保你在三维空间中的操作能够很好地转换,并且正确地对接到网格上!

    一旦你完成了右侧墙壁以及前面和后面的墙壁,你应该会得到以下截图所示的结果,所有墙壁都干净利落地对齐到网格和彼此之间。

    纹理级别的时间——创建基本房间

发生了什么?

我们现在已经在 UDK 中完成了第一个房间!现在它可能看起来不多,但我们很快就会解决这个问题。

现在这是你的房间,在这个阶段,我们完成了这一章的刷子工具,但我们将回到下一章使用它们。在我们继续之前,还有一件事要做。我们创建的房间是封闭的,但实际上它是空的,我们应该能够进去。要做到这一点,按住鼠标左键(LMB)并向前移动以向前移动,同时按住 LMB + RMB 以上下移动,以便将自己定位在你刚刚创建的空间内部,欣赏它。

现在看起来还可以,但我认为它还缺少一些东西才能真正实现真实感。墙壁都是一样的!幸运的是,我们可以使用纹理以非常简单的方式让墙壁生动起来,让我们更接近 AAA 级质量。

发生了什么?

现在是应用纹理的时候了。

纹理级别的时间——纹理处理级别

  1. 通过按住Ctrl键并左键单击选择所有侧面墙壁(如前一张截图所示,我有三个,确保你也选择了后面的那个),然后最大化你的内容浏览器(这是当你运行 UDK 时默认打开的,我已经最小化了。如果你已经关闭了它,那么点击下一张截图中的图标)。

    内容浏览器是 UDK 的资产库界面。

    我们将广泛使用它来完成许多操作,但现在让我们先了解一下基本流程,以便我们挑选出三种不同的现有纹理,我们可以在场景中使用。

  2. 内容浏览器顶部的搜索文本框中输入brick。为了帮助说明我的意思,这在下一张截图中被突出显示:纹理级别的时间——纹理处理级别

  3. 左键单击并从结果中选择M_NEC_Walls_BSP_Brick1,然后点击出现的菜单中的Fully Load(如图所示)。然后最小化内容浏览器,因为我们现在想要应用我们的纹理。纹理级别的时间——纹理处理级别

  4. 在选定的墙壁表面上的任何位置右键单击(它必须在那里,而不是在未选择的墙壁上)。在出现的菜单中,选择应用材质:M_NEC_Walls_BSP_Brick1纹理级别的时间——纹理处理级别

    我们刚刚在 UDK 中完成了第一块几何体的纹理处理!

    我们将对它进行一点微调,但首先让我们也处理天花板和地板。

    纹理级别的时间——纹理处理级别

  5. 使用内容浏览器和相同的过程,但对于天花板选择M_NEC_Ceilings_SM_TURK182(在命令行中输入ceiling后),对于地板M_ASC_Floor_BSP_Tile01(在命令行中输入floor后)。

    您将看到下一张截图:

    进行动作——纹理化关卡

    这看起来不错(而且比之前好得多),但可以进行许多细微的操作来使其看起来更好。一个可能的选择是在某个区域进一步平铺(乘以)纹理。这样,根据房间的尺寸,比例会变得更加逼真,而不是扭曲(这可能会破坏游戏中任何虚拟世界的幻觉)。您将在自己的游戏/关卡中做很多这样的操作。

  6. 再次以相同的方式选择所有侧面墙壁,并在它们上右键单击。您将看到以下截图所示的菜单:进行动作——纹理化关卡

  7. 选择表面属性(4 个选中项)...,然后在结果窗口中将UTileVTile更改为33,然后点击应用。这如图所示:进行动作——纹理化关卡

刚才发生了什么?

我们现在已经迈出了在 UDK 中创建游戏关卡的第一步。我们现在有一个看起来确实像房间的房间,并且已经应用了适当的墙壁。现在我们有一个值得一看的房间,让我们完成最后几个步骤,以便我们可以在游戏中看到它!

为游戏创建照明

点光源是可添加的最简单类型的灯光。它们是向所有方向均匀传播光线的灯光,可以用来快速照亮场景,尤其是用于原型设计目的。

创建游戏照明

进行动作——照明关卡

然而,到目前为止,如果我们玩游戏,我们只会看到一片漆黑。这是因为游戏中没有灯光。现在让我们把它们放进去!

  1. 透视视图中,右键单击关卡的天花板方向,您应该仍然在那里,然后转到添加演员 | 添加灯光(点光源)。您将看到类似于下一张截图的内容:进行动作——照明关卡

    如您所见,灯光已被添加,场景的照明已经改变(顺便说一句,如果您愿意,可以将其向下移动一点,以免与天花板相交)。

  2. 切换回四视口视图,并将此位置大致放在场景中间(在顶部视图中),如图所示:进行动作——照明关卡

  3. 在任何视口中双击灯光。这将打开对象属性菜单。在弹出的窗口中,您将获得灯光属性部分。在该部分中,将半径的值设置为512,将亮度设置为2

    这将给中间区域带来明亮的光线,而对立的前后墙壁周围则较暗(以获得更具有氛围的外观)。

    其他设置也可以更改,但到目前为止,这应该足以让你对照亮场景有一个初步的了解。

  4. 现在是时候检查运行时看起来如何了。在我们这样做之前,UDK 需要知道玩家从哪里开始(否则我们无法进入运行时)。()在透视视图中房间的中间(大约)右键单击,然后选择添加演员|添加玩家开始

    我们现在需要构建它,以便在运行时看到它。

  5. 前往构建 | 构建全部。根据你的硬件,这可能需要一段时间。

  6. 当这完成时,点击移动预览器图标。你应该能看到我们的关卡出现。

你可以通过使用W, A, SD键或通过点击屏幕上出现的两个操纵杆来移动。如果你愿意,你可以使用你的 iOS 设备通过我们在上一章中设置的 UDK 远程来在场景中导航。以下截图显示了这一过程:

照亮关卡的行动时刻

刚才发生了什么?

恭喜!我们已经从零开始使用 UDK 完成了一个非常基本的第一个游戏关卡,它可以在 iOS 设备上运行!

为游戏创建演员和静态网格

为了总结本章完成的工作,让我们看看如何通过静态网格来丰富关卡(静态网格演员具有从动画到声音和物理学的附加属性)。然而,添加基本静态网格的过程与添加具有附加属性的网格是相同的,我们将从这里开始,以便首先熟悉基础知识。

行动时刻——添加静态网格细节

  1. 再次回到内容浏览器,在搜索栏中输入barrel。这如图所示:添加静态网格细节的行动时刻

  2. 确保你右键单击并完全加载我们将使用的油桶(在这种情况下为SM_Barrel_01)。

  3. 回到你的关卡,在地板上的任何位置右键单击。选择地板后,右键单击并选择添加静态网格:E3_Demo_Meshes_SM_Barrel_01

    注意,这可以通过多种方式添加;请参考本节开头我对这一点的解释。

  4. 双击油桶或按F4键以打开对象属性,并将绘制比例值更改为0.7

这只是缩放对象的一种方式的示例。你还可以使用我们通常用于墙壁的图标变换或使用在属性中看到的绘制比例 3D值来缩放它们。在 UDK 中完成同一件事有很多方法。以下截图显示了这一步骤:

添加静态网格细节的行动时刻

刚才发生了什么?

现在可以在等级中看到桶。你已经有了一个静态网格,但可以用这个概念做更多的事情,尤其是现在你已经掌握了第一个。

尝试英雄——添加多个静态网格以增加细节

现在尝试一些创意!在房间的不同部分添加一些这些元素。尝试保持它们结构外观的随机性。选择编辑 | 复制(或Ctrl + D),然后移动并旋转到合适的位置。

你将看到以下截图类似的内容:

尝试英雄——添加多个静态网格以增加细节

在这个阶段,你已经有了技能来开始尝试添加其他静态网格/演员来进一步丰富场景。

为什么不查看内容浏览器并看看除了桶之外还有什么适合场景,以进行额外的练习?

城市战士的进度,到目前为止

信不信由你,在完成前面的任务后,我们现在已经掌握了组装不仅仅是城市战士,而是几乎所有类型的带有环境的游戏所需的大部分基本技能!

在这本书中(以及我怀疑你未来的许多项目)我们所做的一切(以及我怀疑你未来的许多项目)都取决于对前面概念的掌握,因此我们开始于最基本的东西是很重要的。

例如,我们等级内的所有建筑首先将使用画笔来构建,稍后我们将用静态网格替换其中一些,但我们仍将在其他区域使用它们,因为我们试图优化我们的游戏以适应 iOS 平台。

照明,尤其是照片级照明,现在是计算机图形学中最大的挑战之一。它如此重要,以至于一些公司有专门负责创建等级照明的员工。与 iOS 平台合作使我们的照明能力远低于 PC 版本,使我们大多数实现都坚持使用点光源。第六章, 整合一切,简要介绍了如何在设计战斗场景中使用照明,因为照明往往可以决定一个等级的成功或失败。

最后,当我们向我们的游戏城市战士(或称为 Unreal 中的机器人)或任何类型的非活动、非交互式细节(如场景道具)添加敌人时,基本上与我们在早期通过使用内容浏览器添加对象的方式相同。

快速问答

  1. 内容浏览器在哪里可以找到?

    a. 在浏览器窗口下的编辑菜单中

    b. 在命令提示符中输入内容浏览器

    c. 通过在工具箱中点击内容浏览器按钮

    d. a 和 c

  2. 我们如何使点光源更亮?

    a. 重建我们的照明使一切变得更亮

    b. 使用缩放小部件

    c. 在灯光的对象属性中更改亮度属性

    d. b 和 c

  3. 为了压扁一个对象、画笔或静态网格,小部件应该设置什么设置?

    a. 缩放

    b. 翻译

    c. 非均匀缩放

    d. 旋转

概述

希望你已经喜欢上了这一章,现在对 UDK 丰富的功能不再感到畏惧!

在我们的游戏实现之前,我们还有很长的路要走,但我们仍在稳步前进。到目前为止,在这一章中,我们已经涵盖了以下内容:

  • UDK 界面方面的基本概述,你需要了解的,特别是针对初学者/中级游戏设计师创建基本内容所需的功能

  • 几何运算是如何工作的

  • 如何使用上述几何运算来组合一个虚拟房间

  • 如何为这个新创建的世界贴图

  • 如何照亮和照亮这个世界

  • 如何使用 UDK 仓库中的基本几何形状以外的 3D 模型来丰富它

在下一章中,我们将更深入地探讨 UDK 的使用,并开始更详细地规划游戏的基础,查看与本章所涵盖的内容相关和相连的更高级操作。我们还将了解这一点的具体影响/限制;在我们妥协游戏玩法的重要方面(如帧率)之前,我们能在多大程度上开始推动引擎的移动能力?

第三章。提升至下一个层次:内容丰富化

在这个阶段,我们有一个带有纹理的房间和一些围绕它的桶。这很好,但是为了给玩家在玩游戏时想要达到的不怀疑的沉浸感,我们需要添加一些其他的东西来使我们的世界看起来更可信。

在本章中,我们将:

  • 将我们的当前关卡放在网格上并创建一个外部区域

  • 创建一个可用于移动设备的自定义天空穹顶

  • 了解光照及其在 iOS 平台上的应用

  • 使用移动预览选项来显示我们的关卡在 iOS 设备上的外观

  • 添加粒子来使我们的世界充满生机

  • 使用雾来隐藏远处的对象以提高效率

话虽如此,让我们开始吧!

外部世界

游戏关卡发生在各种不同的地方。在太空站内、史诗般的奇幻城镇、森林中,甚至是某人的后院。所有这些地方共同之处在于,我们使用相同的基本工具来制作我们所能想象到的每一种环境!你将看到我们如何轻松地扩展我们在这里所做的工作,然后在第六章“整合一切”中,我们将探讨几何模式如何使区域遮挡变得非常容易,但就目前而言,让我们创建一个门。

行动时间——创建外部区域

目前,我们有一个单间房间,它有纹理和一些对象。这很好,但我们可以采取一些步骤来扩展这个世界,创造出更好的东西!首先,让我们重新分组,确保我们都在同一页上。

  1. 从顶部菜单中选择视图 | 视口配置 | 2x1 分割

    注意

    在确定 UDK 如何显示和为你工作方面,你有许多不同的选项可以使用,我鼓励你花时间找出你喜欢和不喜欢的东西。虽然有一个前视视口是不错的,但我更喜欢有一个更大的屏幕空间用于透视视图,这样我就能更好地了解我创建的区域看起来像什么。这更多的是我个人的偏好,但这就是我从现在开始要使用的方法。

  2. 顶视视图中,按住Ctrl + Alt,从稍高一点的左上角拖动到我们创建的房间的右下角。

    当你按住Ctrl + Alt并拖动鼠标时,你会注意到一个红色矩形正在被创建。当你松开鼠标右键时,该区域内的所有对象都将被选中。这在选择区域内的多个对象时非常有用。

    如果你无法在视口中看到整个房间,请使用鼠标滚轮向后移动。要移动到视口中,你首先需要在其中点击。要拖动屏幕,请按住鼠标右键并拖动到你想要移动的方向。

  3. 将视图缩放到房间的左上角,并在左侧上方的顶点上右键点击。你应该注意到房间正在对齐到网格。如果你没有看到任何变化发生,要么你完全对齐了,要么你关闭了网格锁定。要再次启用它,有一个带有左半边网格的数字右侧的复选框。确保该复选框被勾选。在侧面视图中右键点击,并在左侧上方的顶点上右键点击。

    小贴士

    到目前为止,我们的房间已经与网格对齐。我们希望按照网格来建造,这样会更容易确保一切无缝对接,并且我们的几何形状内部没有空洞,这是我在人们刚开始使用 UDK 时常见的问题。此外,请注意,右键点击一个顶点会将工具移动到该顶点。如果你想要通过某个顶点旋转一个对象,这就是你可以这样做的方式。

    动作时间——创建外部

  4. 保存你的关卡并点击构建全部。完成后,你会注意到关卡看起来没有变化,尽管它可能略有移动。

  5. 接下来确认网格间距大小为16。如果数字小于16,按住]键直到它变为16。如果数字大于16,按住[*]键。你应该会看到关卡上的网格根据按下的键而改变。

  6. 顶部视图中,左键点击左侧的刷子。右键点击进入透视视图中,调整你的视角以便可以看到墙的中间部分。

    记住,你可以按住左侧按钮左右查看,按住右侧按钮平移,同时按住两个按钮向前或向后移动。要在视图中缩放,只需使用鼠标滚轮。另一种移动方式是按住鼠标右键,并使用WASD键移动,就像在第一人称射击游戏中一样。

  7. 侧面视图中,点击看起来像 3D 立方体的按钮进入几何模式。在刷子的左侧上方的顶点上右键点击,并确保你处于平移模式,要么点击看起来像四个箭头交叉的菜单图标,要么按住Space键直到你看到平移的箭头。

  8. 按住Alt键,在顶部视图中使用红色箭头向下拖动刷子,直到它达到刷子略少于一半的位置。

    你应该注意到物体在移动,但是当你松开时,你会看到两个刷子在其位置。我们已经有效地复制了之前的墙,以便我们用它来创建一扇门。

    动作时间——创建外部

  9. 按住,右键单击并将顶视图向下拖动到我们新创建的刷子的底部。按住Ctrl + Alt,选择墙底部的两个顶点。你应该看到两个蓝色方块变为红色。将这些顶点向上拖动,直到它们接近刷子的另一端,留出足够的空间创建一个门。

  10. 几何模式中使用Ctrl + Alt将仅选择所选对象的顶点,这对于仅更改较大对象的小部分而不用担心其他事物非常有用。行动时间——创建外部

  11. 侧视图中,按住Ctrl + Alt并选择我们门的底部,然后将对象拖动到与之前创建的地面相同的高度。接下来,选择最后两个顶点,将其向下拖动,使其高于一个人通过的高度,但为门的上方区域留出空间。我的是 12 个方块高(每个方块 16 个单位)。

  12. 切换回相机模式(点击几何模式图标旁边的相机图标)并按F4键以访问门刷子的属性。在CSR Oper选项下,选择CSG_Subtract

  13. 你应该注意到门的颜色变成了金色。现在,如果您使用建造几何体,您将看到墙上有一个开口。这是因为减法刷子所做的就是移除本应添加到关卡中的任何内容,因此得名减法

    注意

    注意,您也可以通过使用建造刷子并选择刷子工具栏CSG_Add按钮左侧的按钮来创建一个减法刷子。两者都是完全有效的,但因为我们现在正在构建到网格,确保形状在正确的位置是至关重要的。

    行动时间——创建外部

  14. 透视视图中,左键单击墙壁并选择在内容浏览器中查找。你将注意到在内容浏览器中我们之前使用的材质已被选中。左键单击门的侧面。之后,右键单击同一侧面并选择选择表面 | 匹配刷子。注意,现在门的所有侧面都被突出显示了。有了这个,再次右键单击并选择应用材质:NEC_Walls_BSP_Brick1以应用材质。

  15. 侧视图中,点击地面。在顶视图中右键单击以更改视图,然后使用平移工具将地面移到门的前面。行动时间——创建外部

  16. 重建地图,你应该会在门的周围看到一些新的地面。

    你可能会注意到现在构建照明需要更多的时间。这是因为现在房间是开放的,它正在尝试在整个世界中绘制点光源的影响。然而,我们只关心房间和房间外部的区域,这不会花费很长时间。在 UDK 中,我们使用一种称为光量重要性体积的东西来让关卡知道哪些区域是重要的,哪些不是。

  17. 再次复制地面,但在侧视图中以向下方向复制。进入几何模式,并将盒子的每一侧延伸,直到盒子完全填充我们的两个房间。右键单击刷子,选择转换 | 转换为体积 | 光量重要性体积。现在盒子的颜色应该呈黄色。

  18. 保存并重新构建地图。你应该会注意到现在构建所需的时间少得多。

  19. Alt + 3进入不发光模式,以便我们更容易看到我们在做什么。进入内容浏览器,选择用于我们外部区域地面的材质,Material'UN_Terrain.Dirt.M_UN_Terrain_Dirt_04',它位于UN_Terrain包中。一旦你点击了想要使用的材质,在透视视图中右键单击选定的墙面,并选择添加材质 : M_UN_Terrain_Dirt_04。你也可以在内容浏览器的搜索栏中直接输入Dirt

  20. 在内容浏览器中,你会找到我们建筑的室外NEC_Walls.BSP.Materials.M_NEC_Walls_BSP_Ceramic2,你可以在NEC_Walls内部找到它,或者如果你在内容浏览器中输入Walls,它就会出现。

  21. 材质添加后,通过转到视图 | 表面属性打开服务属性。在简单下的下拉菜单中选择2.0,然后点击应用按钮。你应该会注意到材质与建筑完美匹配。行动时间——创建外部环境

  22. 进入内容浏览器,在对象类型部分选择以找到静态网格,并输入Sky以找到我们使用的天空穹顶StaticMesh'UN_Sky.SM.Mesh.S_UN_Sky_SM_SkyDome03'。右键单击你创建的地面,并选择添加静态网格 : S_UN_Sky_SM_SkyDome03'行动时间——创建外部环境

  23. 选择天空穹顶后,移动它,使我们所创建的房间成为物体的中心。将天空穹顶旋转 180 度,以便让太阳面对我们的门。

    天空穹顶应该相当大,以便创造出天空的错觉;如果它太小,我们会注意到天空随着我们移动,而我们移动的速度,这看起来相当不合逻辑。

    行动时间——创建外部环境

  24. 选择天空穹顶后按F4,进入其属性。在静态网格演员部分,转到静态网格组件,然后转到照明并取消勾选接受光照投射阴影。在碰撞中,将碰撞类型设置为COLLIDE_NoCollision。现在我们有了天空,让我们给世界添加一些光照。按Alt + 4返回到照明模式。创建外部环境的时间

    接下来,进入内容浏览器,找到用于天空盒的纹理,它是Material'UN_Sky.SM.Materials.M_UN_Sky_SM_Sunset01'。右键单击它,选择创建副本。从弹出的菜单中,将包名改为唯一的名称,例如Chapter3,然后点击确定

    创建外部环境的时间

  25. 弹出的新页面是你的新包。双击你添加的新材质以进入材质编辑器。在材质编辑器中,找到底部的Properties窗口,直到找到Mobile Allow Fog属性并取消勾选。创建外部环境的时间

  26. 材质编辑器登出(保存材质时选择)。右键单击你创建的新包,并将其保存到包含你的地图的目录中。创建外部环境的时间

  27. 再次通过按F4进入天空穹顶的对象属性。在搜索框中输入材质,并在你看到的第一个部分上点击+符号。在内容浏览器中选中我们创建的新材质,点击指向左侧的小绿色箭头。

  28. 我们正在用我们自己的材质替换之前的材质。遗憾的是,Unreal 默认设置没有考虑到移动用户,所以如果创建级别时没有勾选那个复选框,它将看起来像一个大型的单色屏幕。创建外部环境的时间

  29. 通过选择视图 | 浏览器窗口 | 演员类进入演员类面板。从那里,在灯光 | DirectionalLights | DirectionalLight中左键单击位于LightsDirectional Light演员。创建外部环境的时间

  30. 对于熟悉 UDK 的用户,可能想要使用主方向光,但与 PC 不同,iOS 不支持它,因此为了使用方向光,请使用简单的DirectionalLight类。

  31. 选择DirectionalLight后,按空格键直到到达旋转工具,这意味着工具变成了圆形。旋转你创建的Directional Light,使其箭头指向你的级别中太阳所指的方向。

  32. 完成后,按F4键进入对象属性菜单。在对象的光照组件中选择光照颜色属性,并将其设置为反映该区域的颜色。我使用了滴管工具并选择了一种较浅的颜色,使该区域看起来像日出/日落。创建外景的时间——创建外部环境

  33. 亮度设置为1.4

    小贴士

    使用亮度时,重要的是不要让值过高,我建议不要超过2.5。在 PC 上,完全有可能超过2.5,但由于 iOS 设备的限制,可能会出现绿色过饱和的情况,这意味着如果光线太亮,由于绿色通道中可用内存更多,它看起来会更绿。

  34. 创建您创建的光照的副本,并将其旋转到与当前光照相反的方向。将光照的亮度更改为0.25,并将颜色更改为之前使用的颜色的相反。为此,打开调色板。您将在轮盘上看到当前颜色的位置。在 X 和 Y 轴的相反方向,您将找到所谓的颜色的补色。一般来说,红色的补色是绿色,蓝色的补色是黄色。这如下面的截图所示:创建外景的时间——创建外部环境

  35. 通过选择构建 | 构建全部来构建我们的游戏,完成后点击关闭

  36. 保存您的项目,通过点击主工具栏上的开始移动预览器按钮开始您的游戏。当它询问您保存包时,请点击。它看起来如下截图所示:创建外景的时间——创建外部环境

刚才发生了什么?

现在我们已经在虚幻引擎中创建了第一个户外环境,并建立了一些基本知识,这将在我们开始制作游戏《城市战士》时对我们大有裨益!

预览移动编辑器

在顶部栏中有一个看起来像一部带有棕色屏幕的小手机的按钮,当它被高亮显示时,会显示模拟移动功能。点击它后,您的显示将更接近 iOS 设备上的外观,并且在打光时是一个更好的工具。根据我的经验,虚幻引擎往往会使事物要么太暗要么太亮,因此找到在 iOS 设备和 PC 上都能很好地工作的东西可能是一个挑战。如果您正在尝试为这两个系统创建游戏,您可能想要有两种不同的照明形式,并在实际设备上进行测试,直到您对其满意为止。

粒子使一切变得更好

我们生活的世界非常复杂,某些事物,如爆炸和火灾,由于多种因素,尤其是由于每秒 60/30 帧(fps)的限制,很难在游戏引擎中复制。以较小的成本做到这一点最好的方法是使用一种称为粒子系统的东西。你可以做的许多事情包括创建烟雾、电火花、落叶、雪、灰尘以及像魔法咒语这样的幻想元素。在游戏中,粒子通常很微妙,但往往是这些小事情对我们产生了最大的影响,使我们能够在游戏中创造出我们追求的不真实感。

注意

值得注意的是,虽然粒子是向移动设备添加特殊效果的一种相对简单的方法,但它们也可能是添加到你的层级中成本较高的东西之一。这可能是由于许多因素造成的;基于精灵的粒子系统引起的 alpha 混合会极大地消耗 GPU 的填充率,而具有高粒子计数的粒子系统由于每帧需要更新的对象数量增加,会极大地消耗 CPU。在这方面,在移动设备上找到合适的平衡是很重要的,而正确的平衡将严重依赖于游戏中其他正在发生的事情。在你的目标设备上测试你的游戏是查看你的游戏可以处理多少内容的最佳方式。有关优化和调试游戏的更多信息,请参阅第七章,为城市战士创建高级内容

添加粒子系统的时间行动

首先,让我们将发射器放置在我们模拟的树叶从树上落下的层级。这样一来,我们也在我们的层级中添加一棵树。

  1. 打开内容浏览器,找到StaticMesh'GenericFoliage01.Trees.Mesh.SM_GEN_Foliage01_LargeTree01_Opt'。左键单击它,然后退出内容浏览器。右键点击地板,选择添加演员 | 加载 StaticMesh'GenericFoliage01.Trees.Mesh.SM_GEN_Foliage01_LargeTree01_Opt'。加载树后,右键点击地板并选择添加 StaticMesh: GenericFoliage01.Trees.Mesh.SM_GEN_Foliage01_LargeTree01_Opt'

  2. 选择树后,按住空格键直到进入缩放模式(小部件的箭头被大红色框所取代)。点击并向下拖动,直到树缩小到可管理的尺寸。添加粒子系统的时间行动——添加粒子系统

  3. 在内容浏览器中,切换对象类型中的粒子系统,你应该会看到ParticleSystem'Envy_Level_Effects_2.CTF_Crisis_Energy.Falling_Leaf'添加粒子系统的时间行动——添加粒子系统

  4. 选择对象后,返回到视角视口,右键点击地板,加载粒子系统,然后将其添加到层级中。这将创建一个看起来像五个不同颜色圆圈的图标。

  5. 它会太大,所以你需要将其按之前讨论的方法缩小。我将发射器移动到树的中间,以便树叶从那里落下。

  6. 通过选择构建 | 构建全部来构建我们的游戏,完成后点击关闭

  7. 保存您的项目并开始游戏,通过在主工具栏上点击开始移动预览器按钮,当它询问您保存包时说。您将看到以下截图所示的屏幕:添加粒子系统

刚才发生了什么?

通过几个简单的步骤,我们现在已经将一个简单的粒子系统添加到我们的世界级别中。在创建我们的游戏后,添加这样的小功能将极大地帮助游戏变得更加沉浸式。您可能已经注意到,树叶有一个黑色背景。我们将在下一章讨论导入我们自己的纹理时修复这个问题。

雾天

在移动设备上工作的一个主要问题是,没有一些巧妙的方法,将无法渲染一个广阔的世界,特别是拥有大范围景观的世界。虚幻引擎使我们能够拥有大型级别的其中一种方法就是创建雾的功能。

注意

就像在移动设备上遇到的大多数事情一样,这需要相当平衡。在移动设备上,雾应该仅在极端情况下考虑,例如,当大视距会导致显著的视觉突显,或者当雾的距离足够低,以至于大量级别将被裁剪。测试确实是这里唯一可以用来确定这是否值得的方法。

添加雾效果

为移动设备添加雾非常简单;然而,请注意,你将无法在 PC 版本中看到这个雾,因为它使用自己的系统来实现。

  1. 复制上一节中创建的树,并将其移动到离我们其他树一些距离的地方。

    我们将使用这棵树来测试在游戏中启用雾时,远处的物体看起来会是什么样子。

    添加雾效果

  2. 通过选择视图 | 世界属性来打开世界属性菜单。

  3. 移动部分,勾选启用雾选项。

  4. 雾色设置为与我们的天空盒相融合的颜色。以下截图显示了所使用的值:添加雾效果

  5. 雾起始设置为高数值,这样就不会看到事物迅速消失。

    注意

    注意,可以设置使用伽玛校正,当设置时,将尝试使光照更接近 PC 上的效果,但这会有性能成本。您必须评估是否认为在您的标题中使用它是值得的。

    添加雾效果

  6. 通过选择构建 | 构建全部来构建我们的游戏,完成后点击关闭

  7. 通过在主工具栏上点击开始移动预览器按钮保存您的项目并开始游戏,当它询问您保存包时,请回答。您将看到以下截图所示的屏幕:行动时间——添加雾

发生了什么?

我们现在已经在游戏中添加了雾,这不仅增加了我们在运行时将体验到的效率,还增加了一个可以用来在游戏中营造氛围的工具。调整这些值以了解变化意味着什么,并看看哪种感觉最舒适使用。

摘要

我们现在已经学到了很多将在创建我们的游戏《都市战士》时派上用场的方面。我们特别学习了:

  • 如何将我们的当前关卡放置在网格上并创建外部区域

  • 天穹在移动设备上的使用

  • 灯光及其在 iOS 平台上的应用

  • 如何使用移动预览选项来展示我们的关卡在 iOS 设备上的外观

  • 如何让粒子为我们的世界注入生命

  • 如何使用雾来隐藏远处的物体以提高效率

现在我们有了这个坚实的基础来构建关卡,我们将学习 Unreal Engine 内置的视觉脚本语言 Kismet,以及它如何帮助我们对我们关卡做更多令人惊叹的事情!

第四章:使用 Kismet 和 Matinee

在前面的章节中,我们已经学习了 UDK 的基本界面如何工作以及如何构建基本环境。这些都是很好的,但到目前为止,我们只能在这个世界中四处走动并四处张望。难道我们不想在那里做些什么吗?

在本章中,我们将探讨KismetMatinee,这两种在静态世界中创建动作最流行的方法之一。这应该有助于让我们的游戏世界充满活力。毕竟,行动比言语更有说服力。

在本章中,我们将:

  • 了解 Kismet 是什么以及我们可以用它做什么

  • 使用 Kismet 将我们的项目视角更改为第三人称视角

  • 讨论 Kismet 及其使用的好处和坏处

  • 了解 Matinee 编辑器

  • 使用 Matinee 创建电影

  • 使用 Kismet 和 Matinee 创建自动门

  • 了解专为移动设备设计的序列对象

  • 了解移动输入并为我们 iOS 游戏添加功能

在我们为游戏创建新事物之前,首先让我们了解 Kismet 究竟是什么以及它可以用于什么。

定义 Kismet

Kismet?是 UDK 中的视觉脚本系统,它使得人们能够影响游戏世界并设计游戏事件。对于没有程序员的团队来说,Kismet 可以是上帝的恩赐;它使得没有编程知识的人也能完成原本需要使用UnrealScript(Unreal 引擎使用的编程语言)才能完成的事情。

为了创建一系列事件,你必须将一系列序列对象连接起来。这样,当游戏运行时,就会生成代码,使其执行你所说的事情。我本可以写一本完全关于 Kismet 可以做什么的书,但鉴于我们计划为 iOS 创建第三人称射击游戏,我将避免偏离这个主题太远。然而,随着本书的进展,我们将讨论创建越来越复杂的序列。

创建你的第一个 Kismet 序列

现在我们已经了解了 Kismet 是什么以及它能为我们做什么,让我们看看它是如何在实际中使用的,以及获得结果有多容易!

行动时间——将级别更改为第三人称视角

UDK 给玩家的默认视角是第一人称。假设我们想将其更改为第三人称。由于 Epic 的控制台命令正好可以做到这一点,所以这将会非常容易。然而,为了尽可能简化 Kismet 的学习并练习我们在前面章节中学到的知识,我们将从一个全新的级别开始。

  1. 首先,通过选择文件 | 新建...来创建一个新的地图,然后在顶部选择四个选项之一。我个人选择了正午光照

    通过从 UDK 界面顶部的菜单栏选择View | World Properties来打开World Properties菜单。在World Properties菜单顶部的Search栏中输入Game Type,这将弹出Game Type菜单以及与我们相关的选项。从那里,将Default Game TypeGame Type for PIE的下拉菜单都更改为UTDeathmatch。当我们处于Zone Info部分时,在KillZ下设置值为-1000

    动作时间——将级别改为第三人称视角

  2. 现在,在我们进入 Kismet 之前,我想解释一下我们具体在做什么。使用Play | InEditor选项启动你的游戏。这样启动的游戏就像在 PC 上看到的那样,所以它不能代表项目在 iOS 设备上的外观,但它将更容易展示以下更改。当游戏出现时,按Tab键,你会在屏幕上看到一个黑色条出现。这是控制台窗口,可以用来执行 Unreal 内置的不同命令。我们现在要使用的是切换第一人称和第三人称模式的命令。控制台打开后,输入behindview 1并按Enter键:

    小贴士

    你也可以按 tilde (~)键来访问控制台窗口,它将显示游戏过程中记录的所有内容以及你之前输入的命令。

    动作时间——将级别改为第三人称视角

  3. 如你所见,游戏将你的角色切换到第三人称模式。Kismet 的一个酷特点是我们可以为玩家调用这些命令,这正是我们在这次演示中要做的。

  4. 通过点击 UDK 界面主工具栏顶部的K图标打开 Kismet 界面。你应该会看到一个新窗口弹出,可能看起来有点令人畏惧,但一旦你知道了所有内容,它就不会太糟糕。动作时间——将级别改为第三人称视角

  5. 在菜单栏下方,你会看到一个带有许多 1 和 0 的大区域。这是我们的工作区,我们将在这里放置我们创建的所有序列对象。

  6. 底部两个栏是PropertiesSequences窗口。Properties窗口将保存我们将在创建的序列对象中设置的所有数据,可以通过左键单击它们来访问。我们这一章的所有工作都在同一个序列中,所以我们不需要使用Sequences窗口,但我们将会在第五章 城市战士的动作序列中介绍它。

  7. 在界面上半部分的大区域中右键单击。从弹出的菜单中选择创建一个Player Spawned事件,选择New Event | Player | Player Spawned

  8. 左键单击 玩家生成事件序列 对象,以便弹出 属性 窗口,并将 最大触发次数 的值从 1 更改为 0操作时间——将视角更改为第三人称视角

    值为 0 表示它可以被触发无限次。

  9. 右键单击在触发器连接(紫色/粉色箭头)下,并选择 创建新对象变量

  10. 右键单击,通过从菜单中选择 新建动作 | 杂项 | 控制台命令 来创建一个 控制台命令 动作。

  11. 在属性中,将 behindview 1 作为 Commands[0] 的值输入。操作时间——将视角更改为第三人称视角

  12. 通过单击 玩家生成 事件右侧的 Out 文本的方块,并拖动鼠标直到它到达 In 文本左侧的黑方块,将 玩家生成 事件的输出连接到 控制台命令 动作的输入。

  13. 触发者目标 的连接器连接到我们之前创建的 对象 变量。

    到目前为止,你的 Kismet 应该看起来与以下截图相似:

    操作时间——将视角更改为第三人称视角

  14. 现在通过点击主工具栏上的 开始移动预览器 按钮来开始你的游戏。? 你将看到以下截图:操作时间——将视角更改为第三人称视角

刚才发生了什么?

在游戏开始时,当玩家被生成(玩家生成 事件被激活)时,我们将视角更改为第三人称(调用 控制台命令 动作)。? 我们还学习了一些使用 Kismet 的基础知识,并理解了序列对象如何连接以创建不同的效果。仅使用两个序列对象就能做到这一点,已经很不错了。

Kismet 入门

在使用 Kismet 的时候,一些术语一开始可能难以理解,所以我将快速概述一些 Kismet 的一般方面。

序列对象的部分

我们所工作的每个节点都称为 序列对象,因为它是一个序列内的对象。我们将在 第六章 整合一切 中更多地讨论序列,但现在让我们谈谈构成 Kismet 节点的部分。

序列对象的部分

序列对象左侧被称为 输入;而右侧被称为 输出。以下是一些变量,它们要么是我们给出的值,要么是我们根据对象设置的值。

有四种不同的序列对象,其中三种我们将在这章中使用,我们将在第五章 城市战士的动作序列 中使用第四种。以下截图显示了序列对象:

序列对象的部分

  • 事件:这是所有其他序列对象被调用的地方。Kismet 中的代码只有在发生某些事情时才会被调用,比如当玩家在我们的级别中生成时调用的玩家生成事件。这些对象是红色的,形状像钻石。

  • 动作:当事件被触发时,这些会执行一个定义的任务。这是最常用的项目,因此它是具有最多变化的对象。控制台命令动作,以及之前使用的延迟,是动作的例子。动作以矩形的形式呈现。

  • 变量:这些是我们级别中保存信息的东西。如果另一个序列对象下面有方块,那么这是一个保存变量的位置。它们根据变量实际是什么而有所不同。在玩家生成事件中的发起者?是一个变量,当它被调用时,会填充我们的玩家信息,并且在之前的截图中的延迟变量下的蓝色数字是一个值为2.0的浮点变量。我们将在第六章 整合一切 中广泛使用变量。变量表示为圆形。

  • 条件:这些动作在比较数字或对象时可以基于不同对象的值做不同的事情。它们用于控制序列中的事物流程。比较对象条件是一个条件的例子。条件传统上是蓝色的,并且是矩形的。

使用 Kismet 的优缺点

就像任何工作一样,使用适合的工具很重要。UDK 提供了三种给游戏世界添加交互性的方式:Kismet(我们正在讨论的),Matinee(我们将会讨论),以及 UnrealScript(这本书的范围之外,但在Unreal Development Kit Game Programming with UnrealScript: Beginner's Guide中得到了非常好的覆盖,作者是 Rachel Cordone,也可以从 Packt Publishing 购买)。三者都有特定的优点和缺点,但 Kismet 是我最常使用的一个。

在阅读这本书并扩展您对 UDK 的研究后,您可能会看到论坛帖子,有人询问如何在 Kismet 中做某事。很多人会回复建议他们学习 UnrealScript。虽然他们可能看起来很傲慢,但他们说使用那个工具的理由也有一些。我列出了 Kismet 的优缺点,这可能会在您决定它是否适合您正在做的工作时有所帮助。

使用 Kismet 的优点

Kismet 是一个非常好的工具,当你刚开始使用 UDK 时,它是一个很好的起点。与 Kismet 相关的一些其他好处包括:

  • 降低入门门槛:无需编程知识,因此更容易开始,你现在就可以开始创建游戏了。

  • 非常适合原型设计游戏机制:说一个机制会很有趣是一回事,但除非你能证明这一点,否则没有人会相信你。Kismet 使得快速搭建原型变得极其简单。作为一个设计师,有一件东西可以展示给程序员,这将使他们将想法转化为代码变得容易得多。

  • 非常适合一次性事件:如果你的关卡需要特定的事件,比如爆炸,或者只在特定时间或关卡发生的事件,Kismet 是一个很好的工具。

  • 更容易看到事件流程:如果你是一个更倾向于视觉思考的人,或者喜欢盯着某物看以了解整体情况,使用 Kismet 会容易得多。序列对象和颜色都代表特定的含义,使得辨别特定场景中发生的事情变得容易。

  • 易于与 UnrealScript 扩展:了解 UnrealScript 的工作原理后,你可以创建自己的自定义序列对象,以创建你自己的动作。如果你的游戏有一个对话系统,在 Kismet 中创建一个自定义的显示对话框动作是可能的,这样就可以轻松地在 Kismet 中创建整个对话树。

缺点

然而,Kismet 并不是 UDK 能做的一切事情的终极解决方案。以下是使用 Kismet 可能遇到的缺点:

  • 复杂性问题:随着你对 Kismet 越来越熟悉,你可能会尝试用它做更多和更复杂的事情(我知道我就是这样)。如果你不小心,你可能会遇到阅读你的代码实际在做什么的问题。基本上,序列越复杂,阅读起来就越困难。

  • 重复使用:在游戏中,很多时候你希望在与类似或相同的对象(如门)交互时发生相同的事情。如果你想在多个对象或多个关卡上实现相同的行为,你必须每次都粘贴它。这可能会导致序列对象数量迅速增加,如果用具有相同行为的 UnrealScript 文件编写,并使该对象使用该文件来执行其中的动作,就可以避免这种情况。

  • 特定于关卡:与 Kismet 一样,它也仅限于创建它的关卡。例如,如果我们想在游戏中创建十个关卡,我们就必须在每个关卡中执行控制台命令事件。使用 UnrealScript,这将内置到游戏代码库中,并对所有关卡自动生效。

  • Kismet 不能在游戏中做你想做的所有事情:事实是,Unreal Engine 3 游戏引擎是为了制作第一人称射击游戏FPS)而创建的,你偏离这条道路越远,创建你的游戏就会越困难。这并不是说 UDK 不能用来创建其他游戏。只是由于 Kismet 中的序列对象旨在创建 FPS,所以这将会更加困难。

  • 需要更多自定义行为时需要 UnrealScript:继续前面的观点,大多数时候游戏会做一些 UDK 似乎不会做的事情(比如《蝙蝠侠:阿卡姆疯人院》中的稻草人 BOSS 战,“Plasmids”在《生化奇兵 1》和《2》中,或者《暗黑虚空》中的喷气背包)。这些例子可能使用了 UnrealScript 或 C++代码来实现预期的结果。

  • Kismet 比 UnrealScript 慢:虽然在我们现在创建的项目中这不会很重要,因为 Kismet 基本上是按照一定顺序执行的预写 UnrealScript,但 Kismet 比仅使用 UnrealScript 所能达到的速度要慢,而且游戏中持续使用的东西最好用 UnrealScript 来完成。

尝试一下英雄——Kismet

控制台命令可以执行很多不同的事情,让你可以访问很多预写的代码,包括打开其他地图(open levelname),以及退出游戏(quit)。

尝试在开始关卡时让游戏打开另一个地图。

定义 Matinee

Matinee工具是 Unreal Engine 中所有电影效果的动力源泉。它使用户能够在游戏中成为导演,控制摄像机、演员的动作、声音,以及不同的剪辑和动画效果。想想在 Unreal 游戏中你无法直接控制角色的任何时刻,比如场景。很可能那是在 Matinee 中完成的。然而,Matinee 可以用于许多其他事情,我们将在后面讨论。

为了创建 Matinee,我们将使用(恰如其名)Matinee 编辑器,它可以从 Kismet 菜单中访问。

创建您的第一个 Matinee 电影

在定义了 Matinee 的用途之后,让我们开始使用它。

行动时间——打开场景

按照现状,当游戏开始时,我们直接进入行动,没有任何预先警告。为了准备玩家并让他们了解他们所在的位置,让我们创建一个场景!

  1. 前往Actor Classes浏览器视图 | 浏览器窗口 | Actor Classes。从那里,您将看到我们可以放置在我们关卡中的类列表。左键单击CameraActor选择。行动时间——打开场景

  2. 关闭演员类浏览器,并在你的级别中任何地方右键单击。从弹出的菜单中选择在此处创建 CameraActor。这将创建一个演员在地面上,在你点击的位置。将相机定位在玩家上方并朝向玩家可能是个好主意。操作时间——打开场景

  3. 如果它还没有打开,请通过点击 UDK 界面主工具栏顶部的K图标来打开 Kismet 编辑器。

  4. 通过在界面上半部分的大区域内右键单击并选择新建 Matinee来创建一个新的 Matinee。你应该会看到一个橙色方块弹出,带有许多不同的输入和输出。操作时间——打开场景

  5. 双击对象进入 Matinee 编辑器,如图下所示:操作时间——打开场景

  6. 最小化 Matinee 并选择主屏幕上的CameraActor,通过左键单击它并打开 Matinee。在组列表(位于所有标签下的深灰色列,在时间轴左侧)内右键单击。从出现的上下文菜单中,点击添加新相机组。当提示输入名称时,键入Camera操作时间——打开场景

  7. 如果你点击相机组左上角的相机图标,你会看到透视视口变为相机的视角。

  8. 如果相机图标没有显示,这意味着相机没有连接到组。要修复此问题,在编辑器中左键单击您的相机,然后返回 Kismet。从那里,在创建的 Matinee 中相机文本下方右键单击,选择使用 CameraActor_0 创建新对象变量并将其连接到相机插槽。操作时间——打开场景

  9. 点击相机上的运动轨道,然后点击时间轴中的第一个关键帧(红色三角形)。你会注意到透视视口的底部文本变为调整关键帧运动 0。现在,如果你在视口中移动,它将转移到我们创建的相机演员上。一旦你将相机移动到你想要的位置,请点击 Matinee 窗口中的关键帧外部。

  10. 相机下方右键单击并选择添加新导演组

  11. 左键单击导演轨道,然后点击位于文件菜单下方(如图下所示,用红色圆圈圈出)的第一个图标添加关键帧,以添加一个新关键帧,例如,我们想要在这个位置使用不同的相机。选择使用切换到组相机并点击确定操作时间——打开场景

  12. 再次在移动音轨上左键单击。将时间滑块从0.00拖动到2.00秒标记,到 Matinee 区域底部的灰色条上,那里有所有的数字。

  13. 左键单击添加关键帧图标以向我们的电影添加一个新的关键帧。如果一切顺利,您应该会看到以下截图类似的内容:行动时间—开场场景

  14. 选择关键帧后,将摄像机拉近玩家。此时,如果您拖动时间滑块,您会注意到摄像机在两秒钟内创建的两个点之间移动。

  15. 在时间轴上的其他位置左键单击以取消关键帧的焦点。将鼠标滚轮向下移动以从时间轴中缩出。您会注意到一个指向 5.00 标记的粉红色三角形。该对象标记了 Matinee 序列的结束,因此单击它并将其拖动到第二个标记。

  16. 您也可以右键单击它,选择移动到最长音轨端点,它将自动吸附到添加的最后一个关键帧。

  17. 关闭 Matinee,将 Kismet 重新调回。右键单击我们之前创建的控制台命令动作旁边,选择新建动作 | 切换 | 切换电影模式

  18. 切换电影模式的属性中,禁用隐藏玩家选项。将目标连接到我们在上一个示例中创建的玩家生成事件的施动者。左键单击序列对象,并按Ctrl + C复制它。

  19. 通过按Ctrl + V粘贴序列对象,并将创建的序列对象移动到 Matinee 的右侧,同时按住Ctrl键并拖动,当它被选中时。

  20. 通过按住Alt键并点击控制台命令动作的输入输出连接器来移除与控制台命令动作的连接。点击并按住Ctrl键,将动作拖动到第二个切换电影模式动作旁边。将玩家生成动作的输出连接到第一个切换电影模式启用。将那个输出连接到 Matinee 的播放,将完成输出连接到第二个切换电影模式的禁用输入,最后,将切换电影模式输出连接到控制台命令的输入。行动时间—开场场景

  21. 保存您的项目(文件 | 保存),然后通过点击主工具栏上的开始移动预览器按钮来启动您的游戏。行动时间—开场场景

刚才发生了什么?

我们在虚幻引擎中创造了第一个电影时刻!现在当我们的游戏开始时,我们会将镜头拉近我们的角色,让玩家为即将到来的动作做好准备。虽然实现这样一个简单的动作可能有些麻烦,但很容易看出使用 Matinee 工具创造许多令人兴奋事物的巨大潜力!

英雄试炼——Matinee

你可以轻松地添加更多关键点到此开场戏,并延长其长度到你想要的任何长度。你还可以添加另一个CameraActor,在电影进行时切换相机。花些时间在你的关卡中滑行,也许在游戏开始时让玩家旋转。

我们的力量结合在一起...

现在我们已经学习了使用 Kismet 和 Matinee 的一些基础知识,让我们来做一些非平凡的例子,看看它们两者结合能做什么。

动作时间——创建自动门

如果你的游戏发生在人类居住的地方,那么你很可能会有一个门,作为玩家,我们会被它们吸引以继续关卡。考虑到这一点,让我们创建一个当有人靠近时会自动打开,空时关闭的门。

  1. 返回主编辑器窗口,通过视图 | 浏览器窗口 | 内容浏览器访问内容浏览器

  2. 对象类型选项卡中,勾选静态网格选项,因为我们只想看到静态网格。在顶部搜索栏中输入doorway。左键点击选定的网格并关闭内容浏览器动作时间——创建自动门

  3. 在你的关卡中右键点击,选择添加演员 | 加载静态网格:S_LT_Doors_SM_DoorWar04。再次右键点击并选择添加静态网格:S_LT_Doors_SM_DoorWar04

  4. 右键点击放置的门并选择转换 | 将静态网格演员转换为 Mover

  5. 进入门的属性(F4)并在搜索栏中输入collision。将底部的CollisionType变量更改为COLLIDE_BlockAll

  6. 使用第二章Beginning Urban Warrior; a First Person Shooter中讨论的Builder Brush添加几何,在门的两侧以及顶部创建一个覆盖整个门上方距离的画刷。动作时间——创建自动门

    注意画刷并没有延伸到门那里,如果我们让画刷更大,它将覆盖部分门。幸运的是,有一个简单的方法可以使墙壁与我们要使用的门对齐。

  7. 使用侧视图并点击看起来像 3D 立方体的按钮进入几何模式。点击右侧的画刷并确保你处于平移模式,要么点击看起来像四个箭头交叉的菜单图标,要么按空格键直到你看到箭头以进行平移。点击左侧顶部的正方形将其变为红色以便选中,并将其拖动到门的边缘。对另一个画刷做相反的操作。

    我将在第六章“Bringing It All Together”中介绍几何模式及其如何用于创建游戏区域,并允许快速原型化游戏区域。

    操作时间——创建自动门

  8. 使用顶部视口创建一个位于门中间的刷子,门的前后都有空间。右键单击该刷子并选择Convert | ConverttoVolume | Trigger Volume?将刷子转换为触发体积。之后,保存你的地图并点击Build All操作时间——创建自动门

  9. 点击我们创建的触发体积以选择它,并通过点击 UDK 界面主工具栏顶部的K图标打开 Kismet 编辑器。

  10. 在界面上半部分的大区域中右键单击。通过从弹出的菜单中选择New Event using TriggerVolume_0 | Touch来创建一个触发体积触摸事件。

  11. 左键单击TriggerVolume_0 Touch事件对象,以便弹出属性窗口,并将MaxTriggerCount的值从1更改为0

  12. 我们希望在门打开和关闭时播放声音,所以使用NewAction | Sound | PlaySound创建两个播放声音动作。

  13. 进入内容浏览器,将你要查找的对象类型更改为SoundCue,并将搜索更改为仅door。选择第一个 SoundCue A_Door_Metal03_CloseStartCue并返回 Kismet。

  14. 选择底部的播放声音动作。在属性中,你应该看到一个看起来像绿色箭头指向左侧的图标,位于PlaySound属性旁边。点击该按钮,它应该将你在内容浏览器中选择的值填充到框中。

  15. 使用A_Door_Metal03_OpenStartCue和顶部的PlaySound分别重复从步骤 13 到步骤 14。

  16. 返回编辑器,点击门并返回到 Kismet。通过在触摸事件旁边右键单击并选择NewMatinee来创建一个新的 Matinee 对象。

  17. 通过双击 Matinee 进入 Matinee 编辑器。在组列表内右键单击并点击AddNewCameraGroup。当提示输入名称时,键入Door

  18. 0.50位置创建一个关键帧,并选择它后,在透视视图中左键单击门。将门移动到左侧,直到它完全离开开口,这样人们就可以通过。

  19. 在 Matinee 序列的末尾(指向外的粉红色三角形)右键单击,并选择MovetoLongestTrackEndpoint。关闭 Matinee 并重新打开 Kismet。

  20. 将两个播放声音动作的目标连接到我们的 Matinee 序列中的门,这样我们就能听到从门传来的声音。

  21. TriggerVolume_0 Touch 事件将 Touched 输出连接到顶部 Play Sound 事件的 Play 输入。然后,将 Empty 输出连接到底部 Play Sound 事件的 Play 输入。将顶部 Play SoundOut 连接到 Matinee 序列的 Play。将底部 Play SoundOut 连接到 Matinee 序列的 Reverse 输入。创建自动门的时间

  22. 保存你的项目(文件 | 保存),然后通过点击主工具栏上的 开始移动预览器 按钮来启动你的游戏。创建自动门的时间

刚才发生了什么?

我们在游戏中创建了一个最常用的交互式对象:一扇门。有了这个基本想法,就可以做许多类似的事情,例如移动平台和电梯,以及像使用游戏引擎创建类似 Rooster Teeth 的 Red versus Blue 或 Epic 的 Samaritan 演示这样的复杂事物。Matinee 还有很多其他功能,但最好是自己探索,通过实验来发现。

移动设备上的 Kismet

我们所看到的所有示例都可以,并且已经在 UDK 的正常版本中使用,并且很好地转移到我们的移动 iOS 游戏中。只要游戏类型支持,Kismet 中的大多数事物在移动设备上也能正常工作。自从开始支持移动设备以来,UDK 已经提供了一套针对移动平台的目标序列对象。

移动 Kismet—操作

与需要更改 .ini 文件或编写 UnrealScript 以接受和响应用户输入的传统 UDK 游戏 不同,UDK 为移动开发者提供了直接在 Kismet 中按自己的意愿做事的能力。这使得开发者能够根据每个级别来更改输入。

添加输入区域

添加输入区域 在屏幕上显示一个额外的输入区域。区域需要有一个唯一的名称,当使用它们时,其他序列对象将通过它们的 Zone Name 属性来引用。我们将在本章后面使用此操作来添加按钮到我们的 UI 中,并学习如何创建不同类型的区域以用于我们的项目。

添加输入区域

此操作位于 NewAction | Mobile | AddInputZone.

清除输入区域

此操作会移除在运行时创建或加载的所有区域。这基本上为你提供了一个干净的画布来构建自己的输入方案。如果你正在创建一个不需要移动或使用与提供的不同移动方式的游戏,这将非常棒。

清除输入区域

此操作位于 NewAction | Mobile | ClearInputZones.

注意

使用此操作也会移除UberStickMoveZoneUberStickLookZone摇杆输入,只留下UberLookZoneInput区域。如果你想在项目中使用它们,请务必将它们添加回来。然而,话虽如此,对于用户来说,最好避免在没有特定目的的情况下使用此事件。如果我们不希望所有级别的默认输入区域的部分都生效,最好修改DefaultGameUDK.ini文件的RequiredMobileInputConfigs以适应我们的需求。

移除输入区域

此操作允许你通过名称移除输入区域;如果你只想在游戏的一定时间点使交互可用,例如保存菜单或用于对话的说话按钮,这很有用。区域名称属性可以在序列对象的属性中找到。

移除输入区域

此操作位于新建动作 | 移动 | 移除输入区域

保存/加载值

如其名所示,这是通过 Kismet 从硬盘保存或加载 Kismet 内部创建的变量。你可以将多个变量连接到同一操作,允许你拥有尽可能多的变量,但每个变量需要在变量名称属性中有一个名称才能保存。我建议你使用相同的操作来加载和保存相同的值。这样,变量的加载顺序将与保存时的顺序相同。如果你有十个整数连接到同一个整型变量容器,Kismet 不能保证它决定放置它们的顺序,而使用相同的操作可以节省你很多麻烦。

保存/加载值

此操作位于新建动作 | 移动 | 保存/加载值

移动 Kismet—事件

从输入区域获取输入,以及使用 iPod 自身的陀螺仪和设备,我们可以利用事件来启用某些功能,以及创建我们自己的HUD图形。

模拟输入

在 PC、控制台和移动设备上工作,模拟输入会在使用你设置的输入名称的模拟输入有值时触发。

你可以使用的一些值包括MobileYawMobilePitch,它们从设备的陀螺仪中获取值。这些值将在浮点值变量中给出。DeviceAccelerometerRawData将在向量值变量中返回一个包含Roll, Portrait PitchLandscape Pitch的向量。

重要的是要注意,除非你将陷阱输入设置为FALSE(通过取消选中它),否则其他任何东西都无法接收任何输入事件,包括触摸。

模拟输入

此操作位于新建事件 | 输入 | 模拟输入

移动按钮访问

如果你不是引用从 .ini 文件中已创建的内容,你将使用 移动按钮访问 在 Kismet 中触发内容。这与之前展示的 触摸 事件类似。属性 目标区域名称 应包含已创建的输入区域的名称。你可以使用一些属性,例如 仅触摸下发送按下,它将在你点击按钮时仅调用 Input Pressed 输出,以及 仅触摸上发送按下,它将在你移除手指时被调用。否则,只要按钮被按下,就会调用该操作。

移动按钮访问

此操作位于 新事件 | 输入 | 移动按钮访问

移动输入访问

当设置具有 移动输入区域ZoneType_Joystick 的输入区域时,会使用 移动输入访问 动作。当摇杆被使用时,在每一帧都会调用 Input Active,而当摇杆被释放时,则使用 Input Inactive。为底部部分创建变量可以让你访问不同的值,你可以使用这些值来解释你打算如何使用数据。X 轴Y 轴 提供介于 -1.01.0 之间的值,其中 -1.0 是完全向下或向左,而 1.0 是向上或向右。如果你希望更精确,其他四个值提供了摇杆中心和当前位置的像素值。

移动输入访问

此操作位于 新事件 | 输入 | MobileInputAccess

移动外观

移动外观事件与 移动输入访问 事件极为相似,因为它们都具有相同类型的输出,并且与具有 ZoneType_Joystick 作为 移动输入区域 的输入区域一起使用。然而,移动外观 操作将数据转换为表示摇杆当前垂直和水平轴的向量,而不是可以轻松应用于使用 新动作 | 演员 | 设置演员位置 的单独值。偏航? 代表摇杆在 Unreal Rotator 单位中的移动方向,其中 0 是垂直向上,旋转按顺时针方向增加。强度 表示触摸当前位置到摇杆中心的像素距离。这对于俯视游戏非常有用。

移动外观

此操作位于 新事件 | 输入 | 移动外观

移动对象选择器

移动对象选择器是一种简单的方法,用于检查目标对象是否被 触摸 输入所接触,前提是它距离玩家 追踪距离 内。除非您将 触摸检查 设置为 TRUE,否则它只会调用一次;然后它将每帧调用一次。像每帧执行动作的任何事物一样,建议设置一个 重新触发延迟 为某个值,例如 0.2,以减少对硬件的压力。

移动对象选择器

此操作位于 新事件 | 输入 | 移动对象选择器

移动简单滑动

移动简单滑动事件提供了一种简单的滑动检测形式,根据滑动方向使用不同的输出。容差变量可以设置以允许在更直或更弯的线上发生滑动,而最小距离变量设置滑动需要多长才能被认为是滑动,以使动作更剧烈或更温和。紫色底部的触摸演员列表返回一个对象列表,其中包含在滑动过程中被触摸的所有具有碰撞的演员。

移动简单滑动

此操作位于 新事件 | 输入 | 移动简单滑动

触摸输入

任何用户触摸屏幕时,都视为 触摸 事件。输入系统可以通过使用 触摸索引触摸板索引 来跟踪同时发生的多个触摸,以引用您提供的输入区域值。触摸 X触摸 Y 将给出它们在屏幕空间中的像素值,发起者将指代执行触摸的 玩家控制器。您可以选择使用 按下 来触发事件,使用 重复 来在触摸存在时继续,释放 将在玩家从 触摸 事件中移除手指时被调用。

触摸输入

此操作位于 新事件 | 输入 | 触摸输入

注意

除非您通过取消选中将其设置为 FALSE 来设置 陷阱输入,否则在使用此事件时,您将无法使用任何其他输入区域。

绘制图像

绘制图像操作将 Texture2D 图像显示在 显示纹理 中,作为某种形式的 HUD,供玩家在您的游戏中使用,只要 激活/是否激活 设置为 TRUEXLYL 值用于显示图像应该有多大以显示 1.0 表示在相应轴线上填充屏幕 100%。UL 是要绘制的纹理的左上角的位置。ULVL 是要绘制的纹理部分的水平和垂直宽度(以像素为单位)。请确保将 显示颜色 更改为白色,因为这是它将被调制的颜色。

存在一个名为已发布全局缩放的变量,它指定了内容所使用的显示缩放因子。2.0的值对于 iPhone 4S 和新 iPad 等高分辨率屏幕很有用,而1.0对于 iPad 和较旧的 iPhone/iPod Touch 等标准分辨率屏幕很有用。还值得注意的是,输出实际上并没有被调用。

绘制图像

此操作位于新事件 | HUD | 绘制图像

注意

这将不适用于UTDeathmatch游戏类型。我们将利用这一点来制作我们的主菜单,我们将在第七章,城市战士的高级内容创作中创建。

绘制文本

此事件将在屏幕上显示由显示文本提供的文本字符串。请确保使用内容浏览器中提供的字体之一设置显示字体的值。在屏幕上绘制文本的方式有两种文本绘制方法选择;DRAW_CenterText,它从显示位置变量水平居中文本,和DRAW_WrapText,它从显示位置开始绘制文本。只要激活/是否激活设置为TRUE,文本就会显示。目标是我们希望显示此信息的玩家,通常将是玩家。

与我们的绘制图像事件一样,有一个名为已发布全局缩放的变量,它指定了内容所使用的显示缩放因子。2.0的值对于 iPhone 4S 和新 iPad 等高分辨率屏幕很有用,而1.0对于 iPad 和较旧的 iPhone/iPod Touch 等标准分辨率屏幕很有用。还值得注意的是,输出实际上并没有被调用。

注意

这将不适用于UTDeathmatch游戏类型。我们将利用这一点来制作我们的主菜单,我们将在第七章,城市战士的高级内容创作中创建。

绘制文本

此操作位于新事件 | HUD | 绘制文本

向该情况输入一些信息

在对不同的移动特定序列对象有了一个基本的概述之后,让我们将这项知识用于一些有用的地方。

行动时间——添加输入

目前在我们的游戏中,我们使用提供的两个摇杆来移动和环顾世界。如果你点击屏幕中央,枪会开火,但玩家还可以执行游戏类型中已经预先编写好的其他操作。我们将使用我们刚刚学到的几个新的 Kismet 序列对象,创建按钮,让玩家能够射击、使用替代射击和跳跃。

  1. 通过按K按钮打开 Kismet 编辑器。

  2. 通过右键单击并选择新建动作 | 移动 | 添加输入区域来创建一个添加输入区域动作。

  3. 展开序列动作移动添加输入区域选项卡,并将区域名称的值设置为AltFire

  4. 点击新区域远端的蓝色三角形图标,然后点击移动输入区域以创建一个我们可以使用的新区域。

  5. 展开区域选项卡,并将标题的值设置为AltFire

  6. 展开输入选项卡,并将输入键的值设置为GBA_AltFire

  7. 展开边界选项卡,并将X的值设置为-100.0,将Y的值设置为-300

    边界框的XY值,如果为正数,将从屏幕的左上角移动。在任一轴上放置负数将导致HUD将显示移动到视口的右下角边缘,这是我们想要达到的效果。我们希望将HUD按钮放置在靠近用于扫视的摇杆的右下角,因此我们为每个轴使用负数。请注意,这些值是为 iPhone 设计的;在其他 iOS 设备上使用时需要调整。

  8. 展开渲染选项卡,并点击渲染颜色。将其更改为在您的关卡中易于看到的一些值。我选择了蓝色用于这个关卡。

  9. 复制添加输入区域动作,并在我们的 Kismet 工作区内部粘贴两个副本。在第一个副本中,将区域名称标题变量更改为跳跃,并将输入键设置为GBA_Jump,在边界中的位置为(-200-350)。对于第二个,将区域名称标题变量更改为开火,并将输入键设置为GBA_Fire,在边界中的位置为(-300-300)。

  10. 控制台命令模式Out输出连接我们的添加输入区域序列对象,一个接一个。行动时间——添加输入

  11. 保存您的项目(文件 | 保存),然后通过点击主工具栏上的开始移动预览器按钮来开始您的游戏。行动时间——添加输入

刚才发生了什么?

我们现在创建了自己的自定义输入按钮,允许我们跳跃、开火和射击替代开火,同时保留原始移动选项。当我们获得新的武器,如火箭发射器,或者如果我们想为我们的游戏提供某种平台跳跃时,这将非常有用。

英雄,尝试一下——移动序列对象/添加输入

使用之前描述的序列对象,创建许多不同类型的游戏将非常简单,包括一个隐藏对象游戏,其中你被给出两张几乎完全相同但略有不同的图像。当你触摸其中一个差异时,它将被隐藏,你将更接近找到所有差异。通过使用移动对象选择器事件和切换隐藏动作来隐藏我们创建的门对象,当你点击它时。

突击测验

  1. 以下哪个不是 Kismet 对象类型?

    a. 事件

    b. 动作

    c. 控制台命令

    d. 条件

  2. 将最大触发次数更改为 0 会产生什么效果?

    a. 事件将被无限次触发。

    b. 它不再使用,但存在以保持向后兼容性,所以没有效果。

    c. 告诉 UDK 在我们的级别中可能存在多少触发/触发体积。

    d. 事件将不会触发,直到其值更大。

  3. 我将使用哪个 Kismet 事件来从 iOS 设备的陀螺仪获取信息?

    a. 触摸输入

    b. 模拟输入

    c. 移动输入访问

    d. 移动简单滑动

  4. 我该如何移除我们游戏类型中包含的两个操纵杆?

    a. 清除输入区域

    b. 为每个操纵杆移除输入区域

    c. 修改 DefaultGameUDK.ini 中的 RequiredMobileInputConfigs

    d. 所有上述

  5. 我们使用哪种 Actor 来改变玩家的视野?

    a. 玩家生成

    b. Matinee

    c. 视觉 Actor

    d. 摄像机 Actor

摘要

在本章中,我们关于 Unreal 引擎 Matinee 中 Kismet 的高级系统学到了很多。我们分别和一起实现了它们,以了解它们如何被用来在我们的游戏世界中创造更有趣和动态的体验。利用这些基本知识,你基本上可以创建任何你想要的类型游戏;可能性是无限的!

在这个短暂的时间内,我们设法覆盖了很多内容。我们具体学习了以下内容

  • 什么是 Kismet 以及如何用它来创建基于级别的活动和原型设计

  • 如何在运行时调用控制台命令,使我们能够改变到第三人称视角

  • Kismet 应该用于什么,以及为什么我们会或不会决定使用它

  • Matinee 是如何成为 Unreal 引擎的电影工具,并允许设计师在引擎中精确地指示事物的工作方式

  • 如何创建一个介绍性场景,将玩家带入我们的世界

  • 使用 Kismet 和 Matinee 的方面实现自动门的实现会是什么样子

  • Kismet 在移动平台上的不同之处以及我们从那里获得的额外功能

  • 如何使用我们之前讨论的序列对象添加游戏类型中缺失的功能

现在我们已经了解了 Kismet 和 Matinee 的基础知识,我们准备好探索如何将我们对 Kismet 的了解提升到下一个层次,并开始朝着构建我们的 Urban Warrior 项目迈出更多步伐。

在下一章中,我们将通过创建更复杂的系统,如恢复生命值(控制台 FPS 的喜爱)和生成看起来尽可能真实的敌人的行为和位置,来创建一些动态的动作序列。

第五章.城市战士的动作序列

在上一章中,我们建立了对可爱的 Kismet 和 Matinee 工具的基本理解以及它们如何在一些简单示例中协同工作。但现在我们已经了解了基础知识,我们不能再做更多了吗?哦,是的,我们当然可以。

在本章中,我们将创建一系列序列和预制件,为下一章中轻松创建我们的关卡打下基础。

在本章中,我们将:

  • 讨论序列是什么以及我们如何使用它们

  • 将敌人生成到我们的关卡中

  • 开发一个基本的 AI 系统,如果我们在附近,它会向我们射击

  • 通过添加追逐和撤退行为来扩展该系统。

  • 导入/导出子序列以轻松创建额外的敌人。

  • 使用远程事件实现健康恢复

  • 讨论预制件及其在我们项目中的使用

  • 制作一个门预制件

  • 讨论创建战斗场景时的流程和注意事项

因此,让我们看看我们可以用序列做什么。

序列与您

序列是 UDK 帮助我们组织代码以及将所有希望在特定区域发生的动作分区的途径。您将重新使用的事件及其相关动作也是放置在序列中的理想候选者。

任何使用过 Kismet 的人之前都使用过序列。您已经在不知不觉中使用了序列。UDK 在 Kismet 编辑器中为我们提供了一个LevelName序列,我们在上一章中使用过。

生命,或者类似的东西

现在我们已经了解了序列是什么,让我们创建一个自己的序列!这将使我们能够使角色栩栩如生,如本节中解释的敌人。

行动时间——将 AI 实体生成到我们的关卡中

由于我们正在创建游戏的基础模块,如果没有敌人来战斗,制作第三人称射击游戏有点困难。幸运的是,UDK 帮助我们并使添加敌人到我们的关卡变得极其简单!

  1. 进入演员类浏览器视图 | 浏览器窗口 | 演员类。从那里您将看到我们可以放置在我们关卡中的类列表。在搜索栏中输入Path,然后左键单击PathNode选择。以下截图解释了这一点:行动时间——将 AI 实体生成到我们的关卡中

  2. 关闭演员类浏览器,并在您的关卡中任何地方右键单击。从弹出的菜单中选择在此处添加 PathNode。这将创建一个在您点击的位置地面的演员。我已经将我的PathNode放置在玩家附近,但仍然在摄像机视图中可见,以便我们的开场序列。

  3. 通过点击 UDK 界面主工具栏顶部的K图标来打开 Kismet 编辑器。

  4. 左键单击并拖动工作空间的背景以移动图形平面,为我们提供一些可以工作的开放空间。

  5. 右键点击在背景中的某个位置,并选择 创建新序列:0 Objs。应该会弹出一个窗口询问你序列的名称。输入 EnemyAI 并按 Enter。在右键点击的位置应该会创建一个带有该名称的小框。

  6. 双击 EnemyAI 序列。你会注意到我们现在已经进入了这个序列,里面没有任何内容,而且我们底部的右侧序列面板中高亮显示的是 EnemyAI 序列。这如图所示:执行动作——将 AI 孵化到我们的关卡

  7. 右键点击并在背景中创建一个 Sequence Activated 事件,通过菜单选择 新建事件 | Sequence Activated

  8. 通过右键点击并从菜单中选择 新建动作 | 演员 | 演员工厂 来创建一个 演员工厂 动作。进入属性面板,点击 工厂 变量右侧的蓝色三角形,并从弹出的菜单中选择 UTActorFactoryAI 以创建一个新的 演员工厂 来使用。在我们新工厂的属性中设置 Pawn 类UTPawn,并勾选 给予默认库存 选项。最后,将 团队索引 更改为 1

  9. 出生点 变量下,通过右键点击并从菜单中选择 新建变量 | 外部变量 来创建一个外部对象变量。左键点击该变量,并在其属性中设置 期望类型SeqVar_Object变量标签Spawn Point

  10. 通过右键点击并选择 新建动作 | 杂项 | 完成序列 来创建一个 完成序列 动作。在 输出标签 属性下输入 Spawned

  11. Sequence Activated "In" 事件的 Out 连接到演员工厂动作的 Spawn Actor 输入。将 Spawn Point 链接连接到我们创建的外部对象变量。最后,将 Actor FactoryFinished 输出连接到 Finish Sequence "Spawned" 动作。此时,我们的序列应该如图所示:执行动作——将 AI 孵化到我们的关卡

  12. 在 Kismet 编辑器的右下角点击 LevelName 序列以返回主关卡序列。现在我们应该看到序列看起来类似于一个带有输入、输出和变量链的 Kismet 节点,如图所示:执行动作——将 AI 孵化到我们的关卡

  13. 右键点击并在背景中创建一个 Level Loaded 事件,通过菜单选择 新建事件 | Level Loaded

  14. 进入我们的关卡,左键点击之前创建的 PathNode,然后返回 Kismet。右键点击我们的出生点链接,并选择 从 PathNode_0 创建新变量。这如图所示:执行动作——将 AI 孵化到我们的关卡

  15. 通过选择构建 | 构建全部并完成时按关闭来构建我们的游戏。

  16. 保存你的项目。现在,如以下截图所示,通过点击主工具栏上的开始移动预览器按钮来开始你的游戏:行动时间——将 AI 生成到我们的关卡中

刚才发生了什么?

当关卡加载完毕(通过关卡加载事件)时,我们调用我们的EnemyAI序列,通过演员工厂生成一个敌人,并将其放置在我们PathNode所在的关卡中。将这些事件和动作放入一个序列中,将使我们能够将与我们 AI 相关的代码放在一个地方,使创建我们未来关卡中的新 AI 尽可能简单。

它活过来了!但是...

如你现在所知,我们的演员已经在关卡中,但它实际上并没有做什么。这是因为它缺少人工智能AI)。当然,我们可以强制演员使用 UDK 中包含的Deathmatch AI,但如果我们有多个 AI,它们会互相战斗。经验丰富的 UDK 开发者可能会意识到,当为 iOS 制作游戏时,你会失去很多功能。例如,如果我们是在 PC 上创建游戏,我可以使用UTTeamGame类型,它会处理不攻击玩家以外的演员,但如果使用 iOS 构建,这个功能就会损坏。不要担心,亲爱的读者;我确实有一个解决方案,你将在学习序列和高级 Kismet 的过程中了解到它!

行动时间——基础敌人 AI

现在,我们将创建一个基本的 AI,使用 Kismet,并通过我们的序列,我们将能够将此行为附加到我们使用的每个 AI 上。

  1. 通过点击 UDK 界面主工具栏顶部的K图标来打开 Kismet 编辑器。

  2. 通过在Graph面板中双击序列或在Sequences面板中点击EnemyAI文本来进入EnemyAI序列。

  3. Actor Factory中的Spawned变量下方创建一个外部对象变量,通过右键单击并从菜单中选择新建变量 | 外部变量。左键单击变量,在其属性中设置期望类型SeqVar_Object变量标签Spawned

  4. 通过右键单击并选择新建条件 | 是否存活来创建一个Is Alive条件。将Spawned变量链接连接到条件下方的Players链接。

  5. 通过右键单击并选择新建动作 | 杂项 | 完成序列来创建一个Finish Sequence动作。在输出标签属性中输入Dead。将Is Alive条件的False输出连接到Finish序列的In

  6. 通过右键点击并选择 New Action | Misc | Trace 创建一个 Trace 动作。将 Is Alive 条件的 True 输出连接到 TraceIn。将追踪底部的 Start 变量链接设置为之前使用的 Spawned 变量。将 End 变量链接设置为 Player 0 变量(New Variable | Player | Player,不勾选 All Players)。在 Distance 变量链接下方右键点击并创建一个新的 Float 变量。这如图所示:Time for action—base enemy AI

  7. 通过右键点击并选择 New Condition | Comparison | Compare Float 创建一个 Compare Float 条件。在 A 变量链接下方连接我们追踪中的距离变量。在 B 下创建一个新的 Float 变量并输入值 600.

  8. 通过右键点击并选择 New Action | AI | Start Firing At 创建一个 Start Firing At 动作。将 Target 变量设置为 Spawned 对象变量,并将 Fire At 链接到一个 Player 0 对象。将 Compare Float 条件的 A < B 连接到 Start Firing At 动作的 In

  9. 通过右键点击并选择 New Action | AI | Stop Firing 创建一个 Stop Firing 动作。将 Target 变量设置为 Spawned 对象变量。将 Compare Float 条件的 A >= B 连接到 Start Firing At 动作的 In。我们将看到如图所示的输出:Time for action—base enemy AI

    现在,如果我们的敌人是活着的,我们将在屏幕上执行一个追踪,这将创建一个从演员到玩家的线条,并查看他们之间是否有任何东西会阻断 视线LOS)。如果 AI 能看到玩家并且他距离玩家一定距离内,他将开始向他射击。如果有什么东西挡在路上,他将停止射击。当然,现在这只会调用一次。所以一旦发生一次,就不会再次调用。如果玩家从战斗中逃跑怎么办?我们希望敌人追逐玩家。

  10. 通过右键点击并选择 New Condition | Comparison | Compare Bool 创建一个 Compare Bool 条件。在布尔变量链接下方创建一个具有 False 值的 Bool 变量。

  11. 通过右键点击并选择 New Action | AI | Move To Actor 创建一个 Move To Actor 动作。在 Target 变量链接下方连接 Spawned 对象。在 Destination 下创建一个 Player 变量并将其连接。将 Compare Bool 条件的 True 输出连接到 Move To Actor 动作的 In 输入。

  12. 通过右键单击并选择 新建动作 | 切换 | 切换 来创建一个 切换 动作。在 布尔 变量链接下,将我们之前创建的布尔变量与值为 False 的变量连接起来。将 Start Firing At 动作的 Out 输出连接到这个 切换 动作的 Turn On 输入。

  13. 通过右键单击并选择 新建动作 | 杂项 | 延迟 来创建一个 延迟 动作。在 属性 面板中,将 持续时间 修改为 0.20。将 Toggle移动到演员 动作的 Out 以及比较布尔条件输出的 False 连接到我们的 延迟 动作的 Start 输入。将我们的 延迟 动作的 Finished 输出连接到我们在本节开头创建的 Is Alive 条件输入的 In

  14. 通过选择 构建 | 构建全部 并在完成后按 关闭 来构建我们的游戏。

  15. 保存你的项目并开始游戏,通过单击主工具栏上的 开始移动预览器 按钮如图所示:是时候进行基础敌人 AI 的操作了

刚才发生了什么?

我们现在的敌人会对我们在世界中的行为做出反应!如果我们进入距离敌人 600 或更近的位置,并且有清晰的视线,它将开始向我们开火。如果玩家跑得足够远或躲在某个掩护物后面,它将尝试向我们移动。然而,还有很多工作要做。

需要改进的地方

与直接跑向玩家位置不同,我们生成的敌人会朝向出生点,或者说最初创建角色的位置,而不是他们当前所在的位置。它将继续跟随我们,直到它可以再次向我们开火。它不应该在一段时间后放弃吗?如果我们从远处开始攻击敌人,玩家将不会做出反应,只会挨打。有了这个基础,我们现在可以扩展我们的 AI,使其更加健壮。

是时候进行基础敌人 AI 的操作了

现在,我们将使用 Kismet 创建一个基本的 AI,并使用我们的序列,我们将能够将此行为附加到我们使用的每个 AI 上。

  1. 进入 演员类 浏览器 视图 | 浏览器窗口 | 演员类。从那里,您将看到我们可以放置在我们关卡中的类列表。在 搜索 框中输入 Path 并左键单击 PathNode_Dynamic 选择项。以下截图显示了这一点:是时候进行基础敌人 AI 的操作了

  2. 关闭 演员类 浏览器,并在你的关卡中任何地方右键单击。从弹出的菜单中选择 在此处添加 PathNode_Dynamic。这将创建一个在点击位置地面的演员。将其放置在玩家出生点附近。

  3. 通过单击 UDK 界面主工具栏顶部的 K 图标来打开 Kismet 编辑器。

  4. 通过在 面板中双击序列或单击 序列 面板中的 EnemyAI 文本来进入 EnemyAI 序列。

  5. 通过按住Alt并点击黑色方块来删除连接到延迟动作的开始输入的连接。左键点击延迟动作,按住Shift并将其拖到右侧,为我们新增的内容腾出空间。

  6. 选择移动到演员动作及其附加变量,通过按住Ctrl + Alt并左键点击移动到演员动作稍上方和左侧,然后拖动直到你创建的框覆盖所有我们想要移动的项目。或者,按住Ctrl并点击每个项目。将对象移动到延迟位置旁边。删除移动到演员动作的输入连接,并将移动到演员动作的输出连接到延迟动作的开始。将我们的切换动作的输出连接到延迟动作的开始

  7. 通过右键点击并选择新建条件 | 条件 | 比较浮点数,在比较布尔值动作旁边创建一个比较浮点数条件。将比较布尔值条件的连接到这个比较浮点数输入。将比较布尔值输出连接到延迟动作的开始输入。在我们的比较浮点数动作的AB部分都创建一个浮点变量。在A浮点变量内,创建一个注释说timeSinceCaught,值为0.0。将B变量设置为2.0。我在这个部分试图实现的是,如果 AI 追逐玩家并且经过一段时间后,它会放弃并停在原地。

  8. 通过右键点击并选择新建动作 | 数学 | 添加浮点数来创建一个添加浮点数动作。将添加浮点数动作的A浮点结果变量连接到我们放置注释说timeSinceCaught的浮点变量,该变量连接到我们的比较浮点数A链接。将我们的比较浮点数A < B输出连接到我们的添加浮点数动作的输入。在B下方创建一个值为0.2的浮点变量。以下截图显示了这一点:行动时间——基础敌人 AI

    由于这个动作每 0.2 秒被调用一次(由于我们的延迟),如果自我们第一次看到玩家后开始追逐玩家已经不到 2 秒,我们就将 0.2 加到计数器上。如果我们已经等待了 2 秒或更长时间,我们该怎么办?这就是我们接下来要做的。

  9. 在我们刚刚创建的添加浮点数动作下方添加一个设置浮点数动作,使用新建动作 | 设置变量 | 浮点数。创建一个新的浮点变量,值为0.0,并将其连接到目标变量和timeSinceCaught浮点变量。将比较浮点数条件的A >= B输出连接到我们的设置浮点数动作的输入

  10. 通过右键点击并选择新建动作 | 切换 | 切换来创建一个切换动作。在布尔变量链接下方连接我们之前创建的布尔变量与False值。将设置浮点数动作的输出连接到这个切换动作的关闭输入。

  11. 通过使用新建动作 | 对象属性 | 修改属性来创建一个修改属性动作。转到属性面板,在属性变量旁边的绿色+符号上左键点击,以创建一个新属性进行更改。点击左侧的黑三角以展开选项。在属性名称属性中输入bLockLocation。点击修改属性复选框。最后,在属性值部分输入1。这如图所示:行动时间——基础敌人 AI

    bLockLocation变量是我们演员类中的一个布尔值,它将阻止演员被移动。当值不为 0 时,布尔值将值视为真,这将冻结我们的 AI,直到我们将值设置回 0。请注意,UDK 将给我们一个关于使用修改属性动作的警告,但因为我们不会在我们的项目中使用 UnrealScript,所以这将是可以的。

  12. 切换动作的输出连接到我们的修改属性动作的输入。将目标连接到已生成外部变量。将修改属性动作的输出连接到最右侧的延迟动作的开始上。

  13. 在步骤 8 中创建的添加浮点数旁边创建一个修改属性动作,使用新建动作 | 对象属性 | 修改属性。转到属性面板,在属性变量旁边的绿色+符号上左键点击以创建一个新属性进行更改。点击左侧的黑三角以展开选项。在属性名称属性中输入bLockLocation。点击修改属性复选框。最后,在属性值部分输入0。将添加浮点数动作的输出连接到我们新的修改属性动作的输入

  14. 返回到编辑器并确认已选择PathNode_Dynamic_0

  15. 在 Kismet 中创建一个获取位置和旋转动作,新建动作 | 演员 | 获取位置和旋转。通过创建一个玩家对象变量将目标变量设置为玩家 0。在位置链接下方右键点击并选择创建新向量变量

  16. 移动到演员动作下删除玩家变量,并在目的地变量下右键点击,选择使用路径节点 _Dynamic_0 新建对象变量。创建一个设置演员位置动作新建动作 | 演员 | 设置演员位置。将位置变量链接连接到我们在上一步创建的位置。将设置演员位置动作的目标连接到移动到演员目的地变量链接。

  17. Trace动作上方,通过右键点击并选择新建事件 | 演员 | 受到伤害创建一个受到伤害事件。在属性面板中将最大触发次数设置为0。将发起者连接到已生成对象。将输出连接到开始射击动作的输入

    这样做将使得如果玩家决定从远处攻击某人,敌人将以某种方式追逐玩家做出反应。最后我们会看到以下类似的截图:

    行动时间——基础敌人 AI

  18. 返回到编辑器窗口,点击上一章中创建的。通过按F4键打开其属性,并在搜索框中输入path。你会看到一个值为路径碰撞的复选框被选中。取消选中它。取消选中路径碰撞值让编辑器知道 AI 可以穿过门,因为它会将该区域视为开放,即使我们那里有门。如果你打算不允许敌人使用门,那么你需要确保这个选项被选中。

  19. 通过选择构建 | 构建全部并完成时按关闭来构建我们的游戏。

  20. 保存您的项目并开始游戏,通过在主工具栏上点击开始移动预览器按钮,如图所示:行动时间——基础敌人 AI

刚才发生了什么?

我们为 AI 的常规程序注入了更多的活力;现在它们以更可信的方式对我们做出反应,并且对于我们在项目中的工作来说已经足够好了。现在敌人会追逐你一段时间,然后放弃,如果你从任何地方攻击他们,他们会对你做出反应。我们还接触到了更高级的 Kismet 脚本,展示了我们如何根据世界中的事件来操纵游戏环境。

英雄尝试——将你的 AI 进一步发展

你可以为你的 AI 添加很多其他东西,比如根据玩家与它们之间的距离(在基础敌人 AI部分讨论了Trace动作的距离),设置不同的状态。目前,只要timeSinceCaught变量小于 2.0,PathNode_Dynamic就设置为你的实际位置。你可以让它只知道你在那个点的位置(只设置一次位置)。你可以使用Bool(真/假语句)变量红色作为检查它是否已经设置的一种方式。

你还可以做的一件事是使用TimerAction | Misc | Timer)而不是使用浮点比较和加法,根据需要切换定时器的开关,为你的工具箱添加一个额外的工具。

导出子序列

在设置了一个有用的子序列,例如我们创建的EnemyAI事件之后,我们可能希望在不同关卡之间共享它。做到这一点的一种方法就是复制/粘贴;但如果我们想与其他开发者/设计师或在不同电脑上共享我们的序列呢?我们可以对序列做的酷炫事情之一就是导出它们,这样我们就可以像放置网格或Actor Classes一样将它们放置在我们的关卡中。但需要注意的是,当序列被导入时,它将删除对创建的关卡内对象的全部引用,因此为了这个原因,为项目使用外部变量是至关重要的,以确保序列按我们希望的方式执行。

执行动作——创建第二个敌人

在这一点上,保存我们的EnemyAI子序列是一个好主意,因为我们将在最终关卡中使用它。由于这是我们第一次将内容导出到内容编辑器,我会非常仔细。

  1. 进入Actor Classes浏览器,选择View | Browser Windows | Actor Classes。从那里,你将看到我们可以放置在我们关卡中的类列表。在Search栏中输入Path,然后左键单击PathNode选择。

  2. 关闭Actor Classes浏览器,在上一章创建的门前面右键单击。从弹出的菜单中选择Add PathNode Here。选择PathNode,按住Option并拖动对象到门后面,创建一个副本。

  3. 通过点击 UDK 界面主工具栏顶部的K图标打开 Kismet 编辑器。

  4. 右键单击我们的EnemyAI子序列,并选择Export Sequence to Package。这将在以下屏幕截图中显示:执行动作——创建第二个敌人

  5. 将会出现一个提示,要求输入你的对象的包、组和名称。在Package中输入UrbanWarrior,在Group中输入Sequences,在Name中输入EnemyAI

  6. 打开Content Browser,在Packages下方的Search栏中输入urban。你应该会看到你的包出现在顶部,你的序列作为第一个选中的项目。

  7. 右键单击包(它旁边应该有一个*),然后单击保存。如图所示:创建第二个敌人的行动时间

  8. 在玩家所在位置的EnemyAI序列上左键单击并打开 Kismet 编辑器。移动到EnemyAI序列的左侧,右键单击并选择导入 EnemyAI 序列

    你可能看不到任何变化,但这是有充分理由的。

  9. EnemyAI子序列上左键单击,并按住Alt键将其拖动到左侧。你会注意到我们导入的新子序列与导出时的位置相同。

  10. 在玩家所在位置的PathNode上左键单击并返回 Kismet。在Spawn Point下方,右键单击并选择使用 PathNode_2 Here 创建新对象变量。为Spawned变量链接创建一个新的Object变量。将第一个EnemyAI序列的Dead输出连接到这个EnemyAIIn输入。

  11. 通过右键单击并选择新建动作 | AI | 移动到演员创建一个Move To Actor动作。在Target变量链接下连接Spawned对象。在Destination下将其连接到门前的PathNode。将EnemyAI子序列的Spawned输出连接到Move To Actor动作的In输入。我们将看到如图所示的输出:创建第二个敌人的行动时间

  12. 通过选择构建 | 构建全部并完成时按关闭来构建我们的游戏。

  13. 通过在主工具栏上单击开始移动预览器按钮保存你的项目并开始游戏,如图所示:创建第二个敌人的行动时间

刚才发生了什么?

世界正变得越来越动态。通过使用导入的子序列,我们使得如果我们的第一个敌人死亡,第二个敌人会孵化并冲进门去看看发生了什么。

远程事件

如前一个我们创建的序列所示,Kismet 可能会变得相当复杂,随着时间的推移可能会变得相当混乱。一个可能的解决方案是使用远程事件来停止连接四处蔓延。类似于我们的Level LoadedPlayer Spawned事件,每次我们通过激活远程事件Kismet 动作激活远程事件时,都会调用与之连接的动作和条件。

当我们可以使用远程事件时

远程事件听起来相当神奇,但并不总是可以使用。每个远程事件都需要一个特定的名称,如果存在多个相同远程事件的版本,UDK 会感到困惑。这也是为什么我们不能有同名变量。如果你打算为多个对象重复使用相同的序列,则不能使用它们。

创建远程事件

要创建远程事件,你可以在 Kismet 的图形面板中右键单击,然后选择新建事件|远程事件。创建事件后,进入其属性,在事件名称变量中输入一个唯一的标识符。当你想要调用与远程事件关联的动作时,只需创建一个激活远程事件动作:新建动作|事件|激活远程事件,然后在属性面板中找到变量事件名称并将其设置为相同的标识符。这如下面的截图所示:

创建远程事件

命名变量

在编程中,存在全局变量的概念。全局变量是你在游戏中的所有时间都希望拥有的东西;例如,玩家的金币或当前生成的敌人数量。如果这是一些你经常使用的数据,这会非常有用。命名变量基本上是 Kismet 的全局变量版本;然而,它们仅在当前加载的水平面上是全局的。

我们何时可以使用命名变量

命名变量,就像远程事件一样,需要具有唯一的名称,这就是为什么我们在EnemyAI序列中用注释代替变量名来命名timeSinceCaught变量的原因。拥有命名变量的好处是,我们不必每次都创建到单个变量的链接,就像我们在EnemyAI序列中使用的Spawned外部变量那样,我们只需创建新的命名变量来连接它,从而使我们的脚本更加有序。

创建命名变量

要创建一个命名变量,你可以在 Kismet 的图形面板中右键单击,然后选择新建变量|命名变量。创建变量并进入其属性后,你可以设置期望的类型,并在查找变量名属性下填写变量名。

如果一切顺利,你将看到其位置上有一个绿色的勾选标记,如下面的截图所示:

创建命名变量

操作玩家

我们已经以这种方式创建了一些动作,这些动作将与我们将要放置在游戏世界中的 AI 一起工作,但游戏中还有一件事比这更重要,我们还没有着手处理:玩家!在用 UnrealScript 编写之前,通常会在 Kismet 中测试添加新的游戏类型或新的机制,这使得迭代变得容易得多。确保机制是有趣且引人入胜的。现在我们有了可以射击的目标和一些智慧,让我们给玩家添加一个新的机制。

行动时间——随时间恢复玩家生命值

Halo中流行起来,并在Gears of WarBatman: Arkham City等热门游戏中出现,恢复生命值是现代游戏中的一个主要元素,出现在许多游戏中,并且会一直存在。令人惊讶的是,在 Kismet 中实现它并不困难,你可能会注意到我们在这里使用的行为与我们之前所做的一些重叠。

  1. 打开 Kismet 编辑器并输入我们的主序列,拖动屏幕直到你有大量的空白空间。

  2. 通过选择New Event | Remote Event来创建一个远程事件。在Properties面板中,将Event Name变量设置为RegenHealth

  3. 在远程事件上方,通过右键点击并选择New Event | Level Loaded来创建一个Level Loaded事件。

  4. Level Loaded事件的右侧,通过右键点击并选择New Action | Event | Activate Remote Event来创建一个Activate Remote Event动作。在Properties面板中找到变量Event Name并将其设置为RegenHealth

    注意,Activate Remote Event和远程事件RegenHealth可能仍然有一个大红色的X。这可能是因为拼写错误,或者序列没有被刷新。如果你退出并再次进入 Kismet,你将看到这两个对象旁边都有一个绿色的勾号,如图所示:

    Time for action—regenerating player health over time

  5. 在远程事件RegenHealth的右侧,通过右键点击并选择New Action | Object Property | Get Property来创建一个Get Property动作。在Properties面板中,将Property Name变量设置为Health。在Target变量链接下方创建一个Player 0对象变量。在Int变量链接下方,通过右键点击并选择Create New Int Variable来创建一个新的Int变量。

    Pawn Class中的Player的 UnrealScript 文件内部存在一个名为Health的整数,它存储玩家的生命值。Get Property动作允许我们查看我们的目标中包含的值,如果它包含该变量。

  6. 通过右键点击并选择New Condition | Comparison | Compare Int来创建一个Compare Int条件。在A变量链接下方连接我们Get Property中的Int变量。在B下方创建一个新的Int变量并设置值为100。将Get Property动作的Out连接到Compare Int条件的In输入。

    基本上,我们将比较我们的Health是否低于100(目前它能达到的最大值)。

  7. 通过使用 新建动作 | 对象属性 | 修改属性 来创建一个 修改属性 动作。转到 属性 面板,在 属性 变量旁边的绿色 + 符号上左键单击以创建一个新属性进行更改。单击左侧的黑三角以展开选项。在 属性名称 属性中输入 Health。单击 修改属性 复选框。最后,在 属性值 部分输入 100。在 目标 变量链接处放置一个 Player 0 对象。将 Compare Int 条件的 A >= B 连接到我们刚刚创建的 修改属性In 输入。

  8. 通过右键点击并选择 新建条件 | 比较 | 比较浮点数 来创建一个 比较浮点数 条件。在 A 变量链接下创建一个新的 浮点数 变量,并赋予其值为 0.0变量名TimeSinceDamaged。在 B 下创建一个新的 浮点数 变量,其浮点值为 2.0对象注释TimeSinceLastDamaged。将 Compare Int 条件的 A < B 输出连接到这个 比较浮点数 条件的 In 输入。

  9. 通过使用 新建动作 | 设置变量 | 浮点数 来添加一个 Set Float 动作。为 链接创建一个新的浮点数,其值为 0.0

  10. 创建一个具有 预期类型为 SeqVar_Float查找变量名为 TimeSinceDamaged 的命名变量,并将 Set Float 动作的 Target 变量链接连接到它。将 Modify Property健康)的 Out 连接到我们的 Set Float 动作的 In 输入。

  11. 创建一个 激活远程事件 动作 新建动作 | 事件 | 激活远程事件,并在 属性 面板中找到变量 事件名称 并将其设置为 RegenHealth。将我们的 Set Float 动作的 Out 输出连接到我们的 激活远程事件 变量 RegenHealth。这如图所示:行动时间——随时间恢复玩家健康

  12. 创建一个 修改健康 动作 新建动作 | 演员 | 修改健康。在 目标 变量链接下创建一个 Player 0 对象变量。在数量创建一个 浮点数 变量,其值为 1.0。在 属性 面板中勾选 治疗 复选框,并将我们的 Compare Float 条件的 A >= B 连接到这个动作的 In

    你可能会注意到我们没有使用 修改属性,就像我们在上一个例子中做的那样;这只是为了向你展示在 Kismet 中经常有多种方式做完全相同的事情,通过实验你可以发现所有 sorts of things 你可以做到。

  13. 复制 (Ctrl + C) 并粘贴我们之前创建的 激活远程事件 变量 RegenHealth。将动作拖动到刚刚创建的 修改生命值 动作的旁边。通过按住 Alt 键并左键单击删除此动作与其 In 输入的连接。复制并粘贴另一个移除了 In 的动作,并将其放在这个动作的上方。将我们的 修改生命值Out 连接到旁边的动作。

  14. 通过右键单击并选择 新建动作 | 数学 | 添加浮点数 来创建一个 添加浮点数 动作。将 添加浮点数A浮点结果 变量连接到具有 TimeSinceDamaged 值的命名变量,就像我们在第 10 步中做的那样。将我们的 比较浮点数A < B 输出连接到我们的 添加浮点数 动作的 In。在 B 下方创建一个值为 0.2浮点数 变量。最后,将此 添加浮点数Out 输出连接到我们在上一步中创建的额外 激活远程事件 变量 RegenHealth行动时间——随时间恢复玩家生命值

  15. 保存你的项目,并点击主工具栏上的 开始移动预览器 按钮来开始你的游戏,如图所示:行动时间——随时间恢复玩家生命值

刚才发生了什么?

通过静态图像你可能看不出来,但我们又迈出一步,离拥有一个功能齐全的游戏更近了,这得益于一个令人惊叹的恢复生命值系统的加入。当我们的生命值不是最大值时,我们会等待一段时间,如果我们在这段时间内没有被击中,我们的生命值会随着时间的推移慢慢增加。我们还获得了如何使用命名变量、在 Kismet 中获取和设置对象属性以及使用远程事件的经验。

英雄试炼——随时间恢复玩家生命值

使用这个基础系统,你可以做很多事情来扩展其功能。通过将恢复速度设置得比你的低生命值更快,可以轻松地做类似 Halo 的护盾恢复,在 修改生命值 动作下更改浮点值。你也可以通过一些修改使用相同的序列,使其变成一个如果你在其中花费太多时间就会对你造成伤害的东西,就像在 Sonic: The Hedgehog 中的水一样。

预制件

在构建关卡时,你通常会创建一些演员和相关的 Kismet 安排,然后在同一关卡或其他关卡中重用这个集合,就像我们创建的门一样。预制件允许你创建一个对象一次,然后将其保存为预制件包。你可以在关卡中多次选择 预制件 并添加它。

注意,预制件可能会在 UDK 中引起问题,并且可能在没有明显原因的情况下损坏和/或停止工作,所以请确保一切正常后经常保存。

行动时间——门预制件

目前我们只有一个门,虽然它是一个很棒的门,但我们可能希望在游戏中有多于一个。为了使其更容易在新区域的游戏中使用和放置,让我们制作一个门预制对象!

  1. 在 Kismet 中,转到我们在上一章中编写的门行为。按住 Alt+Ctrl 并从对象的左上角拖动到底部,以选择用于创建的所有项目。右键单击并选择 创建新序列。在以下菜单中命名序列为 Door。这如图所示:操作时间——门预制对象

  2. 类似地,在常规编辑器窗口中,选择用于创建我们的门的所有对象,包括围绕它的墙壁和用于其创建的触发体积。右键单击并选择 创建预制对象操作时间——门预制对象

  3. 下创建的弹出窗口中,使用名称 UrbanWarrior,并在 名称 中使用 Door.

  4. 另一个弹出窗口将出现,告诉你它检测到一个使用此预制对象项目的 Kismet 序列,并询问我们是否希望它成为预制对象的一部分。点击

    注意,一个预制对象只能关联一个序列,你不能使用主序列作为使用该预制对象的序列。与之前导出/导入的子序列不同,这些对象在序列中将具有与预制对象内新创建的副本相对应的变量链接,这是一件非常巧妙的事情。

  5. 最后,弹出窗口将询问你是否想将你的门转换为预制对象的实例;这是一个好主意,所以点击 。你现在会注意到门旁边有一个红色的 P 符号,这让我们知道它是一个预制对象。

  6. 左键单击预制对象,并在沿轴拖动时按住 Alt 键,以在基点外一定距离处创建门的副本。当你拖动时,你应该会看到第二个预制对象被创建并移动,同时在这个过程中制作了另一扇门。

  7. 由于在运行时无法渲染 BSP 的更改,墙壁在透视视图中不会显示,直到你构建游戏。

  8. 通过选择 构建 | 构建所有 并在完成后按 关闭 来构建我们的游戏。

  9. 保存你的项目并开始你的游戏,通过在主工具栏上单击 开始移动预览器 按钮,当它询问你保存包时说 。以下截图显示了修改后的视图:操作时间——门预制对象

发生了什么?

我们现在已经快速简单地在我们关卡内创建了一个第二个门。我们之前门中包含的功能仍然存在,允许我们通过它们中的任何一个相当容易地进入和退出,包括声音效果等。使用预制对象,制作新门将变得非常简单,而且由于它们不必相同(如 Unity),我们可以更改每个预制对象的任何内容,而不用担心它将如何影响其他对象。

构建战斗序列

作为一个喜欢玩游戏的人可以证明,在游戏过程中总有一些时刻会脱颖而出。我们也玩过一些游戏,感觉就像是在走廊里一个接一个地走,几乎没有令人兴奋的事情发生,游戏变得无聊。制作一个令人满意的战斗体验是每个设计师都力求做到的事情,以下是我提出的一些关于如何做到这一点的建议。

布局

没有准备,就是准备失败。 —— 本杰明·富兰克林

一个好的布局是你创建关卡坚实基础的基石,因此,在开始创建关卡时,这可能是最重要的考虑因素之一。这也是为什么游戏项目的前期制作如此重要的众多原因之一。虽然这可能与你最初的思考相反,但直接进入编辑器尝试制作东西并不是一个好主意。虽然偶尔你可能会偶然发现一些东西,但如果你事先规划,最终生成的关卡会好得多。这并不是说你在前期制作的计划会与你计划的一模一样。在规划布局时,要确保它一眼就能看懂。在创建动作时,保持动作在玩家的视野FOV)内。

你可能已经注意到,在我们当前的布局版本中,当门生成时,它不在玩家的视野中,这使得玩家不清楚在游戏中应该继续往哪里走。这发出了混乱的信号,这从来都不是好事。

生成和敌人放置

当然,拥有一个出色的布局是好事,但如果环境中没有可做的事情,玩家很快就会感到无聊,因此我们生成对手来面对他们。敌人必须在玩家视线之外生成,这一点非常重要,因为如果玩家突然看到敌人从无到有地出现,会突然打破他们应该感受到的不信感,除非当然,这是敌人的一种能力,比如《生化奇兵》中的 Houdini 拼接者。

当然,我们也不总是想让我们的敌人保持静止;这就是为什么我们经常让敌人沿着路径行走,或者从一个区域进入。这种移动应该给我们的玩家一个视觉提示,就像现实世界一样,通常有理由解释为什么某物会出现在某个地方。如果你的游戏有潜行元素,玩家可能会等待看到敌人路径中出现的模式,以避免冲突。如果你的游戏是动作射击游戏,玩家很可能会前往他们看到事物出现的地方。另一个需要注意的事情是了解你引擎的限制,尤其是在移动游戏空间中工作,因为移动平台在生成敌人时对硬件的要求更高。

环境

精美的艺术作品固然美丽,但它无法弥补糟糕的设计。对于像我这样的艺术人士来说,在完成作品之前就开始打磨某个区域,很容易陷入这种陷阱。在进行预生产并设计布局后,首先使用 BSP 添加式刷子构建你的关卡。在这个阶段,关卡的重点是创建一个有趣的环境,并且与我们要关卡发生的环境有某种相似之处。重要的是尽我们所能,利用我们想要的玩法类型。例如,我们可以给玩家提供躲避敌人的地方,让他们能够进行射击,这样玩家就会觉得自己很聪明,因为他们比敌人更聪明。

作为设计师,你可以做的最重要的事情之一是赋予玩家权力,因为他们不是你的敌人,他们是你的最好的朋友,最终是给你发薪水的人,所以尊重他们是重要的。除了实际的物理环境之外,环境的光照可以以多种方式影响玩家。主要来说,光线将注意力引向事物,并引导玩家向其移动。黑暗和未知是玩家感到不舒服的区域,而且不如其他区域明亮的光线增加了该区域可能具有的威胁感。单碑的《恐惧》就做得相当不错,它将一个普通的日常办公室变成了一个充满紧张和危险的地方,即使你全副武装,装备齐全,可以应对任何可能发生的事情。

脚本

敌人的放置和生成与敌人本身的行为一样重要,如果敌人不做任何事情,游戏很快就会变得乏味。我们已经为敌人可能对敌人做的事情创建了一个基本的 AI,并且有很多方法可以在此基础上扩展,并基于游戏中的情况创造独特的情况。在开阔的大区域中,只要玩家做出类似智能的行为,事情似乎就会顺利进行,尽管我们的 AI 有限,但可以很好地发挥作用。一般来说,环境越紧凑,你就越想手动编写敌人的行为。

侧翼包抄是一种行为,敌人能够从目标两侧或后方接近,使其措手不及。在游戏中,侧翼包抄既有好的一面也有不好的一面。如果做得好,它可以促使玩家即兴发挥,感受到一阵兴奋。然而,如果做得不好,会让玩家认为 AI 在作弊,并导致玩家对这次遭遇产生反感。如果你决定实施侧翼包抄,请等待并让玩家进入区域后再尝试侧翼包抄,并让第一枪打偏,让玩家注意到枪声的来源,以便他们调整。

设计师可以利用的另一项工具是环境中的波浪概念,在不同的时间点生成不同的敌人,以延长游戏时间和特定区域的时间。然而,每一波都应该独特,否则玩家会很快感到无聊。“地牢守护者”通过随着时间的推移逐渐增加难度,确保事情不会变得无聊,做得很好。

请记住你波浪和遭遇的难度,并修改你可以修改的元素,以便在每个遭遇中调整难度,同时也给玩家一个机会偶尔休息一下,反思自己变得多么强大。

测试

在我看来,游戏设计师是玩家的代言人,在这个角色中,他们的主要责任是制作出目标受众会喜爱的游戏。正因为如此,测试玩家是游戏设计师最好的朋友。他们是普通人将如何对你的游戏做出反应的代言人,因此,认真对待他们的话是非常重要的。他们也是那些会找到并利用他们能触及到你游戏世界中的任何东西的人,你也会发现你从未想过可能在你游戏中出现的事情。他们会提出建议,而是否采纳这些建议将由你决定,这些改变是否真的值得拥有。

在没有你的输入的情况下,让其他人玩你的游戏也非常重要。大多数设计师认为他们已经涵盖了玩家可能做的每一件事,但几乎可以肯定的是,有些事情已经被遗忘了。在关卡设计中,重要的是要看到玩家会走向哪个方向,以及他们是否被正确引导。

摘要

我们现在已经拥有了创建游戏所需的所有部件,并在过程中学到了很多东西。通过使用本章给出的相同原则,我们可以扩展并创建许多不同类型的敌人和行为。

在这个短暂的时间内,我们设法覆盖了很多内容。我们特别学习了以下主题:

  • 顺序是什么以及我们如何使用它们

  • 如何在我们的关卡中生成敌人

  • 我们可以做什么来开发一个基本的 AI 系统,如果我们在它附近,它会向我们射击

  • 如何通过添加追逐和撤退行为来扩展该系统

  • 如何使用导入/导出子序列创建额外的敌人

  • 如何使用远程事件实现恢复生命值

  • 预制件是什么以及我们如何在项目中使用它们

  • 如何制作门预制件

  • 创建战斗场景时需要考虑的事项

现在我们已经学会了如何构建我们将需要实现游戏的所有基础元素。

在下一章中,我们将把这些部件组合起来,通过讨论使用几何模式创建关卡的工作流程,如何使用模块化部件快速创建我们的关卡,以及关于在

第六章.整合一切

在上一章中,我们创建了一系列序列和预制件,为我们创建不同类型的资产提供了坚实的基础,并让我们对使用 Kismet 有了更深入的了解,同时介绍了预制件以帮助我们。

在本章中,我们将扩展前几章学到的内容,并将“一切整合”以创建我们的游戏,城市战士。

在本章中,我们将涵盖以下内容:

  • 设置我们的房间,了解如何调整材质以满足关卡需求

  • 学习使用参考和占位符刷子快速原型化关卡的最佳方法,以代替艺术作品

  • 讨论使用几何模式创建关卡的可能工作流程

  • 使用我们已构建的部件构建我们的关卡,复制我们已完成的工作以使构建更快、更流畅。

  • 构建不同的战斗场景

因此,让我们开始吧!

开始工作流程

当我开始使用 Unreal 时,创建任何类型的新关卡都花费了我很多时间。我会不断放置静态网格来隐藏我遗漏的几何区域,或者添加阻挡体积,以便实际上能够通过某些地方。我遇到问题的关键原因之一是我没有意识到如何创建一个好的工作流程,而在 CSG 中轻松映射事物的关键是几何模式。在我们处理那个之前,让我们首先准备好我们的当前关卡。

行动时间——开始我们的关卡

我们现在正在从头开始构建我们的关卡,使用我们在前几章中构建的部件。既然我们已经有一个基础可以借鉴,让我们开始我们的游戏。我们可以这样开始我们的关卡:

  1. 在编辑器中,选择我们的PlayerStart演员。使用平移模式将其移动到我们关卡中第一扇门左侧。

  2. 使用平移模式将第一个敌人的出生点移动到门前面。演员上有一个小浅蓝色箭头。箭头表示演员面向的方向。考虑到这一点,在旋转模式下旋转敌人的位置,使其背对英雄。

  3. PathNode移动,使第二个敌人正好在它进入的门前面出生(右侧的第二扇门)。

  4. 在关卡当前楼层上左键单击,将其向下移动 32 个单位,通过按[]和[]键使用网格吸附,直到到达那里。

  5. 通过选择视图 | 世界属性来更改世界属性,将Kill Z设置为-64,这样我们在碰到地板时就不会死亡。

  6. 创建三堵墙来包围我们的英雄起始点,以及在他上方和下方宽度为32的屋顶和地板。创建第一堵墙,然后通过按住Alt并拖动墙到顶部视图中,将原始墙复制到另一侧。

  7. 在门前,将地板沿轴向前移动 64 个单位以创建我们的地板副本。进入几何模式,按住 Ctrl + Alt 键并拖动,直到你在顶部视图中选择左侧的两个顶点。将地板拖动,使其面对门。选择顶部的两个顶点,将其向下拖动,直到它在门前,并对底部做同样的操作。此时,你应该在门前有一个盒子。

  8. 右键点击侧面视口并选择视口类型 | 正面以将视图放置在正面模式。现在,我们的屏幕应该看起来像以下截图。开始我们的关卡——动作时间

  9. 几何模式下,选择我们的盒子,并只点击右上角的顶点。从那里使用平移工具将其向左移动 64 度,使其到达顶部其他顶点的同一位置,如图所示:开始我们的关卡——动作时间

  10. 通过选择构建 | 构建全部来构建地图。你应该能看到我们创建的通往房间的斜坡。

  11. 通过右键点击并选择视口类型 | 侧面来将视口返回到其之前的位置。

  12. 在房间中央按下 L 键以创建光源。选择光源后,将其放置在房间的 X、Y 和 Z 轴的直中心。打开点光源 actor属性,将其半径更改为512,并将衰减指数设置为16。在灯光组件中,将灯光颜色设置为浅蓝色,并将亮度更改为0.6。按下 Alt + 3 进入无光照模式,直到你准备好查看游戏的光照,但每次更改内容时你都需要重新构建才能正确查看。

    在创建新区域或游戏玩法时,一个好的参考非常重要。在虚幻引擎中,角色默认高度为 96 单位,虽然我们可以创建一个同样大小的盒子或右键点击以获取卷尺进行调整,但我们也可以在关卡中放置一个网格来给我们一个人体比例的概念。请注意,这是 Epic Games 角色的尺寸,但 UDK 并不限制你角色的尺寸。如果你希望创建自己的自定义角色,你可以这样做,但重要的是无论你做什么,都要保持一致性。

  13. 进入内容浏览器,滚动你的列,直到你可以点击UDK 游戏。选择它后,在搜索栏中输入Iron,同时在对象类型字段中检查骨骼网格选项。左键点击IronGuard 骨骼网格。在我们的关卡中右键点击,并将对象放置在关卡地面之上。请注意,你可能需要移动网格并调整网格间距以使其恰到好处。以下截图显示了此过程。开始我们的关卡——动作时间

    有一个参考是件好事,尤其是如果你试图重现现实生活中的建筑,然而请注意,在游戏中,你通常需要根据游戏玩法和摄像机工作的不同来补偿世界的不同方面。例如,游戏中的走廊通常比实际大两到三倍,尤其是在可以多人玩的游戏中,如 Left 4 Dead

  14. 左键单击我们的新演员,并通过单击 F4 打开其属性。在搜索栏中输入 Hidden 并检查 Hidden Game 属性。

    由于我们自己在游戏中,我们不需要看到我们的参考,但是如果你想在准备好之前保留我们的新演员,那就请随意吧。

  15. 通过在透视视图中左键单击它们来选择我们房间内的墙壁。

  16. 选择房间内的其他墙壁,注意记住门有两个部分和一个顶部。你可以通过按住 Ctrl 并单击每个元素或右键单击并选择 Select Adjacent Walls 来完成此操作,但此选项也可能选择建筑外的墙壁。还要选择门的内部,按 Alt + W 隐藏静态网格以选择它们,完成后记得再次按 Alt + W

  17. 前往 Content Browser 并选择要使用的墙壁材质。我个人使用了 M_LT_Walls_BSP_Recycle06b,它位于 LT_Walls 包中。一旦你左键单击了你想要的材质,就在透视视图中右键单击选定的墙壁,并选择 Add Material : M_LT_Walls_BSP_Recycle06b。以下图像显示了已添加到墙壁上的材质:行动时间——开始我们的关卡

    现在,你可能注意到材料在放置上可能看起来有点不对劲,它并不匹配;这是正常的,因为这是我们接下来要解决的问题。

  18. F5 进入 Surface 属性菜单。第一步也是最简单的一步是改变我们的对齐方式,以便刷子可以一起工作,这样我们就可以在刷子之间实现无缝过渡。要做到这一点,找到 Alignment 属性,点击 Box 选择并点击 Apply。由于我们的物体实际上形状类似于一个盒子,所以以这种方式应用材质是有意义的,如下面的屏幕截图所示:行动时间——开始我们的关卡

    然而,我认为纹理对于我创建的房间来说太小了;这也是一个简单的修复。在 Alignment 框上方,还有一个属性区域,称为 Scaling。在 Simple 选项下选择 2.0 并单击 Apply 按钮。现在我们的纹理比之前大了一倍。Scaling 框在以下屏幕截图中显示:

    行动时间——开始我们的关卡

  19. 现在,我们已经走上了正确的道路,但我想要将图像向下和向右移动,直到我到达想要纹理所在的确切位置。平移材质就能做到这一点。通过点击按钮调整纹理的UV位置,直到你得到你想要的材质位置。我个人将银色部分做成了一种房间的踢脚线。这在上面的截图中有展示:开始我们的关卡

  20. 为你的房间选择一个天花板和地板材质。我个人使用Material'LT_Floors.BSP.Materials.M_LT_Floors_BSP_Grate_Pipes'作为天花板材质,Material'LT_Floors.BSP.Materials.M_LT_Floors_BSP_Organic05b_TileBreak'作为地板材质。

  21. 现在我们已经完成了新的基础房间,点击右侧创建的门并将其删除,对生成的警告回答

  22. 在顶部视图中,按住Ctrl + Alt键并拖动,直到你选择了我们创建的整个房间。转到几何模式,在右上角顶点处右击以改变平移工具的位置。按住Alt并拖动项目到右侧,使其位于之前门的位置。右击并选择变换 | 镜像 Y 轴,移动房间直到它在我们之前创建的房间前面创建一个房间。删除你可能创建的任何额外的路径节点玩家起始演员。

  23. 通过选择构建 | 构建全部来构建我们的游戏,完成后点击关闭

  24. 通过点击主工具栏上的开始移动预览器按钮来保存你的项目并开始游戏,当它询问你保存包时,请回答。以下截图显示了我们的屏幕将如何显示:开始我们的关卡

刚才发生了什么?

采纳我们过去的建议,我们的非常简短的场景变得更加有指导性,我们的世界构建使游戏更接近于构建我们的真实游戏。考虑到这一点,我们将能够创建一个更大的环境并完成我们的示例关卡。

几何模式

在本书前面我们讨论了构建一个简单的房间,当我们创建第四章中的门时,使用 Kismet 和 Matinee,我们开始探索几何模式以及我们如何使用它。同样地,我们可以用它快速有效地创建游戏区域。

设置工作流程

你可能已经注意到,除了透视视图之外的所有视图中都存在某种网格。我们将使用网格作为创建我们水平面的指南,就像你可以用纸画出东西一样,这是我知道的一些关卡设计师用来获得区域总体感觉的方法。为了构建一个大致的区域,你需要提前计划好——比如你想要如何放置建筑,以及你想要如何引导玩家的移动。

如前所述,在编辑器中按 [] 键会减少和增加网格吸附点,使你的画笔放置在水平上更详细或更少详细。就本书的目的而言,除非我特别说明,我的网格间距设置为 32。有些人可能想要使用更小的区域,但我认为当我们进行布局时,我们真正关心的是大局和区域的总体感觉。如果你的画笔没有对齐到网格上,你可以右键点击顶点,它会自动将其吸附到网格上。如果你注意到画笔上出现了一个 X,这是可以的,但建议你转到 画笔属性 并重新应用碰撞。这可以非常有用,尤其是在处理前几章讨论的内容时,以确保你的画笔与现在使用的网格对齐。与网格一起工作是确保你在创建水平时不会出现任何空隙和/或画笔重叠的基本方法。这是确保你的减法画笔按预期工作的另一种方法;然而,如果可能的话,我从不使用减法画笔。

使用 几何 模式时需要注意的一点是:在我们再次构建 BSP 画笔之前,你将看不到我们在 几何 模式中的任何更改。

小贴士

在所有的《虚幻竞技场》游戏(以及我们使用的类似 UTDeathmatch 游戏中),1 个虚幻单位等于 2 厘米。这意味着 96 个单位高的角色实际上有 6 英尺高!话虽如此,由于玩家的视野(FOV)原因,按比例建造的东西往往看起来比实际要小得多,但这是从现实生活出发建造时的一个很好的基础。

一些键盘技巧

同时按住 Ctrl + Alt 并拖动可以让你选择包含在内的所有对象。如果你处于 几何 模式,这将允许你选择单个/重叠的顶点,让你可以非常容易地增加或减少画笔的大小,这是我们将在下一节中创建建筑时使用的。

另一个有用的技巧是,如果你在视图中按住 Ctrl 并拖动鼠标左键,它将移动你从任何位置选定的刷子、演员和/或顶点。这是一种移动可能不在远处或当你不需要移动屏幕且不想使用通常由对象使用的工具的方式。

如果你只是在透视视图中左键点击一个刷子,它将选择物体的面。虽然这对于将材质应用到刷子上来说是可以的,但在其他视图中,它将选择刷子进行编辑。如果你按住 Ctrl + Shift 并在地图上左键点击,你会注意到你现在将选择你点击的刷子。然而,有时它可能无法选择你认为你选择的刷子,这就是为什么我主要使用顶部和/或侧面视口的原因。

看到双重

复制我们已创建的东西,如墙壁或建筑,是一种快速遮挡环境的有效方法。我们在之前的例子中通过复制我们创建的房间来做到这一点。我们最关心的是创建最佳的游戏玩法,所以我们不太关注细节,基本上只想遮挡一个区域,以便我们可以尽可能快地迭代。毕竟,你更愿意去掉一个巨大的盒子,而不是一个荒谬详细的公司大楼。

使用我们创建的刷子,我们可以将关卡交给你的团队的环境艺术家(或者如果你对 3D 建模知识有天赋,就是你),他将把 BSP 刷子转换为网格,放置在我们的关卡中,以赋予我们想要的视觉风格。

在我们的关卡中放置了一个刷子之后,你实际上不再需要建造刷子。除非你正在创建除了盒子之外的东西,你可以直接复制刷子并使用 几何 工具对其进行塑形,以快速塑造区域,这通常会使构建过程更快。如果你也觉得可以没有建造刷子,你可以按 B 键来切换建造刷子的开关。

构建我们的关卡

在了解如何开始工作流程之后,我们现在可以通过构建我们关卡的其他部分来应用这些知识!

动手实践——构建我们的关卡

现在我们关卡的开头已经完成,让我们添加简单的建筑和形状,我们可以用我们之前创建的脚本填充它们!这样做如下:

  1. 从顶部视口复制我们之前制作的房间中的一个墙壁,通过左键点击它,按住 Alt 并将其拖动下来,将顶部端点放置,使墙壁覆盖两个门之间的缝隙。在 几何 模式下,抓住两个底部的顶点并将它们向下拖动以创建一个类似正方形的形状,然后在侧面视口中将顶点向上拖动以创建一个建筑。这就是我们的屏幕看起来会是什么样子。动手实践——构建我们的关卡

  2. 在创建了第一个建筑之后,我们可以轻松地构建其他建筑。通过拖动来复制它,创建三个不同大小的建筑,以形成一个引导玩家向左走的阻挡路径。以下截图显示了这一点。行动时间——构建我们的关卡

  3. 我们不仅可以扩展和修改刷子,还可以修改体积!通过选择这两个对象并将它们拖动出来,扩展我们的当前Lightmass 重要性体积和地板。行动时间——构建我们的关卡

  4. 左击我们创建的一个预制门,然后在玩家左转后稍远的地方创建另一个门,确保将门降低,使其与地面很好地契合。我们不希望门像之前创建的版本那样伸出去,所以选择顶部六个点并将门拖动过来,之后调整顶部两个点,以创建一个均匀的门。然而,门的 KActor 本身不会改变,所以右击预制门并选择将 PrefabInstance 转换为普通演员。从那里,你可以使用顶部和侧面视口作为指南移动门到正确的位置,并在必要时构建以帮助你可视化关卡的外观。

  5. 复制建筑,改变高度,将一个放置在新增门北边,另一个放置在它北边,以为玩家打开一个小区域进行探索。这可以在以下顶视图截图中看到。行动时间——构建我们的关卡行动时间——构建我们的关卡

    注意,我故意在门持有者前面的建筑上做了标记,以向玩家展示有一条可以走的路径,给玩家一种在关卡中做出选择的感觉。

    在这个阶段,玩家可以选择两条路径之一,我们将它们汇聚到一个大区域。创建不同大小和形状的建筑来填充中心庭院,注意使最北边的建筑群中最低,因为那里是我们将引导玩家前往的地方。

    行动时间——构建我们的关卡

  6. 在庭院的中心,首先创建一个大约 32 单位高的盒子,然后构建地图,然后在透视视图中左击刷子的面。切换到缩放模式并缩小顶部面。如果你构建游戏,你会注意到现在刷子有倾斜。玩游戏以确保你可以在祭坛上上下走动,然后再继续前进。

    高地会吸引玩家到这个位置,而且我们稍后会在那里放置敌人,所以这是一个吸引注意力的好方法。

  7. 以与我们为第一个房间创建斜坡相同的方式,为最远建筑物的顶部创建斜坡。我个人创建了一个向前延伸的斜坡,然后是一段直线,然后是另一个斜坡以实现左转。这可以作为一个消防梯,但我们基本上是想让玩家知道去这里,如下面的截图所示:行动时间——构建我们的关卡

  8. 通过选择顶部两个顶点并向北拖动,然后在右侧选择两个顶点并向东拖动,在北和东方向扩展你的地板和光量重要性体积

  9. 创建建筑以形成一个封闭区域,通向一个最终位置,你将保持该位置开放,并且在该位置的网格对齐点为 128 时,宽度为四个网格方格。行动时间——构建我们的关卡

  10. 在你创建的开放空间中心放置StaticMesh'ASC_Floor2.SM.Mesh.S_ASC_Floor2_SM_Stairs_Simple_01'。为其每一侧创建一个斜坡形状以覆盖其侧面。

  11. 在你创建的两个斜坡上方创建两个垂直的大柱子。在柱子的顶部放置另一个倾斜的刷子。

  12. 为我们创建的入口创建一个天花板和地板。

  13. 将我们创建的两个长柱子复制到庙宇内部。

  14. 在第二个柱子后面创建一个辅助楼梯和一条通往其升高路径的地板。

  15. 在地板前方放置一堵墙,在庙宇的两侧放置墙壁。

  16. 在第二段楼梯前放置一个StaticMesh'NR_Deco.SM.Mesh.S_NR_Deco_SM_FountainTop03',在其上方放置ParticleSystem'Castle_Assets.FX.P_FX_Fire_SubUV_01',再上方放置一个聚光灯(通过按L键并在视图中点击你想放置的位置),半径为1024,亮度为.3,颜色为深红色。在光量设置中,将光源更改为32,并将项目复制到楼梯的另一侧。行动时间——构建我们的关卡

  17. 现在通过使用Material'LT_Floors.BSP.Materials.M_LT_Floors_BSP_Dark_TileBreak_02'为墙壁和Material'LT_Floors.BSP.Materials.M_LT_Floors_BSP_Organic05b_TileBreak'为我们的庙宇的地板和天花板进行快速纹理处理。选择所有材料,并对其进行简单的缩放4.0

  18. 选择主要方向光演员,并将其光颜色更改为深蓝色。

  19. 在玩家路径之外但仍在他们的视野内,放置一些StaticMesh'LT_Mech.SM.Mesh.S_LT_Mech_SM_CityNoRing01'演员来为我们的关卡创建场景。请注意,这个网格是为 PC 多人游戏《虚幻竞技场 3》创建的,并且根本没有针对移动游戏进行优化。话虽如此,不要在关卡中放置超过四个,否则在测试时游戏会真的开始变慢。下面的截图显示了完成后的关卡的样子:行动时间——构建我们的关卡

刚才发生了什么?

我们的水平现在有一个清晰的开始、中间和结束。玩家需要前往的目标以及一些背景和灯光效果都是可见的。现在我们只需要添加我们的交互元素,我们的游戏就完成了!

尝试一下英雄——增益和武器拾取

级别设计师拥有的一个工具是奖励玩家走特定的路线。促进探索并为玩家提供出去的理由会使你的关卡更加有趣。在Actor类别的标签页中有一个名为UTPickupFactory的类,它有健康武器拾取。试着在你的新创建的关卡中放置一些好东西。我个人在通往寺庙的区域放置了一个火箭发射器。

战斗场景

由于我们实际上在制作一款第三人称射击游戏,因此我们希望在游戏中拥有不同的战斗场景是有意义的。完成我们关卡布局后,我们现在将添加使我们的关卡生动起来的东西!我们在上一章中讨论了敌人的创建以及关于战斗场景的建议,所以现在我们将根据这些课程来创建我们自己的游戏。

行动时间——第一个战斗场景

我们将使用触发体积来生成敌人,并让他们在你的环境中互动。这可以按照以下步骤进行:

  1. 在编辑器中,复制通向第二个区域的门的上半部分,并将其移动,使其前面与我们一起创建的分割建筑相连。右键单击演员,选择转换 | 转换为体积 | 触发体积。之后,转到侧面视口并调整底部顶点,使其接触到地板。提示:按下Alt + W将使之前放置的静态网格消失。下面的截图显示了这一点:行动时间——第一个战斗场景

  2. 复制我们刚刚创建的触发体积,并将其直接放置在这个体积的上方。这样,无论玩家选择哪个方向前进,都会发生一些事情。

  3. 我们将在我们创建的两个路线的每个后面放置两个路径节点,以及在中间放置两个路径节点。我们将要做的是,当玩家触碰到这些触发器中的一个时,生成两个敌人,这两个敌人将沿着玩家最初选择的路径移动,如下面的截图所示:行动时间——第一个战斗场景

    左键单击我们创建在顶部的触发体积,打开 Kismet。通过从弹出菜单中选择 使用 TriggerVolume_5 新建事件 | 触摸 创建一个 触发体积触摸 事件。

  4. 左键单击我们创建在底部的触发体积,打开 Kismet。通过从弹出菜单中选择 使用 TriggerVolume_6 新建事件 | 触摸 创建一个 触发体积触摸 事件。

  5. 通过右键单击并选择 新建动作 | 切换 | 切换 来创建一个 切换 动作。将 事件 链接连接到 TriggerVolume_5 Touch 动作的最顶部。将 TriggerVolume_6 Touch 动作的 Out 输出连接到这个切换动作的 关闭 输入。

  6. 创建另一个切换动作,如果调用此动作,则关闭另一个动作。以下截图显示了到目前为止我们所做的工作:行动时间——第一个战斗场景

  7. 对于每条路径,通过选择 新建动作 | 设置变量 | 对象 创建两个设置 对象 动作。在 变量链接下放置我们创建的两个顶部路径节点到顶部触发器,底部两个到另一个。不用担心目标,我们将在后续步骤中处理。

  8. 将我们之前创建的 EnemyAI 子序列复制粘贴两个副本,紧挨在一起。将第二个 设置对象 变量输出的 Out 连接到第一个 EnemyAI 对象的 In,第一个的 Spawned 输出连接到第二个的 In。为每个节点在 Spawned 链接下方创建一个对象变量,并将我们放置在玩家视线之外的路径节点作为两个对象的出生点。

  9. 通过右键单击并选择 新建动作 | AI | 移动到演员 创建一个 移动到演员 动作。在 目标 变量链接下方连接我们创建的第一个已生成对象。在 目的地 创建一个 对象 变量并将其连接。将 EnemyAI 动作的 Spawned 输出连接到 移动到演员 动作的 In 输入。此外,在第五步中讨论的 设置变量 动作中,将每行第一个对象的 目标 变量链接连接到该对象。

  10. 现在创建第二个 移动到演员 动作,使用第二个 EnemyAISpawned 变量链接作为 目标,并在 目的地 链接下创建一个新的 对象 变量,将其设置为每条路径中第二个 设置对象目标行动时间——第一个战斗场景

    在这个教程的某个时候,您可能会在项目中看到问题或错误,内容大致如下:SeqAct_ActorFactory_0 没有出生点!在这种情况下,进入 Kismet,找到那个问题节点,双击以在编辑器中选择它,然后双击它包含的 敌人 AI 序列。在 演员工厂 动作中点击加号图标以向出生点列表添加新项目,如果尚未填写,请点击指向左边的箭头以使用我们选择的对象填写值。退出子序列,并将之前附加到它上的项目再次连接起来。下次运行您的游戏时,它应该会再次开始工作。

  11. 通过选择 构建 | 构建全部 来构建我们的游戏,完成后点击 关闭

  12. 保存您的项目,然后通过在主工具栏上点击 开始移动预览器 按钮来开始您的游戏。游戏的预览应该看起来像以下截图:行动时间——第一个战斗场景

刚才发生了什么?

只需一点努力,我们就可以轻松地在游戏中创建第二个战斗遭遇,它会根据玩家的行为进行调整。

尝试一下英雄——创建自己的战斗遭遇

下一个部分我将留作空白区域,供您创建一些自己的战斗遭遇。您可以放置一些掩体,或者交替使用武器。尽量想一些真正能让别人说“哇!”的东西。

行动时间——关卡结束

我们将使用触发体积来生成敌人,并让他们在您的环境中交互。

  1. 在我们之前创建的寺庙前面放置一个触发体积。在寺庙后面以及第二个柱子后面,在玩家的视线两侧放置路径节点。这在上面的视口截图中有显示:行动时间——关卡结束

    这就是游戏中的样子。

    行动时间——关卡结束

    注意

    按下 P 键以查看由路径节点创建的路径。如果您在两组节点之间看不到任何线条,您可能需要放置一个或两个额外的节点,以确保敌人的路径布局正确。

  2. 在我们的触发体积上左键单击,并在 Kismet 中创建一个 触发体积触摸 事件。

  3. 将前一个示例中的两个 EnemyAI移动到演员 动作复制并粘贴,并将其连接到 触发体积事件

  4. 删除出生点链接,并用寺庙顶部的两个节点替换它们。删除 移动到演员 事件中的 目的地 链接,并让它们前往前方的路径节点。

  5. 复制您的触发体积并将其放置在寺庙的山顶上。创建一个带有 控制台命令 事件的触摸事件,提示输入 quit

  6. 通过选择 构建 | 构建全部 来构建我们的游戏,完成后点击 关闭

  7. 通过点击主工具栏上的开始移动预览器按钮保存您的项目并开始游戏。

刚才发生了什么?

我们创建了一个新的战斗场景,其中敌人跑进掩护处,使自己变得脆弱,同时让玩家知道他们的位置。我们还创建了一个级别的终点,使我们能够完成游戏。以下截图显示了这一点:

刚才发生了什么?

突击测验

  1. 在不使用网格吸附的情况下创建级别有哪些问题?

    a. 我们几何中的洞。

    b. 重叠笔刷。

    c. 确保减法笔刷能正确工作。

    d. 以上所有。

  2. 你使用哪些键来增加或减少网格吸附?

    a. + 和 。

    b. 左右箭头键。

    c. [和]。

    d. (和)。

  3. 是否有可能将事件的最大触发次数设置为 0(可以触发任意多次)而不再触发?如果可能,我该如何做?

    a. 错误,我们不能切换事件的开关。

    b. 错误,最大触发次数必须是正数。

    c. 正确,我们可以切换事件的开关。

    d. 正确,这是自动完成的。

摘要

我们现在已经到达了本书游戏开发部分的结尾。现在你有很大的空间来使你的项目变得独特,添加新级别,并探索虚幻引擎的不同方面;我们已经为真正令人惊叹的游戏奠定了基础。

在这短暂的时间内,我们设法覆盖了很多内容。我们特别学习了:

  • 如何设置我们的房间,了解调整材质以适应级别需求

  • 使用参考和占位符笔刷快速原型化级别的最佳方法,以代替艺术作品

  • 使用几何模式创建级别的可能工作流程

  • 如何使用我们已构建的部件来构建我们的级别,复制我们已完成的工作,以使构建更快、更流畅

  • 不同战斗场景的实现

现在我们已经学会了如何构建级别并创建了所有的游戏部分,在下一章中,我将向您展示如何添加主菜单以及播放声音,将自定义内容集成到您的游戏中,讨论优化,并在我们将其上传到 App Store 之前尽可能多地调试您的 iOS 游戏项目!

第七章。城市战士的高级内容创建

由于我们上一章完成的游戏关卡,我们现在有一个经过测试的关卡,我们知道它非常有趣。现在我们有一个很好的基础可以在此基础上构建,我们可以为我们的游戏创建自己的内容,以定制它并使游戏真正属于你自己。

在本章中,我们将讨论以下内容:

  • 为我们的游戏创建带有输入的主菜单

  • 在移动 UDK 上为我们的游戏添加音频

  • 将自定义纹理导入我们的游戏

  • 为 PC 和 iOS 创建材料

  • 在移动 UDK 上为我们的游戏添加静态网格

  • 关于 iOS 优化和调试的一些技巧

我将在本关卡中带入游戏中的资源将在 Packt Publishing 网站上提供,但根据本章提供的信息,应该相当容易创建你自己的资源并将其带入游戏。话虽如此,让我们开始吧!

小贴士

下载示例代码

你可以从你购买的所有 Packt 书籍的账户中下载示例代码文件。www.packtpub.com。如果你在其他地方购买了这本书,你可以访问www.packtpub.com/support并注册以直接将文件通过电子邮件发送给你。

主菜单环境创建

虽然直接进入游戏动作很方便,但大多数游戏都有某种类型的菜单。这也会是一个很好的方式来展示我们如何在做一些不同的事情之前使用我们已经覆盖过的方面。

构建主菜单背景的时间

当然,大多数游戏中的菜单看起来像是有特殊的东西,但实际上它们只是一个新关卡。要构建主菜单背景,请执行以下步骤:

  1. 首先,让我们打开之前在第三章中使用的地图,“提升至新水平;内容丰富”。选择天空穹顶和创建的两个方向光源,通过按Ctrl+C复制它们,这在上面的截图中有展示:构建主菜单背景的时间

  2. 通过选择文件 | 新建..并选择空白地图模板来创建一个新的关卡。将对象粘贴到你的关卡中。

  3. 右键单击左侧工具栏中刷子文本直接下方的立方体图标。在构建刷子的设置中勾选空心选项。这将创建一个空心立方体。点击构建按钮,然后通过点击我们之前在第二章中使用的CSG_Add选项或使用Ctrl+A将几何体添加到我们的关卡中。

  4. 将相机移入盒子内部,通过右键单击并选择 新建角色 | 新建玩家开始 来创建一个 玩家开始 角色对象。如果对象上有红色 X,则移动对象,直到其四周都有足够的空间,以便在那里生成玩家:动手实践——构建主菜单背景

  5. 通过访问顶部菜单并选择 查看 | 世界属性 来访问 WorldInfo 属性。在 游戏类型 部分设置 默认游戏类型 和 PIE 的 游戏类型MobileMenuGame

  6. 通过从实际游戏关卡复制粘贴或在内置浏览器中找到 StaticMesh'LT_Mech.SM.Mesh.S_LT_Mech_SM_CityNoRing01,以使它们在所有角度都有建筑物的样子,将两个对象放置到你的游戏世界中:动手实践——构建主菜单背景

  7. 通过选择 查看 | 浏览器窗口 | 角色类 来访问 角色类 选项卡。选择在 通用 | CameraActor 中找到的 CameraActor 并退出建筑。通过右键单击并选择 在此处添加相机角色 来创建一个相机。将相机放置在区域中间,略微倾斜朝向天空。特别是要确保你看不到我们之前创建的空心盒子。如果你更容易将其移开,请随意操作。动手实践——构建主菜单背景

  8. 按下 F4 以访问相机角色的属性。在 运动 部分将 物理 属性更改为 PHYS_Rotating。选择 旋转速率偏航 部分,并将其设置为 20。这种特殊的物理类型将使角色沿着旋转速率移动,但无法执行其他操作。这对于我们的主菜单来说会很棒,因为我们只想有一个漂亮的背景效果出现。这就是相机角色属性窗口的显示方式:动手实践——构建主菜单背景

  9. 在我们的关卡创建完毕且已选择 CameraActor 后,让我们进入 Kismet。创建一个 关卡加载事件(新建 事件 | 关卡加载)。在其右侧创建一个新的 Matinee,通过右键单击并选择 新建 Matinee。将 关卡加载 事件的 已加载可见 输出连接到 Matinee播放 动作,并双击 Matinee 进入 Matinee 编辑器。

  10. 通过右键单击并选择 添加新相机组 来创建一个名为 Turning Camera 的相机轨迹。然后通过右键单击并选择 添加新导演组 来创建一个新的 导演组。在 Matinee 序列的开始处添加一个 关键帧,并在出现的 切到组 选项中选择 Turning Camera。关闭 Matinee 编辑器。

  11. 在 Kismet 中返回,选择 Matinee 对象并确保已勾选 循环 选项。退出 Kismet。

  12. 创建一个光子重要性体积来覆盖玩家周围的区域,包括建筑物。同时确保灯光不在任何建筑物内部,如果需要,请移动它们。

  13. 通过选择构建 | 构建全部来构建我们的游戏,完成后点击关闭

  14. 通过点击开始移动预览器按钮保存您的项目并开始游戏。您的屏幕应该看起来像这样:动手实践——构建主菜单背景

刚才发生了什么?

现在我们看到城市景观,随着摄像机以恒定速度移动。这将是我们标题屏幕的一个很好的背景,以此为基础,我们可以构建我们的主菜单。

导入纹理

移动图形硬件与不同的格式一起工作,并且与普通 PC 图形硬件处理纹理的方式不同。通过采取必要的预防措施并相应地创建纹理,可以避免许多障碍。现在,我绝不是艺术专家,但我会简要介绍一些如果你决定为 iOS 自己制作纹理时应该遵守的事情。

在创建自己的纹理时,重要的是使图像的大小为 2 的幂,例如 256、512、1024 和 2048。计算机为了效率的目的以“块”处理数据。在游戏内容创建中,尤其是在移动设备上,如果纹理不是 2 的幂,Unreal 将会浪费时间和处理资源来修复这个问题。实际上,2 的幂规则的本质是优化,尽可能高效和“轻量”,同时为用户提供适当的视觉体验。当与 iOS 一起工作时,硬件纹理的大小可以达到 2048 x 2048,但请谨慎使用。这对于针对低端设备(如 iPhone 3GS、iPad 1 和 iPod touch 第 4 代)的游戏尤其重要,这些设备只有 256MB 的 RAM。

支持以下纹理格式:.bmp, .pcx, .png, .tga, .float.psd

动手实践——完成主菜单

话虽如此,让我们将第一个纹理导入到游戏中:

  1. 通过选择其图标或转到视图菜单并选择视图 | 浏览器窗口 | 内容浏览器来打开内容浏览器。在窗口底部的菜单中点击导入按钮。找到您想要导入到游戏中的图像并选择打开动手实践——完成主菜单

  2. 将出现一个导入对话框。在部分输入名称UW-MainMenuPKG并确认logo名称部分。你应该会回到内容浏览器,在那里你会看到我们的新包,包含一个新文件:动手实践——完成主菜单

  3. 在左侧工具栏的部分下方的新包选项中,右键点击我们刚刚创建的包,并选择保存以将包保存为文件。经常保存东西是很重要的,以确保你不会丢失你的工作:完成主菜单的时间——动作时间

    关闭内容浏览器并返回到 Kismet。通过右键点击并选择新事件 | HUD | 绘制图像来创建一个绘制图像事件。在其属性中,选择显示颜色为白色。在显示位置部分,将X值设置为.25。将XLYL设置为0.5,将ULVL设置为512。需要注意的是,这个 Kismet 事件没有提供进行适当缩放以适应不同宽高比选项,因此更复杂的标志可能会被压扁,所以请调整这些值直到找到适合你的设置。勾选是否激活复选框,并将授权全局缩放更改为1.0。转到内容浏览器,左键点击我们的标志图像。在绘制图像属性中,点击显示纹理选项旁边的绿色箭头,以便在世界上设置我们的标志图像。通过右键点击并在目标下方选择新变量 | 玩家 | 玩家来放置一个 Player 0 变量。在玩家变量中,取消勾选其属性中的所有玩家复选框。以下截图显示了我们所做的几个更改:

    完成主菜单的时间——动作时间

  4. 通过点击开始移动预览器按钮保存你的项目并开始游戏。这就是预览将看起来像什么:完成主菜单的时间——动作时间

    现在我们有一个在游戏开始时跟随我们的标题,但到目前为止,没有任何动作发生,也没有正确开始游戏的方法。接下来我们要做的是在屏幕中间放置一些文字,上面写着“点击任何地方开始”,然后创建一个按钮,点击后可以打开我们的主游戏关卡。了解我们的计划后,我们现在就来做这件事!

  5. 通过转到视图菜单并选择视图 | 浏览器窗口 | 内容浏览器来打开内容浏览器。在对象类型部分,将选项卡从收藏夹更改为所有类型,并勾选字体。在搜索栏中输入36,并左键点击底部特定的字体,即Font'UI_Fonts.Fonts.UI_Fonts_Positec36'。选择它后,打开 Kismet。完成主菜单的时间——动作时间

  6. 返回 Kismet,通过在 Draw Image 事件旁边右键单击并选择 New Event | HUD | Draw Text 来创建一个 Show Text 事件。在 Properties 部分点击 Display Font 旁边的绿色箭头来设置我们将要使用的字体。将 Display Color 改为白色。在 Display Location 中将 X 设置为 .5Y 设置为 .75 以直接位于我们的图像下方,Z 设置为 0。在 Display Text 部分键入 Tap anywhere to begin!。将 Text Draw Method 改为 DRAW_CenterText 并勾选 Is Active 复选框。将 Authorized Global Scale 改为 1.0。在 Target 下方通过右键单击并选择 New Variable | Player | Player 来放置一个 Player 0 变量,并在其属性中取消勾选 All Players 复选框。我们所做的几个更改在以下屏幕截图中可见:Time for action—finishing the main menu

  7. Draw Text EventActive 部分下方创建一个布尔变量,通过在单词下方的方块上右键单击并选择 Create New Bool Variable 来实现。通过选择它及其相关对象,并按住 Ctrl 键拖动鼠标左键来移动我们刚刚创建的 Matinee Sequence 到 Level Loaded 事件中。在 Level Loaded 事件右侧通过右键单击并选择 New Action | Toggle | Toggle 来创建一个新的 Toggle 动作。将 Loaded and Visible 输出连接到 ToggleToggle 输入。将 ToggleBool 输入连接到我们的 Draw Text 动作的布尔值。将 Toggle 事件的 Out 连接到其 Toggle 输入,并在 Out 输出上右键单击,然后点击 Set Activate Delay 并将其值设置为 0.1,如以下屏幕截图所示:Time for action—finishing the main menu

  8. 现在我们有了闪烁的文本提示玩家点击按钮,我们为什么不创建一个可以响应玩家触摸的按钮呢?断开 Level Loaded 事件的 Loaded and Visible 输出与 Toggle 事件的 Toggle 输入之间的连接,将其移到右侧,并通过右键单击并选择 New Action | Mobile | Add Input Zone 来创建一个 Add Input Zone 动作。将 Zone Name 设置为 StartGame。点击 New Zone 旁边的蓝色小三角形来创建一个新的 MobileInputZone。在您刚刚创建的 Zone 中,在 Bounds 部分将 Authored Global Scale 设置为 1.0,将 Size XSize Y 设置为 1.0,并勾选 Relative Size XRelative Size Y 复选框,如以下屏幕截图所示:Time for action—finishing the main menu

    现在我们已经创建了一个按钮(它是不可见的,所以你看不到它,但我向你保证它在那里),我们应该着手创建一些当它发生时的交互。

  9. 通过右键点击并选择 新建事件 | 输入 | 移动按钮访问 来创建一个 移动按钮访问 事件。在 目标区域名称 下的 Seq Event Mobile Zone Base 属性中,放入我们之前创建的区域,StartGame。在 序列事件 部分将 重新触发延迟 改为 1.0。在 序列对象 属性下的 Obj Comment 中输入 Pressed,然后勾选 输出对象注释到屏幕 复选框。

    在 Unreal 编辑器内部,无法打开其他关卡,但在实际游戏中是可行的。这只是为了验证按钮确实对我们有效。

  10. 通过右键点击并选择 新建动作 | 杂项 | 控制台命令 来创建一个 控制台命令 动作。在 [0] 下的 命令 部分输入 open levelname,其中 levelname 是你想要加载的关卡名称。在 控制台命令目标 下方创建一个 玩家 0 变量。记住,当你准备好发布游戏时,请移除你创建的注释。

  11. 保存你的项目,并点击 开始移动预览器 按钮来开始你的游戏。预览将类似于以下截图:动作时间——完成主菜单

刚才发生了什么?

这样,我们就创建了一个主菜单,当我们点击屏幕时,会进入我们的游戏关卡,为我们的游戏创造一个专业的开始。

添加声音

许多人认为理所当然的事情,声音,当人们在玩你的游戏时,可以产生巨大的影响。为了让你体验一下将声音添加到游戏中的简单性,让我们在游戏开始时添加一个声音。

然而,尽管添加声音到我们的游戏中很简单,但在 iOS 设备上播放声音却相当困难——因为它需要大量的计算,因为 iOS 设备一次只能播放一个声音;这是因为播放的声音是不压缩的。这与你在电脑上听的音乐(除非你是音响发烧友)不同,音乐是以 MP3 等格式压缩的,它使用压缩算法来保持文件大小小。然而,不压缩的声音使得文件变得很大。在同一个帧中初始化多个声音可能会导致很多性能问题。如果你能帮忙的话,最好不要同时播放多个声音。话虽如此,你仍然希望将它们尽可能缩小。在 iOS 上使用 22 kHz 声音而不是 44 kHz 声音是一个简单的方法,可以获取到很多本应用于处理声音文件的性能。考虑到 iOS 设备的典型用途要么是通过设备上糟糕的扬声器,要么是通过糟糕的耳机,你可以通过最小的声音差异获得很多性能提升。

动作时间——播放音效

我们想让玩家知道我们已经理解了他/她点击开始游戏的行为。让我们播放一个声音来向他/她展示我们知道。我们可以这样做:

  1. 通过选择其图标或转到视图菜单并选择视图 | 浏览器窗口 | 内容浏览器来打开内容浏览器。在窗口底部的菜单中单击导入按钮。找到你想要带入游戏的声音并选择打开。在弹出的窗口中设置与刚刚创建的包名相同的包,并在选项菜单中打开选项卡并勾选自动创建提示,然后单击确定,如果询问你是否导入整个包,请回答是。执行动作——播放声音效果

  2. 内容浏览器的左侧右键单击包名,通过在菜单中选择保存来保存我们的包。左键单击声音提示对象并退出到 Kismet。执行动作——播放声音效果

  3. 在 Kismet 中,通过按住Alt并单击连接到Mobile Button Access事件的线条,将我们之前创建的Console Command动作断开连接,并按住Ctrl并拖动将其移动到右侧。在可用空间中,通过右键单击并选择新建动作 | 声音 | 播放声音来创建一个播放声音动作。在播放声音动作的属性中,单击播放声音属性中的绿色箭头将其设置为创建的声音。将Mobile Button Access事件的Input Pressed输出连接到播放声音动作的播放,并将播放声音动作的Finished连接到Console Command事件。你的屏幕应该看起来像以下截图:执行动作——播放声音效果

  4. 通过单击开始移动预览器按钮保存你的项目并开始你的游戏。

刚才发生了什么?

现在每次我们点击屏幕时,我们的菜单都会创建一个声音!

自定义声音

注意,我现在处理声音的方式并没有考虑到声音在空间中的位置。由于声音将直接在播放器处播放,所以这并不重要,但如果你想要的话,你可以通过在内容浏览器中右键单击SoundCue并选择使用 SoundCue 编辑器编辑来编辑SoundCue

SoundCue 编辑器与 Kismet 非常相似,除了只有当它被播放时才会调用事件,这通过一个扬声器图标表示。衰减功能可以应用于事件,以便将给定的声音放入世界空间,而不是总是保持相同。然而,这仅适用于单声道声音。

自定义声音

一旦设置好,你就可以将 SoundCue 拖放到关卡中,进入游戏世界。所以如果你想在关卡中通过这种方式添加声音效果,欢迎尝试,当你绕着关卡走动时,声音会根据你在游戏世界中的位置而变得更响或改变位置。这里还有很多其他功能可以查看,例如随机化器,但我们在这里只播放一个简单的声音。在你自己的时间里尝试一下,或者查看 Epic 为 UDK 提供的 Sound Cues,看看你可以做些什么,比如添加调制和变化到声音中,就像枪声根据你在游戏世界中的位置而有所不同一样,当你开火时。享受这个过程吧!

添加音乐

与声音类似,在 iOS 上音乐的处理方式与在 PC 上略有不同。由于手机通常是媒体播放器,它们有专门用于高效播放音乐的硬件,但移动平台在功能上也有所限制。让我们首先在我们的关卡中添加一些音乐。

添加背景音乐轨道的时间——操作步骤

现在,移动设备有专门用于压缩声音的音效硬件。iOS 设备可以一次播放一个压缩流,几乎没有成本,所以我们的任务就是创建适合这种环境的音乐。然而,MP3 文件在 Unreal 的 PC 版本中既在编辑器中也在主游戏中都不适用,所以我将向你展示如何在编辑器中添加音乐。我们可以这样做:

  1. 打开 Windows 资源管理器并打开你的 UDKGame\Build\iPhone\Resources\Music 文件夹。这个文件夹是你需要放置任何你希望在游戏中播放的 MP3 文件的地方。为了这个示例,我们将使用 UDK 中已包含的文件,但你可以随意放入你喜欢的任何 MP3 文件,并且每当我说 Jazz_Menu_01 时,请输入你文件的名称。音乐文件夹看起来如下截图所示:添加背景音乐轨道的时间——截图

  2. 通过选择其图标或转到 视图 菜单并选择 视图 | 浏览器窗口 | 内容浏览器 来打开 内容浏览器。在 内容浏览器 中,将 对象类型 更改为 声音提示 并在窗口顶部的文本框中输入 music。左键单击第一个项目 SoundCue'A_Music_GoDown.MusicSegments.A_Music_GoDown_Ambient01Cue' 并进入 Kismet。以下截图显示了这一点:添加背景音乐轨道的时间——截图

    注意

    注意,当这个文件在 iOS 设备上运行游戏时,它不会被用于游戏,但它会确保你知道声音正在播放。如果你有自己的音乐文件,你可以使用 Audacity (audacity.sourceforge.net/) 导出它,并以与声音效果相同的方式导入它,但这是一个很好的个人练习。

  3. 在 Kismet 中,删除Level Loaded事件上的Loaded and Visible输出与Add Input Zone动作的In部分之间的连接。通过按住Ctrl键并拖动将Level Loaded动作向左移动。在创建的空间中右键点击并创建一个Play Music Track动作,通过右键点击并选择New Action | Sound | Play Music Track。将Level Loaded事件的Loaded and Visible输出连接到Play Music TrackIn,并将Play Music Track动作的Out连接到Add Input Zone动作的In。在Play Music Track动作的属性中扩展Seq Act Play Music Track部分。点击Sound Cue旁边的绿色箭头来设置要播放的 PC 版本音乐,然后在屏幕底部你会看到MP3Filename,在那里你会放置Jazz_Menu_01.行动时间——添加背景音乐轨道

  4. 保存你的项目,然后通过点击开始移动预览器按钮来开始你的游戏。

刚才发生了什么?

这样,我们就创建了一个主菜单,点击后会进入我们的游戏关卡创建,为我们的游戏提供了一个专业的外观。

自定义材质

材质是虚幻引擎用来将图像放置到我们创建的画笔或 3D 模型上的东西;现在,我们将在下一分钟内放入自定义模型,但首先我们需要放入材质,对于那些不知道如何使用 3D 建模程序的人来说,这将是他们能够做到的极限,而不需要学习另一个程序。还有一些仅使用材质和 BSP 以及最小网格的令人惊叹的专业质量地图,例如在holp.beyondunreal.com/index.htmlHardcore Oldskool Low-Poly Map Pack,所以如果你不想学习,你不必学习,但这有帮助。

行动时间——自定义画笔

在上一章中我们创建的关卡确实看起来不错,但如果我们能在关卡中加入实际的建筑会更好,所以让我们尝试通过添加一些自定义材质来使画笔更像建筑!

  1. 通过选择其图标或转到视图菜单并选择视图 | 浏览器窗口 | 内容浏览器来打开内容浏览器。在窗口底部的菜单中点击导入按钮。通过点击一个文件,按住Ctrl键并选择另一个文件来选择building03building03_NRM两个文件。选择后点击打开。你的屏幕将看起来像这样:行动时间——自定义画笔

  2. 将会出现一个导入对话框。在部分输入名称UW-GamePKG并确认building03位于名称部分。在选项部分勾选创建材质复选框,然后点击确定。对于building03_NRM文件,取消勾选创建材质选项并点击确定。你应该会返回到内容浏览器,在那里你会看到我们新的包含三个新文件的新包,如下面的截图所示:操作时间——自定义刷子

  3. 双击building03_Mat材质以进入材质编辑器。一开始,材质编辑器可能看起来有些吓人,但就像声音编辑器一样,当你仔细观察时,它和 Kismet 非常相似。点击带有我们导入的纹理的纹理样本,并按住Ctrl键将其拖动到漫反射选项的右侧。

  4. 前往内容浏览器,通过左键单击building03_NRM纹理并返回材质编辑器来选择它。按住T键并在预览材质 _0区域的法线部分附近屏幕上左键单击,你应该会看到一个新的纹理样本出现。你也可以从右侧的菜单中选择纹理样本并将其从材质表达式区域拖动并放置。将预览材质 _0法线选项连接到新的纹理样本的黑色连接器。

    你会注意到我们的材质现在看起来有了深度。这是因为法线贴图是一种用于模拟凹凸光照的技术。它用于在不使用更多多边形的情况下添加细节,你现在看到的就是如果你在 PC 上玩游戏时的样子。当在 iOS 上玩游戏时,UDK 会尝试使用 PC 材质的法线贴图将其烘焙到由级别使用的光照贴图中,而高级效果则使用材质编辑器移动部分下的法线贴图槽。

    再次强调,在 UDK 的 PC 版本中,有许多其他选项你无法在 iOS 上使用。然而,对于那些想在 UDN 上创建自己的纹理的人来说,有一个非常好的指南,介绍了你可以在 UDN 上做的不同事情,链接为udn.epicgames.com/Three/MobileMaterialReference.html

  5. 取消选择纹理样本,你应该会在屏幕底部看到材质的属性。通过点击移动法线纹理旁边的绿色箭头打开移动部分,以便将我们的法线贴图加载到游戏中。进入内容浏览器,选择我们的漫反射纹理,然后点击移动基础纹理的绿色箭头。材质编辑器窗口将看起来如下面的截图所示:操作时间——自定义刷子

  6. 在菜单中,点击顶部绿色的勾选标记以保存您所做的更改并关闭材质编辑器。通过右键单击包并从菜单中选择保存来保存您创建的包,并将包保存在您的计算机上的某个位置。

  7. 重复步骤 1 到 6,对文件夹中的其他材质进行操作,因为我们稍后会使用它们。操作时间—自定义笔刷

  8. 打开我们在上一章中创建的游戏关卡。找到之前为建筑物创建的大笔刷,左键单击以选择其中一个表面,然后右键单击并选择选择表面 | 匹配笔刷。转到内容浏览器,通过左键单击选择building01_Mat。在笔刷上右键单击并选择应用材质 : building01_Mat。您可以通过点击透视工具栏上的不发光按钮或按Alt+3来帮助您看到正在发生的事情。完成操作后,您可以按Alt+4返回到发光模式。

  9. 我们现在可以看到使用这种材质如何使建筑物看起来更精致。幸运的是,我们可以轻松地解决这个问题,因为每个侧面似乎都在不同的坐标系中做自己的事情。

  10. 通过按F5键或转到视图 | 表面属性并再次选择匹配的笔刷纹理来打开表面属性菜单。将对齐设置为并点击应用。然后更改简单缩放值为4.0并再次点击应用操作时间—自定义笔刷

  11. 使用提供的材质或您自己的材质将纹理应用到您想要更改的建筑物上。请注意,由于玩家不会看到我们建筑物的屋顶,我们不需要为它们提供纹理。这可以在以下屏幕截图中看到:操作时间—自定义笔刷

  12. 保存您的项目,然后通过点击启动移动预览器按钮开始您的游戏。操作时间—自定义笔刷

刚才发生了什么?

我们现在有一个看起来更精致的世界,因为我们自己的纹理填充了整个世界。在这里使用相同的基本概念,您可以随意绘制您的笔刷!

自定义网格

UDK 中包含的静态网格是好的,但如果你想要创建任何不同且详细的物体,很可能会需要导入你自己的自定义网格。

对于那些创建自己模型的人来说,互联网上有各种不同的教程供您参考,但通常情况下,将您的模型导出为 FBX 文件,并在导出时启用平滑组,并尽量保持您的模型低多边形。有关模型创建的更多信息,您可以访问:udn.epicgames.com/Three/DesigningForMobile.html

操作时间—导入自定义对象

在我们的案例中,我们希望用我创建的一些简单静态网格替换我们在游戏中创建的一些 BSP 建筑物。我们可以这样做:

  1. 通过选择其图标或转到视图菜单并选择视图 | 浏览器窗口 | 内容浏览器来打开内容浏览器。在窗口底部的菜单中点击导入按钮。找到两个建筑.fbx文件,选择它们然后点击打开。在弹出的窗口中设置与您之前创建的相同名称的包,并点击确定,如果询问您是否导入整个包,请回答是。这可以在以下屏幕截图中看到:操作时间——导入自定义对象

  2. 内容浏览器左侧的包名称上右键点击,并通过选择菜单中的保存来保存我们的包。双击第一个建筑物以进入其属性,如图所示:操作时间——导入自定义对象

  3. 在打开的静态网格编辑器中,返回到内容浏览器,左键点击building01_Mat文件。在材质下的LODInfo.[0].Elements.[0]属性中,点击指向左边的绿色箭头以设置材质为我们选择的材质,如图所示:操作时间——导入自定义对象

  4. 静态网格编辑器顶部的菜单中点击碰撞 | 6DOP 简化碰撞,以便使建筑物与对象发生碰撞。

    注意

    如果您想查看为对象生成的碰撞,可以点击屏幕顶部的面板中的图标,它看起来像周围有一个红色框。您还可以导入您在您喜欢的建模程序中创建的自定义碰撞。有关更多信息,请访问:udn.epicgames.com/Three/FBXStaticMeshPipeline.html#Collision

  5. 双击building02进入静态网格编辑器,并使用building02_Mat作为要使用的材质重复步骤 3 和 4。

  6. 回到我们的级别,找到一个与building01形状相似的建筑物。删除该笔刷,在其位置右键点击并选择添加静态网格:UWGamePKG.Building01。将对象放大直到它适合您删除的对象的区域,并将其向下移动直到它适合地面或按End键,然后点击重建所有操作时间——导入自定义对象

  7. 对其他建筑物做同样的事情,并在随机的时间间隔内用建筑物替换笔刷,试图确保您在同一帧或区域内看不到它们的重复。操作时间——导入自定义对象

  8. 在此阶段打开模拟移动功能以更好地感受游戏在设备上的外观。您可以通过点击位于安装到 iOS 设备按钮左侧的小图标(看起来像一部手机)来切换模式的开和关。

  9. 通过点击开始移动预览器按钮保存您的项目并开始游戏。行动时间——导入自定义对象

刚才发生了什么?

您现在已经在游戏中添加了各种自定义功能,提供了一些很好的示例,如果您想添加自己的模型,您也可以自由地这样做!

优化

关于如何优化游戏有大量的资源,论坛上也有很多关于最佳实践方式的讨论。在接下来的章节中,我将讨论我用来优化游戏的不同方面。

控制台命令——统计数据

在移动设备方面,UDK 的一个新亮点是,通过同时按住屏幕上的四个手指,您可以打开控制台窗口。您可以在udn.epicgames.com/Three/ConsoleCommands.html找到 UDK 中可以使用的控制台命令列表。此外,请注意,您在 PC 上看到的值绝不是 iOS 设备上事物状态的指标,因此请确保通过使用四指操作或调用 Kismet 中的Console Command来进行测试。以下是我发现当调试项目时最有用的部分统计数据。

stat fps

最容易理解我们为什么想要它的,就是 FPS 计数器告诉我们游戏每秒运行了多少帧。每秒 24 帧是动画成为可能的公认阈值,如果远低于这个数值,视觉效果看起来会参差不齐,或者我们的大脑可以判断出它们只是图像。在大多数 Unreal 游戏中,30 FPS 是一个公认的标准,尽管有些游戏已经能够达到 60 FPS。

stat game

这显示了与运行游戏不同部分所需时间相关的统计数据,这可能会使您更容易通过复选标记的数量看到游戏哪些部分运行时间最长,以及执行某些事情(如 Kismet 和 UnrealScript)所需的时间。

stat memory

这显示了游戏每个独立部分使用的内存量。内存越大,所需的处理能力就越多,您的游戏也会越大。苹果只允许通过 3G/4G 下载 50 MB 或更小的应用程序,因此具有大于此大小的应用程序将迫使它通过 WiFi 下载,这可能是由于 UDK 的大小,但仍然是一个保持内存占用低的好主意。

stat memory

stat es2

OpenGL ES2 是 iOS 渲染设备,在 Mobile Previewer 中运行 iOS 设备时可能会崩溃。你可以看到有关绘制调用次数以及其他有用统计数据的有用信息。尽量将绘制调用保持在尽可能低的水平,因为这可能是减慢你的游戏速度的最主要因素。

stat es2

合并网格

说到绘制调用,我们在本章前面已经学习了如何在游戏项目中创建网格。当你想要优化你的游戏时,将具有相同纹理的相似网格组合在一起可能是个好主意,只要它们仍然是低多边形。减少网格的数量可以减少需要进行的绘制调用数量。同样地,减少单个对象上使用的材质数量,如果可能的话,将每个对象限制使用一个材质。在对象上使用多个材质至少会加倍计算和运行它所需的内存,这在尝试使你的游戏尽可能高效时并不是一个好现象。

预计算可见性

硬件遮挡查询在游戏中很有吸引力,因为它们可以在完全动态的场景中工作,但遗憾的是 iOS 设备不支持遮挡对象。通过遮挡对象,我的意思是如果玩家看不到一个对象,游戏可以跳过绘制该对象。虽然我们的小游戏运行得很好,但较大的项目将希望利用这个功能,因为它可以极大地提高运行时间。要了解如何在你的游戏中设置预计算可见性,请参阅:udn.epicgames.com/Three/PrecomputedVisibility.html

流体积

虽然我们正在讨论更大的关卡,但在我看来,创建更大关卡的最佳方式是使用流体积。这基本上意味着当你进入世界的某个区域时,会加载一个关卡。然而,在关卡之间的转换过程中,可能会有一个时刻同时打开多个关卡,这将极大地降低你的帧率。我个人在较大的关卡之间创建小区域,这些区域包含两个关卡的部分,使得转换更加无缝,并且一次性减少对内存的占用。有关流体积及其设置的更多信息,请查看:udn.epicgames.com/Three/LevelStreamingVolumes.html

调试

能够调试你的游戏似乎并不那么重要,直到你的游戏中出现问题时。对了解游戏内部情况的方法有扎实的掌握,无疑会在你深入自己的项目时给你带来帮助。

注释你的代码

这是我上大学时被灌输的东西,也是我非常感激采纳的建议。很可能在你处理任何大型项目时,你不会每天都要接触 Kismet 中的特定序列。几周过去了,你可能会忘记为什么做了某些事情。这对 Kismet 来说同样适用,对任何其他编程语言来说也是如此,幸运的是,Unreal 给了我们一个简单地向他人说明情况的能力。选择多个对象,然后右键单击并选择注释,允许你输入一些内容,这可以提供关于一组 Kismet 节点用途的线索,例如这个重新设计的玩家生成事件:

注释你的代码

我还在不同输入区域的末尾添加了对象注释,例如,我在放入按钮示例时就是这样做的,除了我没有在屏幕上触发输出。现在它被用来确保当我浏览代码时,我知道我在添加什么。在清理项目期间我们做的代码时,我得到了这个:

注释你的代码

即使是匆匆一瞥,也比没有任何指导要好,这使得在任何一个我们创建的子序列中找到你想要的东西变得简单。你甚至可以将这个想法进一步扩展,为每个不同的项目创建子序列,但这更多的是找到你感到舒适的方式,并习惯你自己的做事风格。

船长的日志

现在,会有这么一个时刻,你确信一切都是正确的,所有的 Kismet 动作都被调用了。好吧,有一种方法可以确保某个值是正确的,那就是通过记录并显示运行时的数据。你可以通过进入新建动作 | 杂项 | 日志来创建一个日志动作。从那里,你可以右键单击对象并选择暴露变量,选择你想要获取值的类型。有了这个,如果你将目标设置为玩家 0,将其他项目设置为该类型的一些内容,当你玩游戏并且调用它时,游戏将显示它是什么。例如,当我向这个事件添加一个日志动作时:

船长的日志

UTPawn_0在日志中显示。这是我们放入日志动作对象变量链接中的对象的名称。

船长的日志

能够确保一个对象具有你认为它应该具有的值,是除了它根本未被调用之外,判断某事是否出错的最明显的方法之一。

摘要

我们的游戏现在实际上是我们自己的,或者至少正在朝着我们自己的方向发展。有了这个知识,我坚信你已经准备好构建你想要的大小游戏,并将各种自定义内容输入到游戏中。我们特别学习了如何:

  • 为我们的游戏创建一个带有输入的主菜单

  • 为我们的游戏在移动 UDK 上添加音频

  • 将自定义纹理导入到我们的游戏中

  • 为 PC 和 iOS 创建材料

  • 在移动 UDK 上为我们的游戏添加静态网格

  • 在 iOS 上优化和调试我们的游戏

现在我们已经学会了如何将所有您想要的定制内容导入到您的游戏中,我们接下来需要完成我们的主要游戏内容。在下一章中,我们将介绍如何将我们创建的游戏上传到 iTunes 商店,以及为了使您的游戏成功所需的步骤!

第八章:发布和盈利你的游戏

我们现在已经完成了游戏的状态,拥有一个功能齐全的关卡,并且我们在电脑上进行了测试和改进,但总有一天你会想要将游戏放到你的 iOS 设备上。本章将全部关于这一点:首先在我们的 iOS 设备上运行游戏,然后一直发布到 App Store。

在本章中,我们将:

  • 了解将你的游戏放到 iOS 设备上的流程

  • 在你的 iOS 设备上部署游戏的流程

  • 当从我们的设备或 App Store 查看时,自定义我们的游戏图标

  • 讨论测试流程,并学习如何进行自己的测试会话

  • 讨论 Epic Games 为 UDK 开发的 iOS 游戏所实施的当前版税模式

  • 学习如何将 Game Center 链接到我们的游戏中,以获得更丰富的社交体验

  • 探索使用游戏内广告进行盈利

  • 通过 iTunes 商店上传游戏的流程

这需要处理很多东西,所以至少我会给你一个概述,介绍最常用的选项以及 UDK 如何使事情发生。所以,让我们开始吧!

在魔法发生之前

很快我们将在你的设备上运行你的游戏,这将非常棒,但在我们达到那个点之前,我们首先需要确保几件事情。首先,你需要拥有一台 iOS 设备(我们假设你已经有),以便首先进行测试。你需要为你的游戏设置配置,我们将在后面讨论,最后,你还需要有一个开发者账户,我们首先会讨论这一点。

注册为 iOS 开发者

为了使用 UDK 将游戏放入 App Store,你必须首先注册为 iOS 开发者。这个过程相对简单,然而,在撰写本文时,苹果对开发者身份的特权每年收费 99 美元。如果你在任何时候让你的订阅结束,你创建的所有应用也将被删除。如果你还不是开发者,你需要注册developer.apple.com/programs/ios/

注册为 iOS 开发者

在那个页面上,你会看到一个写着立即注册的按钮。从那里开始,苹果已经做得很好,通过填写信息和遵循菜单,使其尽可能简单。完成之后,你将拥有一个开发者账户。

设置配置

为了在 iOS 设备上测试游戏,您需要拥有正确的密钥、证书和移动配置文件生成,这被称为 配置。苹果要求运行任何应用的任何设备都必须设置配置文件。Unreal iOS 配置向导使设置配置过程变得更容易,尽管它仍然需要使用苹果开发者网站上 iOS 配置门户的某些方面。

开始行动时间——创建新的配置

为了将我们的游戏安装到我们自己的 iOS 设备上,我们需要创建一个配置文件。考虑到这一点,让我们开始吧!

  1. 通过 USB 将您的 iOS 设备连接到您的计算机。确保您的设备上有足够的空间安装游戏。

  2. 移动预览器 按钮的左侧,您应该看到一个看起来像带有向上红色箭头的移动设备的图标。如果您是第一次这样做,Unreal iOS 配置向导 应该会弹出。

    如果由于任何原因它没有出现,您也可以在 UDK 安装目录中的 \Binaries\IPhone 文件夹内找到它,文件名为 IPhonePackager.exe。您也可以从 Unreal 前端 运行它,但这将在本章的后面讨论。这在上面的屏幕截图中显示:

    开始行动时间——创建新的配置

  3. 从菜单中点击 创建证书请求和密钥对... 按钮,以打开一个新菜单。填写所需的信息,确保在 电子邮件地址 字段中使用您注册为 iOS 开发者的电子邮件,并在 通用名称 字段中使用您的名字和姓氏或公司名称。当您完成时,您会注意到绿色勾选标记出现,如下面的屏幕截图所示:开始行动时间——创建新的配置

  4. 点击 生成密钥对... 按钮,以创建密钥对文件。这将打开一个文件保存对话框,允许您在已知文件夹中保存文件。由于这对于您所有的项目都是相同的,所以将其放置在您的 UDK 安装文件夹中,例如 C:\UDK\Developer Files 是一个好主意。

  5. 之后点击 生成证书请求 按钮,这将为您创建一个文件以保存。将其保存在您之前创建的同一目录中。

    虽然这种方法现在可以让我们在自己的 iOS 设备上运行游戏,但当我们想要在 App Store 上发布应用时,我们需要将证书文件导入到 Mac 计算机的密钥链中。

    小贴士

    以下步骤假设您使用 Firefox 或 Safari 作为您的网络浏览器。虽然使用其他浏览器可能也能正常工作,但如果您遇到问题,我会使用这两种选项之一。

  6. 打开您的网页浏览器,访问苹果开发者网站developer.apple.com/,并点击iOS Dev Center选项。以下截图显示了这一点:创建新配置文件的时间——创建新配置文件

  7. 点击登录按钮并输入您的凭据。当iOS Dev Center出现时,点击右侧工具栏上的iOS 配置文件门户链接,如图所示:创建新配置文件的时间——创建新配置文件

  8. iOS 配置文件门户页面,将有一个 iPhone 的图片和一些带有其下按钮的文本,按钮上写着启动助手。点击该按钮。以下屏幕将出现:创建新配置文件的时间——创建新配置文件

  9. 应该开始一个新的设置。点击继续按钮开始。

  10. 在此阶段,您需要创建一个App ID,这是一个标识符,将允许 iOS 与您的应用通信,例如用于推送通知。您还需要为应用选择一个显示名称,这是将在各个地方使用的可读名称。一旦您输入了App ID,点击继续

  11. 接下来,您需要指定您将在哪个设备上玩游戏。为该设备输入一个描述,例如iPad。下面您将看到一个输入您的设备 ID的地方。虽然您可以使用 Mac 上的 Xcode 来获取设备 ID,但在此阶段直接打开iTunes并找到 ID 可能更简单。

  12. 打开iTunes。点击您的设备以显示其菜单。从那里点击序列号选项以更改值以显示其标识符(UDID)。显示后,点击编辑 | 复制标识符(UDID)。参见图表:创建新配置文件的时间——创建新配置文件

  13. 将代码粘贴到上一菜单中的设备 ID属性中,然后按继续

  14. 您现在应该被带到生成证书签名请求步骤。点击继续以跳过此页面,因为我们已经在步骤 5 中的配置向导内创建了证书请求

  15. 提交证书签名请求步骤中,点击浏览按钮并定位到文件夹中的证书(.csr文件),您在步骤 5 中将其放置在那里,然后点击继续

  16. 在此阶段,您将被要求输入配置文件描述。这是一个将用于识别特定配置文件的名字,例如如果您有一部 iPhone 和一部 iPad,并想在两者上尝试游戏。完成这些后,点击生成按钮。以下截图显示了这一点:创建新配置文件的时间——创建新配置文件

  17. 当下一页完全加载时,您的配置文件将完成。一旦底部步骤出现大绿色勾选标记,点击继续

  18. 在下一屏点击下载按钮,并将文件保存到放置我们本章创建的其他两个文件的同一位置。

  19. 下载完成后,点击继续按钮。再次点击继续以跳过下载并安装您的配置文件,因为我们现在不需要它,但当我们想要将游戏提交到 App Store 时,我们会需要它。

  20. 在此步骤中,您应该看到下载并安装您的开发证书。我们同样需要它,所以将其保存到我们的重要文件文件夹中。

  21. 一旦文件完成,点击继续。再次点击继续以跳过下载并安装您的开发证书,因为我们现在不需要它,但当我们想要将游戏提交到App Store时,我们会需要它。

  22. 继续跳过使用 Xcode 安装您的 iOS 应用程序页面,因为我们不会在用 UDK 创建游戏时使用它。

  23. 到目前为止,您应该已经完成了配置助手,我们可以在下一页点击完成以退出助手。这如图所示:创建新配置的操作时间

  24. 返回到Unreal iOS 配置向导,转到新用户标签页。点击导入一个移动配置文件...按钮以导入保存在我们重要文档文件夹中的配置文件。它应该是文件夹中唯一类型的文件。这如图所示:创建新配置的操作时间

  25. 接下来,点击导入证书...以导入开发者证书。一旦选择,它将要求您导入在生成证书请求时制作的密钥对文件。点击确定并选择密钥对文件。此时,我们应该在右侧看到两个绿色的勾选标记。

  26. 点击编辑 Info.plist 覆盖...按钮以打开自定义 Info.plist窗口。在包显示名称下,输入您希望在 iOS 设备上显示的游戏名称。您可能想使用一个短名称以确保它将适合操作系统提供的空间,例如Urban Warrior将是一个不错的选择。在包名称中输入名称的简短版本。这是 iOS 用来识别应用的内容,我使用了Urban Warrior。在包标识符中输入与配置文件中相同的内容,如打包对话框中所述。点击保存更改。这如图所示:创建新配置的操作时间

  27. 在所有复选框都完成的情况下,点击 Ready to Package 按钮。如果你是通过点击我之前提到的图标进入此页面的,游戏应在一段时间后推送至你的设备。否则,点击 Install on iOS device 按钮。一段时间后,你应该会看到一个弹出窗口告诉你游戏已被部署。这可以在以下截图中看到:行动时间——创建新的配置文件行动时间——创建新的配置文件

  28. 游戏推送至你的设备后,打开你的 iPad,触摸之前截图所示的你的游戏图标 Urban Warrior。你会看到以下截图:行动时间——创建新的配置文件

刚才发生了什么?

我们的游戏现在已经在我们的 iOS 设备上了。要到达这里需要很多步骤,但我们终于做到了!每次我能在新控制台上玩到自己创作的游戏时,我都会感到一种成就感的温暖,我希望你也有同样的感觉。恭喜你走到这一步,你现在正式成为了一名 iOS 开发者!

自定义图形

虽然 Epic 为在 iOS 上运行的游戏提供了图形,但我们为了使我们的游戏更具个性,可以做的简单事情之一就是自定义游戏 iOS 版本中显示的图形。iOS 应用使用一组不同尺寸的图标图像,以支持我们支持的大量项目。用你自己的自定义图像替换这些图像,这样当你在使用 Unreal FrontendInstall on iOS Device 命令打包游戏时,它将使用这些资源。包含这些资源的文件夹位于 UDKGame/Build/IPhone/Resources/Graphics/。截至写作时,如果你正在创建 Universal App,以下是你可以使用或应该使用的图形:

图像大小(像素) 文件名 用于
512x512 iTunesArtwork Ad Hoc iTunes
57x57 Icon.png iPhone/iPod touch 的 App Store 和主屏幕
114x114 Icon@2x.png iPhone 4 高分辨率的主屏幕
72x72 Icon-72.png iPad 的 App Store 和主屏幕
50x50 Icon-Small-50.png iPad 的 Spotlight
29x29 Icon-Small.png iPad 和 iPhone 的设置,以及 iPhone 的 Spotlight
58x58 Icon-Small@2x.png iPhone 4 高分辨率的 Spotlight 和设置

小贴士

要获取有关所需或需要用于不同设备的图标尺寸的最新知识,请访问 developer.apple.com/library/ios/#qa/qa2010/qa1686.html

在创建图标时,我发现从大尺寸开始,然后逐渐减小尺寸更容易,这样可以避免我的艺术作品中出现像素化。我自由地制作了一些示例图标,你可以自由地在你自己的项目中使用。以下是一个示例:

自定义图形

在设备上测试

到目前为止,我们已经使用移动预览器和 UDK 远程工具玩过我们的游戏,但实际在自己的设备上玩游戏完全是另一回事。首先,你的手现在在屏幕上,所以你可能看不到你创建的HUD元素,比如我们创建的按钮。同时,让其他人测试你的游戏并给出反馈也是一个非常好的主意。

为什么进行测试?

测试是决定视频游戏成功与否的最重要的事情之一。然而,在游戏制作过程中,这个领域往往被严重忽视,所以我想要强调进行测试的重要性。测试者代表了普通人将如何对你的游戏做出反应的声音。你必须认真对待他们所说的。他们也是那些会找到并利用他们能接触到你的世界中的任何东西的人,你也会发现游戏中你从未想过可能存在的事情。

在构建你的项目时,尽早进行原型设计并且了解你正在开发的内容是否真的对你的目标受众来说有趣,这一点非常重要。创造乐趣(幸运的是,没有秘密公式,否则游戏设计师就会失业)没有秘密公式,但你可以将从其他产品中学到的原则以及你自己的创造力应用到其中,看看它是否有效。话虽如此,在你将游戏摆在你游戏小组面前之前,你应该比任何人都更多地测试你的游戏。毕竟,如果你的游戏小组不喜欢你所做的一切,那么你的 App Store 评论可能不会像你想象的那样精彩。

如何进行测试

大型公司会投入大量资源进行测试,创建带有摄像头的实验室,从许多不同角度记录测试者,以及记录输入和玩家行为,试图将其变成一门科学。但是,与这些公司不同,我知道我负担不起这样做,所以我选择了下一个最好的选择。有很多不同的方式进行测试。

当我自己进行测试时,我通常会有一个问卷,让玩家在玩游戏后填写。很多问题都是围绕从 1 到 10 的数字,讨论游戏是否太难,目标是否难以理解,以及其他你想要弄清楚的事情。我还在最后留了一个大空白,以便那些投入很多的人无疑会有很多话要对你说。

对于还在学校的学生来说,我发现一个很简单的方法就是订购几块披萨,并给玩游戏的人一块作为奖励。你可以创建自己的网站,让访客在玩游戏后填写问卷。还有许多在线社区的人总是渴望尝试新游戏并给出反馈,例如 ModDB/IndieDB,在www.moddb.com/www.indiedb.com/,尽管这可能是一个获取 iOS 特定反馈的问题。至少,与朋友交谈并将你的 iPad 交给他们也是让别人玩你的游戏的一种方法,尽管你的朋友和家人可能在他们的评论中带有偏见。

另一个非常重要的事情是,让人们在没有你的输入的情况下玩你的游戏。大多数设计师认为他们已经涵盖了规则手册中所有可能的事情,但几乎可以肯定的是,有些事情被遗忘了。在关卡设计中,重要的是要看到玩家会走向哪个方向,以及他们是否被正确引导。在任何游戏中,玩家都不应该感到愚蠢。拥有不完整游戏是让玩家感到他们只是浪费了金钱在一件不完整产品上的一个可靠方法。我曾经玩过一个游戏,如果你遵循规则,实际上是没有办法赢得游戏的。

尝试保持坚韧的皮肤,并对所有人的反馈表示感谢;并不是每个人都喜欢你的游戏,但如果看到形成趋势,你可能会想要调整游戏。测试玩家会提出建议,而是否采纳这些变化将取决于你。有时候,为了玩家的利益或平衡起见,事情就是这样。还有一点很重要,那就是要经常进行测试,因为你需要看到你所做的改变是否有所帮助,然后重复这个过程,直到你满意地发布。

商业化

当你的项目基本完成时,可能是考虑你游戏商业化可能性的时候了。由于这本书是面向初学者的,我将不会深入探讨实现这些服务所有可能功能的细节;这足以写成一整本书,但我将概述可以做什么,并为任何想要在游戏中实现x功能的初出茅庐的开发者提供一些资源。

注意

注意,大多数这些功能将需要在你的游戏中输入某种类型的 UnrealScript 才能实现,而由于这本书没有涵盖 UnrealScript,你将不得不自己进行大量研究,但我在这里提供的链接是我用来学习它的,所以我非常确信你也可以做到同样的事情。

许可 UDK

UDK 可以免费用于非商业或教育目的。如果你打算将 UDK 用于任何商业目的,或者你的游戏中包含任何类型的广告,你必须向 Epic Games 申请许可证,申请地址为www.udk.com/licensing。截至撰写本文时,许可证条款为预付 99 美元,公司前 50000 美元的收入免收版税,剩余收入的版税为 25%。由于我们将在 iOS 上发布我们的游戏,苹果会从中抽取 30%的费用,剩下 70%的利润归你所有。如果你的应用销售额达到 100 美元,但你只收到了 70%,版税是根据你实际收到的 70 美元计算的。而且虽然 25%可能看起来很多,但如果你以 1 美元的价格出售你的应用,你需要卖出 71,428 个应用才能达到这个标准。

游戏内广告

想要让自己的游戏免费下载同时又能盈利的人,可以在游戏中添加内联广告。苹果有一个名为iAd的整个网络,只需几行代码就可以将其添加到你的游戏中。需要注意的是,你必须购买 UDK 的许可证才能带有广告发行你的游戏,并且通过这些广告产生的收入是收入。有关将广告添加到你的游戏的更多信息,请访问udn.epicgames.com/Three/InGameAds.html

游戏内购买

在你的游戏中赚钱的另一种方式是通过解锁某些内容,在购买游戏后进行购买。一个例子可能是访问某些关卡和/或功能。需要注意的一点是,人们可能会因为这种方式没有得到完整版的游戏而抱怨。一个可能的解决方案是为纯粹的外观事物提供内购,例如不同的角色或服装。

注意

有关将微交易系统集成到你的游戏的更多信息,请访问udn.epicgames.com/Three/MicroTransactions.html

通过游戏中心将大家聚集在一起

游戏中心是苹果的在线游戏网络。iOS 设备上的玩家可以使用这项服务来相互竞争成就、进行多人游戏,甚至进行语音聊天。

要将游戏中心添加到你的游戏中,只需转到 UDK 文件夹中的IPhoneEngine.ini文件,该文件位于\UDKGame\Config\IPhone\,并将bDisableGameCenter的值设置为 false,如下所示:

[OnlineSubsystemGameCenter.OnlineSubsystemGameCenter]
bDisableGameCenter=false

然而,如果你计划使用排行榜或成就,这会稍微复杂一些,因为你需要深入研究 UnrealScript,以实现游戏中获得成就的能力。

注意

有关更多信息,请访问udn.epicgames.com/Three/GameCenter.html

iCloud 集成

苹果的iCloud是一种存储形式,可以保存可以从个人拥有的任何 iOS 设备访问的数据。这可能是一种为您的游戏创建存档文件、保存玩家进度的绝佳方式。

注意

更多信息请访问udn.epicgames.com/Three/CloudDocumentStorage.html

Facebook/Twitter 集成

UDK 的 iOS 版本还具有一项功能,即能够发推文或在您的 Facebook 页面上发布。它能够充分利用 Facebook 的 API,能够检索您的朋友列表和其他许多内容。要了解更多关于这两者的信息,请访问udn.epicgames.com/Three/TwitterIntegration.htmludn.epicgames.com/Three/FacebookIntegration.html

将我们的游戏推向全球

现在我们的游戏已经处于最佳状态,并且将成为下一个大型的 iOS 热门应用,让我们将其发布,让全世界都能看到;或者至少让苹果的审批人员看到。在此阶段,您需要一台 Mac 电脑才能完成此过程。

行动时间——请求分发证书

首先要采取的行动是创建一个分发配置文件。这与我们之前创建的不同,因为它将被用于多个设备上的放置。

  1. 前往苹果开发者网站的iOS 配置文件门户页面,而不是使用启动器,点击左侧工具栏上的证书,如图所示:行动时间——请求分发证书

  2. 点击分发选项卡,然后在该页面的右侧点击请求证书按钮来请求一个新的分发证书。

  3. 滚动到页面底部,找到我们之前创建的.csr文件,然后点击提交按钮。然后我们将返回到之前的分发选项卡,经过一段时间后,您将看到证书显示为已颁发。这如图所示:行动时间——请求分发证书

  4. 切换到开发选项卡,然后返回到分发选项卡。返回后,您会注意到操作选项卡有一个下载按钮。点击它并将文件保存到与我们的其他文件相同的目录。

  5. 接下来我们需要创建一个分发配置文件。点击iOS 配置文件门户配置文件部分和分发选项卡,与之前的方式类似。点击新建配置文件按钮,将我们带到创建 iOS 分发配置文件页面。

  6. 分发方法保留在App Store。如果您试图自行分发应用程序,例如创建企业内部应用程序,则可以选择Ad Hoc选项。

  7. 配置文件名称下输入一个名称,以便在iOS 配置文件中识别该配置文件,例如Urban Warrior Provision

  8. 分发证书应列出我们之前创建的证书。在App ID下选择我们的应用,并留空设备,因为它仅在Ad Hoc分发中使用。

  9. 点击提交按钮,它将带您回到配置文件主页的分发选项卡。这如图所示:执行动作——请求分发证书

  10. 在该页面上,您将看到状态为挂起配置。切换到开发选项卡然后回到分发,您会注意到它现在将显示为活动。将文件下载到我们的项目文件夹。这如图所示:执行动作——请求分发证书

  11. 通过双击位于 UDK 安装目录下的Binaries\IPhone文件夹中的IPhonePackager.exe文件来打开iPhonePackager工具。这如图所示:执行动作——请求分发证书

  12. 程序应该以高级工具选项卡高亮开始。点击配置和证书工具...以显示签名工具

  13. 然后,点击导入一个移动配置文件...,使用文件对话框导入分发文件。

  14. 接下来点击导入证书...,并使用文件对话框定位您的分发证书(可能命名为ios_distribution.cer)。之后,一个消息框将要求您提供密钥文件。点击确定然后选择您的密钥对文件。点击刷新列表以查看要显示的证书。这如图所示:执行动作——请求分发证书

  15. 确保 UDK 已关闭,并通过访问 UDK 安装目录下的Binaries文件夹并双击UnrealFrontend.exe应用程序来打开Unreal Frontend。同时确保编辑程序也已关闭,因为如果不关闭,那么在接下来的几个步骤中你几乎可以肯定会遇到错误。

  16. 点击前端右侧的大按钮,按钮上显示的内容类似于UDKGame on PC(Shipping 32) | Cook/Make/Sync with ...。从菜单选项中选择IPhone作为平台Shipping_32作为游戏配置ReleaseScript作为脚本配置,以及Shipping_32作为Cook/Make 配置。点击确定以保存您的设置。

    当你完全完成你的游戏后,使用FinalReleaseScript选项是个好主意,因为它会由于移除断言检查和日志信息而运行得更好。请参考以下截图:

    执行动作——请求分发证书

  17. 在大按钮下方的 移动 部分,将 打包模式 更改为 分发

  18. 点击 添加... 按钮,并输入你希望在游戏中拥有的所有关卡名称,点击 添加选中地图 将地图添加到游戏中。这在上面的屏幕截图中显示:操作时间——请求分发证书

  19. 确保选中 覆盖默认 选项,并选择您想要作为第一个关卡进行游玩的第一个关卡。这在上面的屏幕截图中显示:操作时间——请求分发证书

    如果你不想使用 覆盖默认 选项,你还可以在 DefaultEngine.ini 文件中设置默认关卡。

  20. 点击 部署 按钮下方,并选择 启用步骤 以跳过部署到您的设备,因为分发构建不能放在您的正常设备上。如果您想在您的设备上有一个完整的构建,请将 打包模式 更改为 默认。这在上面的屏幕截图中显示:操作时间——请求分发证书

  21. 在设置好所有选项后,点击单词旁边的箭头,选择 清理和完整重新构建 并等待所有命令执行完成。这在上面的屏幕截图中显示:操作时间——请求分发证书

  22. 如果一切顺利,你应该在你的 \Binaries\IPhone\Shipping-iphoneos\UDKGame 文件夹中找到一个名为 Distro_UDKGame.ipa 文件,你需要将其保存到闪存驱动器或类似设备上,因为我们移动到本教程的 Mac 计算机部分时需要它。

  23. 在 Firefox/Safari 中,我们接下来需要转到 iOS 开发中心iTunes Connect 部分,它位于我们之前使用的 iOS 配置文件门户 下方。这在上面的屏幕截图中显示:操作时间——请求分发证书

  24. 使用您的凭据登录,如果需要的话,并同意 服务条款。在主页上点击屏幕右侧的第一个按钮 管理您的应用 选择,这在上面的屏幕截图中显示:操作时间——请求分发证书

  25. 点击左侧上方的 添加新应用 按钮。如果是你的第一个应用,你将被带到 新应用 页面,在那里你需要想出一个公司名称,所以请小心,一旦创建,你就无法更改,确保它符合你的需求。操作时间——请求分发证书

  26. 接下来,您将需要填写多项不同的内容。在默认语言下将其设置为英语。在应用名称中输入您希望的应用名称,例如Urban Warrior。在SKU 编号中输入任何数字,但请记住,您创建的每个游戏都必须有一个与之关联的不同编号。在捆绑 ID中选择我们之前创建的捆绑 ID,并在捆绑 ID 后缀中输入与您之前在IPhonePackager编辑 Info.plist 覆盖...部分中设置的info.plist文件相匹配的值。完成后,点击继续。这如图所示:操作时间——请求分发证书

  27. 现在,选择您应用的日期和价格层,以及如果您希望的话,教育购买者的折扣。您还可以选择您希望销售应用的特定应用商店。请记住,如果您没有将价格层设置为免费,您将不得不支付 UDK 的许可费。完成后,点击继续

  28. 在下一部分,有许多特定于您正在工作的游戏的元数据选项可供填写,因此请根据您的最佳判断填写它们。

  29. 您需要上传您游戏的图片和截图,包括 iPhone/iPod Touch 和 iPad,以及一个 512(x)512 的大图标。

    注意

    一个小贴士是,从您的实际设备中截取截图,通过同时按住电源键和主页键一段时间然后释放。您应该看到屏幕闪烁,在照片应用中您应该看到您正在做的事情的图片。您可以在上传此部分之前提前将这张图片通过电子邮件发送给自己。

  30. 完成后,点击保存按钮保存应用信息。这将带您到应用的应用摘要页面。这如图所示:操作时间——请求分发证书

  31. 点击查看详情按钮进入应用详情页面,然后从那里点击准备上传二进制文件。菜单将询问您是否使用了加密来使用您的产品,您将回答否,然后点击保存。菜单现在将显示您已准备好使用应用程序加载器上传二进制文件;点击继续,您将被带回到主屏幕。点击左上角的应用摘要文本,然后在应用摘要页面点击右下角的完成

  32. 前往您的 Mac 电脑,在那里我们将完成教程的其余部分。

  33. 如果您还没有安装,请通过 App Store 安装 Xcode。您将看到下一张截图:操作时间——请求分发证书

  34. 下载并安装 Application Loader程序,通过访问网站上的iTunes Connect部分,并在底部工具栏上点击下载 Application Loader。这如图所示:执行动作——请求分发证书

  35. 在安装Application Loader之后,通过按Command + Space打开Spotlight,并输入程序名称,直到它显示出来,然后点击它。这如图所示:执行动作——请求分发证书

  36. 在打开Application Loader后,输入您的凭据并按下一步。这如图所示:执行动作——请求分发证书

  37. 点击提交您的应用程序按钮。在出现的菜单中,选择您的应用程序并选择下一步按钮。在应用程序信息部分,点击选择...按钮并选择您的.ipa文件,等待其完成。执行动作——请求分发证书

  38. 当上传完成时,点击下一步然后完成。您可以随时登录到iTunes Connect并转到管理您的应用程序页面,以确认应用程序已上传。

刚才发生了什么?

我们现在已将我们的应用程序提交给苹果进行审查!当应用程序通过自动检查的各个阶段时,您将收到进度电子邮件,最终达到等待审查状态,这意味着它现在正在苹果的审查过程中。如果发生任何情况,您将收到电子邮件,但状态也会在iTunes Connect网站上更新。每次出现错误时,您都必须在Application Loader再次使用之前,在iTunes Connect网站上点击准备上传

摘要

在掌握了如何将我们的游戏推送到 App Store 之后,我们现在已经涵盖了我在本书范围内向您展示如何做的所有内容。我们具体学习了:

  • 关于将您的游戏上传到 iOS 设备的过程

  • 在您自己的 iOS 设备上部署游戏的过程

  • 如何自定义从我们的设备以及 App Store 查看时的游戏图标

  • 游戏测试过程以及如何进行自己的游戏测试会话

  • Epic Games 为 UDK 开发的 iOS 游戏实施的当前版税模式

  • 如何将 Game Center 链接到我们的游戏中以获得更丰富的社交体验

  • 关于在游戏中使用广告进行货币化的使用方法

  • 将您的游戏上传到 iTunes Store 的过程

真难以相信在这么短的时间内,你已经成功完成了这么多不同的事情!凭借从这本书中获得的知识,你拥有了所有工具和知识来创造一些真正伟大的项目。UDK 是一个非常惊人的引擎,我亲身体验过它能带来多少可能性。所以未来的应用开发者,祝你好运,我会在 App Store 上见到你!

附录 A. 快速问答——答案

第一章:在 iOS 上使用 UDK 入门

1 2 3 4
b b d c

第二章:开始成为城市战士,一款第三人称射击游戏

1 2 3
d d c

第四章:使用 Kismet 和 Matinee

1 2 3 4 5
c a b d d

第六章:整合一切

1 2 3
d c c
posted @ 2025-10-25 10:29  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报