搜索Unity

超越移动平台

借助Windows 10突飞猛进的势头,利用Windows应用商店的新市场机会。

移植指南

介绍

通过Unity构建游戏越来越流行,特别是对于利用单一代码库访问多个平台和设备类型的用户而言。基于通用 Windows平台(UWP)为Windows 10构建游戏也是如此。在本白皮书中,您将学习如何使用已经掌握的Unity知识为UWP构建游戏。我们将涵盖以下主题,例如:

  • 为UWP编译游戏
  • 理解Windows环境最佳实践
  • 实现特定平台的功能
  • 理解关键插件
  • 发布到Windows应用商店

为了说明将Unity游戏带到UWP上,我们将使用一个实际游戏来引导您学习将Unity游戏导入UWP,然后将其部署到Windows应用商店的各个方面和注意事项。

注意: 本指南假定您已熟悉有关使用Unity3D的基础知识。您可以随时查看 Unity教程,了解更多有关使用Unity3D的信息。

通过Unity编写UWP游戏的要求

为了开发、编译和提交Unity游戏到Windows应用商店,您需要:

  • Unity 5.3.5。 不管是Unity免费版本,还是Unity Pro专业版,您都可以发布。将游戏发布到Windows应用商店的插件对基础版本和Unity Pro专业版用户均免费。
  • Visual Studio。 您可以使用任何Visual Studio SKU,包括免费的Visual Studio Express。对于通用Windows平台,您需要使用Visual Studio 2015 Update 1。
  • Windows 10。 如果您没有Windows 10许可证,则可以获取90天评估版本。如果您使用的是Mac OS X或者将在Apple硬件上安装,请查看使用Boot Camp、VMWare或Parallels进行安装的不同选项。
  • Microsoft帐户。 您需要一个免费的Microsoft帐户才能获得开发者许可证。
  • Windows应用商店开发者帐户。 将游戏提交到Windows应用商店时需要使用此帐户。在该过程中,您将以个人或企业身份注册并获得验证,从而将应用和游戏提交到应用商店。该注册帐户可与Windows Phone共享(即通过一个注册帐户可将应用提交到两个应用商店)。个人注册可能要收取少量注册费,不过Microsoft赞助计划经常会提供免费开发中心帐户(例如,对于学生或初创公司)。
  • Windows 10测试设备。虽然模拟器可以模拟多点触控和不同的显示分辨率,但如果您开发的是移动/触控游戏,我们建议您最好在实际ARM移动设备上测试触控能力。

本文档针对Unity 5.3.5、Visual Studio 2015 Update 2和Windows 10版本1511开发。为了您的利益,建议最低使用Unity 5.3.2和Visual Studio Update 1,因为更低的版本可能有不同的应用程序编程界面和其他可能的不兼容性。

Windows Store

现在,Windows应用商店提供了统一的位置来提交和上传UWP应用。您仍可以将使用更低版本操作系统的设备作为目标,但本文档重点关注将您的游戏作为UWP应用提交到Windows应用商店。

Nuget

NuGet是Microsoft开发平台(包含.NET)的包管理器。通过此管理器,开发人员可以找到第三方库并将其作为依赖项添加到项目中。您可以使用NuGet来提供您需要在本地使用的任何Windows库。在Unity中,NuGet还可用于管理从您的脚本调用的DLL。

将Unity游戏移植到UWP也必须使用NuGet。当您将项目从Unity导出至Visual Studio UWP应用时,Unity必须使用NuGet才能安装定位.NET Core所需要的所有库。

设置Unity以部署到Windows应用商店

在此部分中,我们将讲解如何准备现有Unity游戏并将其作为通用Windows平台(UWP)游戏部署到Windows应用商店。主题包括:

  • 在Windows 10中启用开发者模式
  • 在Unity中输入游戏详细信息
  • 在Windows 10中导出至UWP
  • 在Visual Studio 2015 Update 2中使用Window 10 SDK构建解决方案
  • 将游戏关联到Windows应用商店
  • 如果尚未添加相关资源,请添加必要的图像/内容(例如,徽标、图标、启动画面)
  • 运行Windows应用认证工具包(WACK)
  • 发布到Windows应用商店

在Windows 10中启用开发者模式

对于您要用于开发、安装或测试应用的每个设备,不再需要开发者许可证。现在,您只需通过设备设置启用设备一次,即可执行这些任务。

启用Windows 10设备

对于Windows 10,不管是使用台式机、平板电脑还是手机,您都需要在“System Settings”下为开发启用该设备。

为此,请导航至“System Settings”并选择 “Update & security”。 然后选择 “For Developers”。 在此,您只需选择和启用 “Developer Mode”。

要了解如何执行此操作的更多详细信息,请点击 这里。

在Unity中输入游戏详细信息

开始为Unity准备游戏的其中一步是确保为其配置正确的构建设置。

为了将Unity游戏作为通用Windows平台(UWP)应用构建,您需要以下工具:

要在Unity中配置设置,请先单击 “File”, 然后单击 “Build Settings”。

接下来,单击 “Player Settings…” 按钮。

“Player Settings” 窗口中,您随后可以输入游戏详细信息。

如果您选择添加,则可以在 “Player Settings” 此窗口中添加将在Windows应用商店中显示的徽标和平铺图像。不过,就像为Windows应用商店构建Unity应用的其他许多方面一样,您也有多种方法可以实现此目的;您还可以通过Unity IDE延迟添加图像,也可以在以后通过Visual Studio添加。

现在,您已经在Unity3D中正确配置构建设置,因此,随时可将游戏导出至UWP。

导出至通用Windows平台

此部分介绍Unity为通用Windows平台(UWP)应用提供的现有支持以及如何将游戏从Unity导出至UWP。

Unity3D从Unity 5.2开始为UWP应用提供支持。目前,您可以在“Build Settings”窗口中,选择Windows应用商店平台的“Universal 10 SDK”,从而将游戏导出至UMP,如下图所示:

Unity 5.3.5将支持导出Visual Studio 2015解决方案文件,随后即可在Windows 10设备上构建和运行。

支持三种架构:ARM、x86和x64。此外,您可以在游戏项目中使用.NET Core 5.0。

在“Build Settings”窗口中单击“Build”按钮将显示“Build Windows Store”窗口,提示您选择用于构建游戏的文件夹。

选择文件夹后,Unity将开始构建游戏,并将其定位到所选平台。如果游戏规模较大,这可能需要几分钟时间:

现在,Windows资源管理器窗口将显示包含Unity生成的所有文件的文件夹。

有关此流程的更多详细信息,请参阅Unity3D 关于Windows的文档。

在Visual Studio 2015 Update 2中使用Windows 10 SDK构建解决方案

为了将销售或分发通用Windows平台(UWP)应用,您需要为其创建appxupload软件包。该包便于您在Windows应用商店中销售应用或将其分发给其他用户。创建appxupload时,将生成另一个appx软件包,以用于测试和 旁载。通过将appx软件包旁载到设备,您可以直接分发应用。

对于Windows 10,只需生成一个可上传到Windows应用商店的软件包(.appxupload)。随后,您的应用即可在任何Windows 10设备上安装和运行。

注意: 如果您需要为Windows 8.1应用创建应用程序包,请 按照以下说明操作。

现在已经准备好在Visual Studio中编译您的游戏。

首先,选择x86或x64作为平台。

从菜单中单击Build > Build Solution。

允许NuGet Package Manager恢复软件包。

单击Run并确保选择Local Machine。

验证构建成功。

完成后,您已经准备好在Windows应用商店中销售您的应用。如果您有一款不计划销售的业务线(LOB)应用,只打算供内部用户使用,您可以旁载此应用,以便将其安装到任何Windows 10设备。

有关更多详细信息,请参阅 为Windows 10打包通用Windows应用程序

将应用关联到Windows应用商店

项目菜单中选择Store > Associate App with the Store....

执行此操作时,将自动更新清单设计器的“Packaging”选项卡中的大部分字段。对于本地计算机上的当前项目,以下值将下载到应用程序清单文件中。

  • 软件包显示名称
  • 软件包名称
  • 发布者ID
  • 发布者显示名称
  • 版本

如果通过为清单文件创建.xml文件来覆盖package.appxmanifest文件,则不能将您的应用与应用商店关联。如果您尝试将自定义清单文件与应用商店关联,则会看到错误消息。不鼓励创建自定义软件包清单文件。

有关更多详细信息,请参阅 为Windows 10打包通用Windows应用程序。

准备将应用提交到应用商店

一旦您通过 保留名称完成创建应用,则可以开始发布应用。第一步是创建提交。

通常,当您完成创建应用并准备进行发布后,就可以开始创建提交。不过,哪怕还没有编写一行代码,您也可以开始输入信息。提交信息将保存在您的控制面板中,当您准备就绪后,随时可以重新使用之前输入的信息。

发布应用后,通过在控制面板中创建另一个提交,您可以发布更新版本。创建新提交可让您修改之前的版本并发布新版本,不管您是上传新软件包还是仅仅更改一些详细信息,如价格或类别。

要为应用创建新提交,请单击显示在App overview页面上最新提交旁的Update

应用提交检查清单

Unity提供给你了提交应用所需要的必需资源,但建议您提供自己的图像和资源。下面是Package.appxmanifest文件的Visual Assets部分的截屏:

您可以查看构建过程提供的所有资源。

有关更多详细信息,请参阅MSDN上的应用提交。

运行Windows应用认证工具包(WACK)

为了尽可能让您的应用在 Windows应用商店中成功发布 或获得Windows认证, 在提交应用以便进行认证之前,请在本地进行验证和测试。本主题介绍如何安装和运行 Windows应用认证工具包。 WACK将对您的应用执行一系列测试,例如性能和API兼容性等。有关此工具包执行的特定测试的更多详细信息,请参阅以下主题:

资质要求

如果您开发的是通用Windows平台(UWP)应用,必须…

要安装Windows应用认证工具包版本10(对于Windows 10,包含在Windows 软件开发工具包(SDK)中),您必须先创建应用程序包以运行测试。从Project菜单中,选择 Store > Create App Packages…:

完成创建软件包后,将显示以下窗口,从中可以启动Windows应用认证工具包(WACK):

启动WACK时,将显示以下对话框:

单击 “Next” 继续执行验证步骤。如果看到多个弹出窗口,请不要担心。该工具只用于运行游戏和执行测试。这些测试可能需要几分钟才能完成。

完成测试后,将显示以下窗口。如果测试失败,您可以查看此窗口中的信息,以便更正错误,然后重复此过程,直到测试通过。

单击 “Click here to view the results” 链接将在浏览器中打开测试结果。

您可以在此窗口中查看每次测试和研究具体失败原因,然后更正错误。请更正所有错误并重新运行测试,随后可得到以下结果:

有关更多详细信息,请参阅使用Windows应用认证工具包 应用提交。

发布到Windows应用商店

完成构建并上传游戏后,您需要登录开发者帐户才能将其提交到应用商店。请按照以下步骤开始提交过程。

  1. 打开浏览器并转到https://dev.windows.com。
  2. 登录您的帐户并单击Dashboard链接。
  3. 选择在Visual Studio中创建的应用程序包的名称。
  4. 单击"Start your submission"。
  5. 在下一步,您需要填写关于您的游戏的信息,然后才能完成提交。单击其中任何链接将打开一个新页面,该页面将引导您完成提交过程的详细步骤。

Packages 页面就是为您提交的应用上传所有软件包文件的位置(.xap、.appx、.appxupload和/或.appxbundle)。在这一步,您可以为您的应用的所有目标操作系统上传软件包。

当客户下载您的应用时,Windows应用商店将检查您所有可用的应用程序包,并自动为每一位客户提供最适合客户设备的程序包。

有关软件包中的文件及其文件结构的详细信息,请参阅应用程序包要求。 您可能还希望了解…

将程序包上传到提交

要上传程序包,请将其拖放到上传字段中,或单击此字段以浏览您的文件。 Packages 通过此页面可上传 .xap、.appx、.appxupload和/或.appxbundle 文件。

注意: 对于Windows 10,您在此处只能上传 .appxupload 文件,不能上传 .appx或.appxbundle文件。 有关为应用商店打包通用Windows平台(UWP)应用的详细信息,请参阅 为Windows 10打包通用Windows应用程序。

如果在验证时检测到您的程序包有问题,则需要删除程序包,修复问题,然后重新上传。有关详细信息,请参阅解决程序包上传错误。

参考实现

在本部分,我们将引用Jb Evain在不到20分钟的时间内编写了一个达到构建阶段的简单3D篮球游戏。如果您喜欢从头开始制作游戏,可以 按照 Jb的讲解操作。制作此游戏需要的唯一外部资源是 Hoop.3ds 文件。

如果您只想 下载 完成的项目包,则可以下载Basketball-At-Build.zip。这是完整的游戏,完全可以运行。解压此文件后,您可以继续学习您本部分的其他内容。

下面是完成游戏中的一个场景:

篮球

在后面几步中,我们将使用一个游戏来演示上面概括的步骤,从而让一款游戏准备好提交到Windows应用商店。

如果您从头开始构建该游戏,则需要遵循这些步骤。如果您已下载完整的项目,则可以跳过步骤1到8。

  1. 打开Unity并新建一个 项目 您可以将其命名为“Basketball”或“Awesome Game”。
  2. 制作游戏场景。
  3. 从下载位置将Hoop.3ds拖放到Assets面板中。
  4. 请选择 Assets > Import Packages > Characters。
  5. 下载资源后,单击 导入 按钮。这样可以将所有资源导入您的项目中。
  6. 创建一个球体并对其应用材质,使其有颜色和反弹力。
  7. 在场景中定位组件。
  8. 编写Shooter脚本,以便将篮球投入篮网。
  9. 项目 选项卡中,展开 Assets 树并单击 Scenes 文件夹。
  10. 双击 游戏 场景以便加载。 在继续之前,我们先运行游戏并看一看效果。
  11. 现在,我们知道了游戏可以运行,可以测试您的技巧了!

使用Unity创建Visual Studio项目

现在,您已经在Unity中导入和测试了游戏,我们可以继续创建Visual Studio解决方案。

在菜单中单击 File | Build Settings… 以打开 Build Settings 窗口,并确保在 Scenes In Build 视图下选定一个场景。您需要确保…

  • 平台 设置为 Windows Store (否则,单击 Windows Store > Switch Platform)。
  • SDK 设置为 Universal 10。
  • UWP Build Type 设置为 XAML。
  • Unity C# ProjectsDevelopment Build 均已选中。

接下来,单击 “Player Settings…” 按钮并确保其中的信息正确。此游戏专为 横向 模式设计。请验证 Default Orientation 设置为 横向

最后,在 Build Settings 窗口中单击 Build 按钮。系统会提示您选择一个您希望用于构建项目的文件夹。这就是用于创建Visual Studio解决方案和项目的位置。

使用Visual Studio创建应用程序包和WACK

我们已经成功创建了Visual Studio解决方案,现在可以过渡到后续步骤,继续进行设置。

双击为您创建的解决方案。

Visual Studio 2015将打开并加载三个项目。如果看到错误,请不要担心。Visual Studio异步加载资源。只需等待所有资源加载完成,然后从菜单中选择 Build | Build Solution ,在 Debug 模式下构建项目。

接下来,您要…

  1. 验证构建成功。
  2. 将模式从 Build | Build Solution 切换到 Master。 这一步很重要,因为您需要使用 Master 模式才能将UWP应用提交到Windows应用商店。(Master 模式将移除安全检查并禁用性能分析器,从而提供最佳性能。)
  3. 选择 Store | Create App Packages... (从 项目 菜单)。

如果这是您首次使用或者是过了几天之后再使用,系统将提示您使用Windows应用商店开发者凭据进行身份验证。您需要输入安全代码才能验证您的凭据。

如果构建成功,请单击 Launch Windows App Certification Kit 按钮以便继续。测试过程可能需要一些时间才能验证您的游戏已准备就绪,可提交到Windows应用商店。

如果一切顺利,则会看到以下屏幕:

设计适用于UWP的Unity游戏

Unity提供了一组成熟的工具集,可让您定位到许多平台。其中包括针对通用Windows平台Platform (UWP)应用的工具支持。Unity工具可处理许多问题,其中包括:

  • 多种分辨率和屏幕大小调整
  • 宽高比

多种分辨率和屏幕大小调整

您的Unity游戏开箱即用,可处理多种分辨率和屏幕大小调整。该支持有一个方面不太直观,但对您的游戏来说仍很关键,即菜单和平视显示(HUD)。

Unity提供了新的用户界面系统Unity UI。该新UI系统不再要求在您的游戏中使用第三方插件且便于实现成熟的界面。请务必正确配置菜单和HUD,并在不同的分辨率下进行测试。如果您记得以前在Windows窗体或WPF中的操作,则会记得您可以锚定UI元素,以便让元素随屏幕调整大小。Unity提供了与此相同的功能。除了锚定位置,您还可以定义当屏幕改变大小时,您的UI元素是调整大小还是保持不变。

宽高比

就像多种屏幕分辨率和屏幕大小调整一样,Unity支持多种宽高比。请务必始终对您希望在游戏中支持的各种宽高比进行测试,但使用Unity测试您需要的任何宽高比都非常简单。

为了确保万无一失,您需要在模拟器和您可以访问的目标设备上都进行测试。

Visual Studio 2015 Tools for Unity

Visual Studio随附可帮助您准备好Unity游戏,以便将其发布到Windows应用商店的工具。其中包括:

  • Unity Project Explorer
  • 在Visual Studio中编写脚本和调试
  • 图形调试器

Visual Studio Tools for Unity

从Unity 5.2开始,您不再需要单独导入Visual Studio Tools for Unity。在Visual Studio 2015中,只需转到 Tools | Extensions and Updates 即可安装Visual Studio 2015 Tools for Unity。

如果您要获得最新版本的VSTU,或者您使用的是Unity 5.2之前的版本。下一部分将引导您完成必要的步骤。如果您使用的是Visual Studio 2015和Unity 5.2或更高版本的组合,则不必参考以下步骤,可放心跳过。

Visual Studio Tools for Unity可让您在Microsoft Visual Studio中编写和调试您的Unity游戏。除了添加断点以及对变量和复杂表达式求值外,您还可以像在Unity中一样使用Unity Project Explorer浏览项目。最后,您将在Visual Studio中看到与Unity中可能得到的完全相同的控制台输出。

下面是安装Visual Studio 2015 Tools for Unity的截屏。请确保选中下面的复选框以接受条款:

一旦完成,将会出现提示框,请按照提示完成安装。

现在已经完成安装,我们需要打开Unity并将此工具添加到我们的项目。

随即会显示以下Unity对话框。请保持选中所有复选框并单击 导入 按钮:

您将看到在Project层级中创建了一个新文件夹:

如下所示,您需要确保正确配置Build Settings,以便正确使用Visual Studio。请确保选中“Unity C# Projects”和“Development Build”。

您现在已准备就绪,可开始使用Visual Studio编写脚本和进行调试。注意:只有低于Unity 5.2的版本才需要执行安装过程。

在Visual Studio中编写脚本和调试

如果您在Unity中双击脚本,则会启动Visual Studio。例如,如果我们选定 Shooter.cs 脚本并在Visual Studio中启动此脚本,则会看到以下界面

现在,如果我们要调试 GetButtonDown 调用(开始投篮),则可以在第12行添加一个断点,然后单击 Attach to Unity 按钮:

现在,返回Unity,您只需单击 Play 按钮,游戏就会启动。由于我们知道将触发 更新 ,所以如果我们单击鼠标左键按钮,则会在Visual Studio中看到游戏运行到第12行后暂停。

调试工作流程与任何Visual Studio项目相同。

图形调试器

Visual Studio 2015提供了一款非常强大的图形调试器,可让您优化游戏。

首先,请确保将 Graphics Tools 添加到系统。在Windows中,转到 Settings, 选择 System, 选择 Apps & Features, 选择 Manage optional features。 如果已安装,则会看到 Graphic Tools:

如果没有,请选择 Add a feature ,并在列表中单击 Graphic Tools。 如果您在安装时遇到问题,请参阅MSDN文档中的 图形诊断工具

您需要从Unity使用Visual Studio构建并打开游戏才能使用Graphics Tools。在Visual Studio中,您可以从菜单中单击 Debug | Graphics | Start Graphics Debugging,以便使用此工具, 如下所示:

游戏启动后,将显示以下UI:

单击Capture Frame图标可捕获游戏的当前帧。您可以捕获游戏运行的不同部分。

双击某个Frame将显示与该帧相关的详细分析结果。您可以在 Graphics Event List 面板中向前或向后查看绘制调用,也可以选择单个像素并查看 Graphics Pixel History 面板:

注意,该图形争端文件可能非常大。如果您希望了解更多信息,请访问 Visual Studio图形诊断概述。

生成Windows应用商店资源

为了将您的应用提交到Windows应用商店,您需要提供正确大小的图像。这正是一款Visual Studio扩展可以大显身手的时候: UWP Tile Generator。 您可以选择一张图像,它会为创建一个zip文件,其中包含您需要的所有大小的图像。

了解Unity与UWP应用之间的差异

Unity使用称为脚本后端的框架来支持脚本。它目前支持三个后端:Mono、.NET和IL2CPP。当您的应用定向到Windows应用商店时,只有.NET和IL2CPP可用。您可以在Unity中从Build Settings窗口单击Player Settings,选择 Scripting Backend

在Unity IDE中,使用.NET的脚本会引用.NET版本3.5,但是,将您的游戏导出至Visual Studio时,所有C#代码针对.NET Core进行编译,而这是.NET版本4.5的子集。( 注意: 如果您使用IL2CPP作为脚本后端,您的Windows应用商店应用程序会继续使用.NET 3.5。)为了进行说明,请尝试将以下代码行编写到Unity脚本中:

        
          System.Collections.SortedList lst = new SortedList();
        
      

当您在Visual Studio中按F12 转到 SortedList 的定义,以便查看类型定义时,您会发现该类位于库mscorlib中。

如果您将同样的代码插入导出的项目并按F12转到 SortedList 类型的定义,您会发现该类的版本包含在属于.NET Core的NuGet软件包中。

过去,如果有.NET 3.5中的类型或方法,而该类型或方法不在.NET Core中时,可能导致出现问题。这就需要使用 WinRTLegacy 之类的helper库来解决问题并提供类型和扩展方法。

提示: 请小心使用Unity和.NET Core之间缺少类型的指南。这些内容中很大一部分已经过时,不一定准确。

不过,当.NET Core发展时,从.NET 3.5移植到.NET Core会继续改进,这对理解Unity与UWP之间的本质区别以及缺少类型和方法的问题来说仍很重要。例如, System.Threading.Tasks 是在.NET 3.5之后作为.NET Core的一部分引入的。如果采用相反的方法,尝试实施在.NET Core中存在而在.NET 3.5中不存在的功能时,您可能也会遇到问题。

值得注意的是,如果您使用IL2CPP作为脚本后端,Unity Editor与Windows应用商店应用程序之间的API表面将会相同。

平台特定功能

由于Unity和通用Windows平台(UWP)是不同的平台,在它们之间进行移植程序既有优势又有挑战。

性能优化

UWP应用使用.NET Native可生成优化的原生机器代码,从而让您的游戏提高启动速度并降低电池消耗。这些优化的影响程度视游戏复杂性而定,但使用.NET脚本后端的Unity游戏更可能获得性能提升。在生成的游戏项目中,只会将“Master”构建配置编译成.NET Native。

指令

如果您想从您的游戏调用UWP Toast或Tile,如何实现?在Unity中开发时,使用的脚本后端.NET 3.5中并没有提供这些功能。在这种情况下,只要将代码导出至Visual Studio,您的代码也许可以正常运行,但是在Unity IDE中永远无法正常运行。

为了解决此类问题,Unity提供了 UnityEngine.WSA库, 其中包含Application、Cursor、 Launcher、Tile和Toast等存根类。 您可以在Unity C#脚本中对这些类型编程,从而实现Unity与UWP之间的互操作性。

管理.NET 3.5中缺少的功能的第二种方法是在脚本中使用 NETFX_CORE 指令。该指令用于忽略您知道在.NET 3.5中不会编译,但针对.NET Core编译时,您的游戏中需要的代码块。以下示例可在Unity bitbucket 代码仓库 中找到,它演示了如何通过使用指令来忽略在Unity IDE中无法运行的代码。

        
          #if NETFX_CORE
          async
          #endif
          void UpdateTile(byte[] png150x150)
          {
          #if NETFX_CORE
              // In order to change tile image, we should change the uri too
              // in this example we store images in applications local storage
              // we must also take care of cleaning it up
              StorageFolder localFolder = ApplicationData.Current.LocalFolder;
              StorageFolder tilesFolder = null;
              try
              {
                  tilesFolder = await localFolder.GetFolderAsync("tiles");
              }
              catch (Exception)
              { }
              if (tilesFolder != null)
                  await tilesFolder.DeleteAsync();
              tilesFolder = await localFolder.CreateFolderAsync("tiles");
              string tileFile = "tile" + counter++ + ".png";
              StorageFile file = await tilesFolder.CreateFileAsync(tileFile, CreationCollisionOption.ReplaceExisting);
              await FileIO.WriteBytesAsync(file, png150x150);

              string txt = textToTile ? text : "";
              Tile.main.Update("ms-appdata:///local/tiles/" + tileFile, "", "", txt);
          #endif
          }
        
      

有时,您希望更具体并使用 Unity_WSA_10_0 指令,而不是依赖 NETFX_CORE. 后者适用于任何Windows应用商店应用程序,而 Unity_WSA_10_0 专门用于Windows 10设备。

编写插件

插件也可能受.NET 3.5与.NET Core之间的差别的影响。有时代码是兼容的,您不会发生任何问题。但如果不兼容,Unity可以让您对应用进行配置,使用同一个插件的两个不同版本,一个用于Unity IDE(基于.NET 3.5 API),另一个用于完整游戏(针对.NET Core进行编译)。

为了实现多个插件,您必须遵循某些原则。您的插件必须共享相同的名称且使用相同的程序集版本号。还必须将两个插件放在单独的文件夹中。例如,Unity Editor兼容插件应放在..\Assets\Plugins\MyPlugin.dll中,而特UWP专用插件应放在..\Assets\Plugins\WSA\MyPlugin.winmd中。

对于为Unity Editor编写的插件,您还需要将其版本配置为.NET Core插件的占位符 – 让Unity知道哪个库是存根以及哪个是将部署到Windows应用商店的有效版本。

在Unity Project Explorer中选择Assets\Plugins\MyPlugin.dll,并选中Editor作为平台。

然后转到Assets\Plugins\WSA\MyPlugin.winmd并选择Windows应用商店应用程序作为该插件的正确平台。

为了帮助理解此过程,我们将引导您构建一组插件。

打开Visual Studio 2015并创建一个名为“MyPlugin”的新项目。请使用 Visual C# | Windows | Universal | Windows Runtime Component项目模板。 (还可以使用 Class Library 项目模板,不过Windows运行时组件有一些有趣的功能,例如可以从任何Windows运行时语言映射使用,这有额外的好处。)

右键单击您的解决方案并选择 Add > New Project。 这就是仅在Unity Editor中使用库的存根版本。因为它将针对.NET 3.5进行编译,您需要使用 Visual C# | Windows | Classic Desktop | Class Library 项目模板来创建。将此项目命名为“MyPluginStub”,因为在同一个解决方案中不能为两个项目使用相同的名称。

因为两个库必须使用相同的名称,所以,您需要将MyPluginStub的输出文件的名称配置为MyPlugin,也就是与另一个项目相同。为此,在Solution Explorer中右键单击MyPluginStub项目并选择 Properties。 在Application选项卡,为了与另一个项目匹配,请将Assembly Name字段和Default namespace字段更改为“MyPlugin”。执行此操作时,还应将Target framework字段更改为“.NET Framework 3.5”。

删除Visual Studio为每个项目创建的Class1.cs文件。然后,在MyPlugin Windows Runtime Component项目中创建一个名为“Foo.cs”的新类,而不是为Windows Desktop项目创建一个类似的类,我们会将Foo.cs添加为链接文件,从而进行共享。

现在,您可以从MyPlugin项目和MyPluginStub项目编辑同一物理文本Foo.cs。从两个项目的代码编辑器均可检查该文件。从MyPluginStub中查看时,您会发现Visual Studio会在 System.Threading.Tasks 的using语句上添加红色波浪线。这是因为.NET Core中存在该类型,但.NET Framework 3.5中不存在。

我们只需删除这一行代码即可修复错误,因为我们不打算使用它。但是,我们将对一个指令进行测试,以演示其效果。请使用以下三行代码替换Tasks的using语句。

        
          #if NETFX_CORE
            using System.Threading.Tasks;
          #endif
        
      

添加后,您会发现项目会再次编译。对于Foo类,我们还需要一个方法。理所当然,它应该是Bar方法。如果从Unity Editor调用,Bar应返回一条消息,如果在Windows运行时组件内部调用,则会返回一条不同的消息。请将以下Bar方法的实现添加到Foo类。(同时将“sealed”关键字添加到类声明中,这是运行时组件的要求。)

        
          public sealed class Foo
            {
              public string Bar()
              {
                #if NETFX_CORE
                  return "Windows Store version of the plugin.";
                #endif
                  return "Unity Editor version of the plugin.";
              }
            }
        
      

构建两个库。

接下来,您将配置Unity项目以使用这些库。请在Unity中打开项目并在Assets下创建一个Plugins文件夹。在Plugins下在创建一个目录WSA(Windows Store Application的首字母缩写)。从MyPluginsStub项目中找到MyPlugins.dll文件并将其拖放到..\Assets\Plugins中。然后找到编译的MyPlugins.winmd文件并将其拖放到..\Assets\Plugins\WSA中。

在资源面板中单击Plugins\MyPlugin,检视面板中将显示MyPlugin Import Settings。取消选择“Any Platform”,选择Editor。这可以告诉IDE在Unity Editor中时应运行此版本的库。

接下来,展开下一级目录并选择Plugins\WSA\MyPlugin。检视面板中应已选中WSAPlayer,而不会选中任何其他平台。这可以告诉Unity这是您希望发布到Windows应用商店的库版本。向下找到Placeholder字段,并在Plugins文件夹的根目录中找到存根库。这样,您就解释了两个库之间的关系。Plugins\MyPlugin.dll是实际库Plugins\WSA\MyPlugin.winmd的占位符。

现在可以对两个库进行测试,从而确保它们在Unity中的配置正确。请在Unity中创建一段称为“TestFooBar”的新C#脚本。为Foo类创建一个私有(private)实例,以便将Bar的返回值写在Logger中。

        
          using UnityEngine;
          using System.Collections;
          using MyPlugin;

          public class TestFooBar : MonoBehaviour {

            private Foo testFoo = new Foo();
             // Use this for initialization
               void Start () {
                  Debug.Log(testFoo.Bar());
                }

            // Update is called once per frame
              void Update () {

              }
            }
        
      

最后,将此脚本拖放到一个游戏对象上(如Player),从而使其关联。这样可以确保调用脚本的Start方法。在Unity中运行游戏,如果一切按计划进行,正确的消息将显示在Console面板中。

最后,请转到 Build Settings 并单击Build按钮,将项目导出至Visual Studio。

这一次通过Visual Studio运行游戏,您会在Visual Studio输出窗口中看到以下消息:

此插件示例是通用Windows平台(UWP)与Unity之间几乎所有交互的基础。如果您能够在控制台中获得正确的消息,则说明您已经掌握了封装UWP代码并从Unity引擎访问代码所需要了解的大部分知识。

广告

您可以通过下载和安装 适用于Windows应用商店和Azure服务的Unity插件 ,从而将Microsoft Ads作为Unity插件运行。该插件还包含用于应用内购、许可证检查和收据验证的API。

要使用适用于Windows应用商店的Unity插件,最简单的方法从GitHub下载Unity软件包,并使用Unity Editor中的 Assets | Import Package | Custom Packages 将其导入应用程序。导入软件包后,Unity Plugins文件夹和Unity Plugins\WSA文件夹中将产生正确的二进制文件。

或者,您也可以从导出的UWP应用程序使用最新的 Microsoft Store Engagement和Monetization SDK 扩展,以展示横幅广告和视频插播广告。Microsoft Store Engagement和Monetization SDK将Microsoft Universal Ad Client SDK的广告功能与应用商店服务的相关其他功能集成在一个统一的安装程序中。

Analytics

既可以通过Unity平台收集关于玩家的分析信息,也可以通过通用Windows平台(UWP)收集。您还可以选择同时使用两个平台收集互补性数据。如果您希望使用Unity平台,则需要将您的项目链接到Unity Services ID,然后为项目启用分析服务。有关更多信息,请参阅 Unity手册。

在您部署游戏后,Windows开发人员中心控制面板将显示自动收集的数据。该控制面板可让您及时掌握以下方面的报告:

  • 获取数量
  • 运行状况
  • 排名
  • 评论数量
  • 反馈
  • 用法
  • IAP获取数量
  • 广告聚合
  • 广告表现
  • 应用程序安装广告
  • 通道和转化

如果启用,您甚至可以查看游戏的用法遥测。

最后,您还可以使用REST API以对您最有用的方式 查看这些分析 ,而不需要转到Windows开发人员中心。

应用内购(IAP)

由于Unity游戏需要通过两个平台(Unity和UWP)才能导出至通用Windows平台(UWP),所以您有两个启用应用内购的选项。您可以使用Unity IAP或 适用于Windows应用商店和Azure服务的Unity插件

要使用Unity IAP,您需要通过Unity中的Services窗口设置Unity Services Project ID。这将引导您通过一系列窗口启用适用于Windows应用商店的IAP。 更多详细信息 可在Unity网站上找到。请注意,Unity IAP不能用于IL2CPP脚本后端。

凭借适用于Windows应用商店的Unity插件,您可以通过应用商店API从Unity脚本文件内部检索列表。首先,您需要通过Windows应用商店开发人员中心为应用程序 创建应用内产品 。然后,您可以将应用程序更新到列表中并允许购买IAP。通过插件发起的关键调用要求调用 LoadListingInformation 方法才能检索应用内产品,如以下示例代码所示。

        
          Store.LoadListingInformation((response) =>
          {
            if (response.Status == CallbackStatus.Failure)
              {
                prettyPrintErrors("LoadListingInformation", response);
                return;
              }

            prettyPrintSuccess("LoadListingInformation", response);
            text.text = "\nFinished Loading Listing Information" + text.text + "\n";
            Debug.Log(response.Result.Description.ToString());
            foreach (var productListingKey in response.Result.ProductListings.Keys)
              {
                Debug.Log("Key: " + productListingKey + " value: " + response.Result.ProductListings[productListingKey].Name);
              }
          });
        
      

GitHub中提供了演示如何使用应用商店API的完整 实现示例

最佳范例

随着游戏核心的完成,您需要执行一些修改,以便让您的应用程序在Windows 10系列设备上发布。在本部分,我们将介绍几个可以让您将应用程序轻松部署到Windows应用商店的最佳实践。

启动画面和加载进度

当游戏启动时,必须显示一个进度指示条,以便让用户知道游戏没有卡住或停止。

在本文中,我们假设您使用的是XAML项目。如果不是,大部分概念仍然适用于DirectX项目,但具体实现有相当大的区别。

使用Unity加载Windows应用商店的游戏有两个关键阶段

  1. 应用程序启动画面
  2. 延长启动画面体验

初始启动画面图像在操作系统上显示,您可以通过通过更新应用程序清单进行配置,具体如下:

Windows仅在操作系统加载托管Unity场景的页面(以XAML标记编写)期间显示初始应用程序启动画面。

通常,加载Unity场景需要更长的时间。为了创建延长启动画面体验,您需要使用XAML再次显示同一启动画面,并在顶部向用户显示加载Unity场景时的进度指示条。在MainPage.xaml中,请在启动画面图像旁添加一个进度条。

        
          <SwapChainPanel x:Name="DXSwapChainPanel">
            <Grid x:Name="ExtendedSplashGrid" Background="#222C37">
              <Image x:Name="ExtendedSplashImage" Source="Assets/SplashScreen.png" 
                VerticalAlignment="Center" HorizontalAlignment="Center"/>
              <ProgressBar x:Name="SplashProgress" Foreground="#FFFFFFFF" 
                Background="#FF333333" Maximum="10000" Width="320" Height="25"/>
            </Grid>
          </SwapChainPanel>
        
      

在MainPage.xaml.cs中(XAML UI的代码文件),使用构造函数启动让进度条开始滚动的计时器,从而为用户提供一些视觉反馈。

设备形状因子

一个涵盖许多形状因子的代码库是通用Windows平台(UWP)的关键特性,但是对于游戏的特定形状因子,可能仍然需要进行一些调整和优化。通常包括输入机制(例如,触摸、键盘、鼠标和游戏手柄)、窗口大小调整、资源和资产优化,以及本机平台与各特定形状因子集成的实现。

定向支持

由于新设备上主要采用宽屏宽高比,所以Unity Editor默认以横向导出项目。如果您的游戏支持纵向,则需要在Visual Studio中更改应用程序清单,在Unity Editor中无法执行此操作。

要更改清单,请双击 Package.appxmanifest 文件(位于Windows应用商店Visual Studio项目的根目录中)。在清单编辑器中,选中您希望支持的方向。

方向API (Input.deviceOrientation and Screen.orientation) 适用于Unity。您可以使用这些API查询设备的方向,甚至为特定场景设置方向。

窗口化支持

通用Windows平台(UWP)应用程序以可调大小的窗口显示,而不是像在Windows 8和8.1一样以全屏显示,所以您现在应该考虑为游戏和应用程序使用窗口化界面。

作为Unity开发人员,这些区别中大部分对您来说都是透明的,因为 Screen.height和Screen.width 属性仍会以原始大小(像素)报告可用空间。

当用户更改窗口大小时,推荐做法是暂停游戏,以便用户决定下一步操作。因为在桌面模式下可能同时打开多个窗口,所以游戏窗口也可能失去焦点,您还需要处理焦点变化,在游戏窗口失去焦点时暂停游戏。

暂停和恢复游戏

在Windows中,当游戏失去焦点时,Unity游戏引擎通常可以自动处理暂停和恢复游戏。如果您希望在应用程序不能自动暂停的情况下暂停游戏(例如在XAML页面之间导航),则可以调用 UnityPause 方法。

当应用程序即将暂停时,如果您需要执行额外的任务,请在脚本中回调 OnApplicationPause

游戏手柄和鼠标输入

Windows系列设备支持各种输入方式,从键盘和鼠标到触摸和游戏手柄等等。幸运的是,Unity不仅可以完美支持所有这些输入模式,它的输入管理器还可以正确将其提取出来。

在Basketball游戏的投手行为中,触发“Fire1”输入轴后,投手才会投出篮球。

        
          void Update()
            {
              if (Input.GetButtonDown("Fire1"))
              {
                var instance = (Rigidbody)Instantiate(this.prefab, transform.position 
                        + (transform.forward * 1.05f), transform.rotation);
                instance.velocity = (transform.forward + transform.up / 2) * this.speed;
              }
            }
        
      

默认情况下,在输入管理器中,“Fire1”实际上会映射到鼠标左键和游戏手柄/游戏杆按钮(如下所示)。要在Unity IDE中查看输入管理器,请选择 Edit > Project Settings > Input。

在Xbox One控制器上,“joystick button 0”映射到“Fire1”,正好是A按钮。还有一些输入已经映射到FPSController组件,用来控制移动和跳跃。默认情况下,鼠标移动、左键、右键、上下键盘方向键,A、D、S、W键,以及Xbox One控制器上的左游戏杆全部可以移动玩家。鼠标右键、空格键和Xbox B按钮全部可以让玩家跳跃。

为了获得个性化体验,您还可以通过重新将输入映射到输入轴,或者甚至添加更多支持游戏的输入轴,从而进一步自定义输入。您可以在Unity手册中学习 虚拟轴 的详细内容。

结论

本文档介绍了如何Visual Studio中配置游戏和将游戏从Unity导出至通用Windows平台(UWP)项目。还讲解了如何将UWP游戏提交到Windows应用商店。我们分析了Unity平台与通用Windows平台之间的一些细微区别。我们还解释了作为一名游戏开发人员,应该注意的特定于平台的代码和特性。最后,本文档也提供了一些修改游戏以便发布的最佳实践。

引用

返回顶部
明白了

我们使用cookies来确保为您提供网站的最佳体验。点击这里了解更多信息。