实战 Unity3d 导出 Windows 10 UAP(WAS)

说在最前

我可是程序员,不能光写软文,不写技术相关的东西,对吧?最近花了一个星期的时间将远古大陆移植到Windows 10上面,其实之前就一直想,可是没有办法,因为游戏引擎Unity有大量的底层接口不兼容,如果移植,需要改写大量的程序代码,并且需要花费大量的精力管理,我还发过相关的帖子问Unity的技术人员,得到回答是,“我们也搞不定哇 ”。

你懂得,Unity现在扛起了全民游戏引擎的大旗,怎么可能就这样罢休。就在上个星期发布的Unity 5.3.3之中,突然他们发布了一个可以使用IL2CPP的中间件的方法导出到Windows 10平台上。之前只能使用.Net 框架。关于这一点,我其实早就在那个帖子中给他们建议不要用Windows自带的.Net 环境,直接用一个中间件来做这个事情。现在他们已经做了,原因很简单,丫的微软变得太快,兼容不过来,而且维护多个平台,实在有些吃不消,为何不统一到C++的IL2CPP里面来呢?我们不是为了一点点C#的高版本的语言特性,而是为了只写一遍代码,很轻松导出并维护多个平台下面的程序,对吧?

关于IL2CPP,有Unity在他们的官方博客介绍,还有中文介绍,还有在Unity参考手册中的关于Windows10导出的介绍,毫无疑问,这个才是Unity脚本引擎发展的未来。

这有什么难的?

Windows 在移动开发上面本来就没有什么优势,大量的公司和程序员都会优先选择iOS和Android平台,在这两个平台下面做开发并与这两个平台兼容,然后在开发很久之后,发现,一直到Windows平台上却很困难,因为Unity在编译的时候产生大量的编译错误,因为大量的底层函数说找不到,更改起来非常麻烦,我在试图移植几次之后都以失败高中。

为什么又变成可能了?

因为Unity更改了他们导出方式,使用了一个IL2CPP的中间件,之前IL2CPP主要是用来解决iOS强制走64位程序的,后来估计他们的工程师发现这个TMD才是方向啊,再也不要走微软自带的.NET模块了。这样只要把工程调整成如下图所示,就能很方便的导出到Windows 平台下(需要Unity 5.3.3f1):

QQ截图20160307144021即使有一些编译的小错误,也都可以很简单的修改掉。

搭建最基本的环境

和iOS很像,Windows导出直接是一个Visual Studio 2015的工程(啊,我大VS出现了,让我想起以前PC端游的那些时光),然后再由VS导出一个包,上传到Windows Dev Center审核并发布。至于怎么下载,请百度谷歌之,很简单,就是需要等挺久的下载时间罢了。注意需要下载VS2015 + Windows 10 SDK。

说说坑吧

如果就这么点难度,怎么可能耗费我一周的时间?我就从最简单的需要注意的项目说起把。首先申明,这些坑都是在2016-3-3日左右发现的,所以之后可能没有,因为工具的版本迭代就会修复他们。

应用名字(Product Name)不能有空格

我的游戏叫做“Ancient Continent”,我自然把他填写到Unity的PlayerSettings的Product Name上面啦,最后七七八八的都弄完了,上传审核的时候,给我发过来一个什么Meta Data不一致的错误报告。因为Unity会根据你的Product Name来生成VS的多数项目工程文件,里面有些有空格,最后导致审核的自动检查通不过。忙了一周,然后终于各种问题都解决了,生成、打包、然后花了半个多小时上传,几个小时的等待,给我一个错误的结果,Oh shit,不行,我得去Unity论坛提个bug去。

QQ截图20160307152023

QQ截图20160307151731

好在只要去掉这个空格就行。同理,不能有中文字符啊,至于怎么中文化应用名字和加上空格之类的,看下一个坑把。

多语言应用名字(Multi-Language App Name)

搜索出一文档,详细的解释了如何使用多语言资源文件进行多语言的配置。但是,这里有坑。首先,这个文档,截图是使用的实际硬盘的文件结构(新建文件夹),而Unity生成工程使用的引用资源名称(新建筛选器),而最终的多语言资源文件的解析是按照实际文件夹的名字区分的,所以如果你把那些资源文件放到不同的文件夹中,仅仅在VS的工程里面用正确的名字,最后是不成功的

QQ截图20160307154934 QQ截图20160307154834

无论导出的VS项目的引用资源目录如何,你都需要准确的将资源文件放到准确的名字的本地文件夹下面,就像这样:

QQ截图20160307155617

还有就是,不想GooglePlay或者iOS AppStore,在Windows App Store 上面的多语言名字是无法在开发者后台上更改和填写的,而是嵌入到客户端的包里面的,具体可以参见这篇文章。P.S. 真是逆天的设定。

应用包名

在Android和iOS,还有黑莓开发来说,都使用了所谓的域名包名机制(从java继承),比如 com.yuchs.game.ac 这样的名字可以叫做 Package Identifier,用于区别一个应用和其他应用。然后Windows不是这样么干的,登录到Windows Dev Center,创建一个应用,然后一堆Pacakge Name,当时我就惊呆了,还是微软霸气。

QQ截图20160308164934

然而需要准确的将第一项天写入Unity的PlayerSettings/Publishing Settings中:

QQ截图20160308165617

应用图标

看到复杂而多样的Windows Tile(磁贴)& Icon,我真是巨无语啊,不过好在每一个样式只需要把100%给设置了就好了,我自己用PS切图还是搞了好一阵子。

QQ截图20160308174445

实现Native平台调用

在Unity的各个平台中都会有让你调用平台Native方法(函数、功能)的机制,Winodws UAP也不例外,这里有Unity的官方文档,一般来说没事干不会去调用Native的功能的,但是为了游戏营收用的内购,没有办法啊。当然,你也可以走Unity的统一IAP服务,但是他要注册帐号并且导入一堆东西进入Unity,并强制使用Unity Analytics ,作为程序员的我,无法忍受。我曾经试图发布了一个Unity插件在Unity Assetstore上面,不过失败了(参见最后的说明),在这里可以下载。你如果也不想使用Unity内置的服务,可以选择这个插件。

这一步难度不大,因为我已经把这个坑给填了。dll的项目(C/C++代码)可以下载这个,用VS2015打开,如果不懂万恶的C++,请绕道直接下载插件。

测试内购(IAP)

GooglePlay 测试方法使用的是测试帐号,但是测试之前,你需要上传一个Beta测试的包到开发者控制台,并且版本需要极端一致。iOS AppStore 使用的也是测试帐号,但是不需要上传到iTunes Connect,最方便。而Windows 10 的方式,本地使用模拟的方法测试(配置文件是一个坑),然后提交到商店,并且还需要审核通过,才能测试真正的付费,而且在你首次提交的时候,需要用客户端代码设置非调试模式,此时,点击内购,程序崩溃……够霸气吧。这里突然想起一句话,“永远不要小看微软”。

首先你可以查看一下测试内购的官方文档,心里有个概念。我这里解释一下Unity生成VS工程的时候3个模式,Debug,Release,Master,前两个用来调试的,调试信息最多;Release效率高一些,调试信息少一些。前两个都有Build Development 的字样。Master用于最后生成包提交到商店。

QQ截图20160308175646

当你首次使用Debug + x64本机运行你的VS项目的时候的时候,应用已经在本地的如下文件夹了:

C:\Users\<username>\AppData\Local\Packages\<app package folder>

至于app package folder,就是你在Unity的PlayerSettings/Publishing Settings 里面的Package Name。比如 000000YuchGame.AncientContinent,然后在更深层的位置里面:

C:\Users\<username>\AppData\Local\Packages\<app package folder>\LocalState\Microsoft\Windows Store\ApiData\WindowsStoreProxy.xml

如果你是用的是我写的插件,那么需要打开这个WindowsStoreProxy.xml更改一下里面的内容(productId要对上,IsTrial要标记成false,除非你有别的测试企图):

QQ截图20160308174135

至于这个文件和Windows Dev Center 里面的IAP配置怎么对应,主要还是参考的刚才我提到的官方文档。这个地方木有坑。

提交商店

调试好内购,然后设置IAP的非调试模式(这个时候应用是会崩溃的),然后使用VS2015的打包菜单进行打包,说实话,我这个菜单找了半天:

QQ截图20160308182651

注意最后一步,需要将两个配置更改一下,否则有可能会出现“Task ‘ExpandPriContent’ failed.” 异常,无法生成包。Unity5.3.3f1的Release note说已经修改好了,但是我还是遇到了,好囧,总之你要是遇到了,关了就成了:

QQ截图20160308182940

最后就是打开VS工程目录下面的build目录,找到 3 个 *.appxupload 文件传到Windows Dev Center后台给审核就可以了。审核首先是机器审核,木有问题的话,只需要2-3天就能通过,然后再等16小时,你就可以测试一下线上正式版本的IAP是否正常了。

IAP验证

这里坑比较大,而且我也没有完全解决,所以最后一个说。

一般来说,内购都是有破解的,就是不用真正的花钱,就能购买到东西,远古大陆早期吃过这样的亏。所以你需要对购买订单做一个验证处理,这需要你的应用联网,或者有一台服务器去验证这个内购的订单。关于验证的官方文档,我也找出来了,在这里。如果你有服务器或者本地客户端使用的是.NET 导出(.NET的高级一点的版本,Unity 的2.0 .NET是搞不定的),就可以利用这个官方文档直接验证订单。

但是我的服务器是Java的,我找遍了关于Signed XML的文档,并且做了大量实验,都无法验证Windows 10 IAP 的订单XML,仅仅可以做到用从网络获取的证书解密这个订单的一个加密证书而已,所以不是很全面,我已经发了两个问题到开发论坛中了(这里还有这里),希望有人能够回答一下才好。

最后

我的游戏刚刚上线(写这篇文档的时候),花了这么大力气折腾Windows App Store的上线,无非就是想多一个平台,多一点玩家,多一点收入。但是这两天来看,没有下载量,到商店里面通过点击分类还找不到自己的游戏,只能搜索英文名称,而且没有自然下载量。我已经在Windows Dev Center后台开启了付费广告推广,好像也没有什么用。

这里不知不觉的想起了黑莓,所有新上线的游戏,黑莓市场首页也能看见,前两天都会接近500的下载,如果品质好一些,受到黑莓编辑的推荐,还能有1K的新用户量,实在是给力。

——————END——————–

动态更新(2016-03-11)

收到微软的邮件说,我的账户违反了开发者政策,已经被禁止访问,而且我的远古大陆游戏已经被停止上架。我登录我的帐号,发现这个情况(Access restricted)

QQ截图20160308134504当时一万匹草泥马从心中奔过,刚注册没多久的开发者账号,完了新游上线,2天内只有10个新用户(还是我从微博上拉来的一些老玩家),你丫告诉我违反开发者政策?毫无理由……我发邮件询问过去,说违反了具体哪条政策,隔了12个小时,他又重复的告诉我一边我“违反了开发者政策,这个政策是你注册帐号的时候同意过的哦,并正在省察,等10个工作日把”,好吧……无语了。

QQ截图20160311092734看来微软还是那个微软,没有变。我终于明白了为啥Windows Store应用这么少了,自作孽不可活哇。这次花了一周时间、116RMB得到了这个教训,值!

动态更新(2016-03-19)

之前发过邮件为什么封我号,他们说正在研究,需要等一段时间,过了几天,我又收到如下邮件:

QQ截图20160319222616

很显然,还是官方模版邮件,意思是呢,你违反开发者政策了(没有指明是哪一条政策),我们斟酌了很久,还是决定封闭你的帐号,你的应用也被下架了哦,以后不会收到付款了哦,亲。咻——还好,是上线之后立刻就被封,如果我更新了几个版本,还有那个么些用户,那就不好办了。

算了,这次教训让终于明白了一个道理,如果你想使用一个服务,请选择:

  • 如果是大公司开发的产品,看看是否是第一个有价值的服务,并且其他的公司服务尚未形成威胁,没有同类型产品,比如iphone,googleplay
  • 如果是小(初创)公司开发的产品,请选择是收费的
  • 如果是同类型产品,很多家的话,看看是不是这个公司竟有的救命稻草,倘若是想微软那样的巨大的公司,那么还是算了吧

这个规则不一定,因为有一个微信,他是从一个大公司里面诞生出来的,并且诞生的时候,同类型产品很多了,但是他最后统一了移动互联网的IM界。

动态更新(2016-03-22)

在3月8日的时候提交个Unity AssetStore的那个IAP插件,在14天之后被拒绝了,原因是文档说明不足和图片不符合标准:

QQ截图20160322094525

反正是免费的资源,我也懒得折腾这个了,算鸟,还是放在自己的网站上下载吧。吐槽一下Unity的审核时间,真TMD慢,7天开始审核,再过了7审核完毕,不过无所谓了,他们忙,表示我们开发者轻松,对吧。

实战 Unity3d 导出 Windows 10 UAP(WAS)》上有2条评论

  1. 楼主你好,我是基于Unity开发Hololens的开发者,在Unity导出WSA应用包进行上级时,遇到如下两个问题:

    第一个:
    Windows 安全功能测试
    失败
    二进制分析器
    发现错误: 二进制分析器测试检测到以下错误:
    文件 c:\program files\windowsapps\darseek.23700f915cd1e_1.1.6.0_x86__vmwz28c2tj92a\AudioPluginMsHRTF.dll 未通过 AppContainerCheck 检查。
    未修复时会产生影响: 如果应用未使用可用的 Windows 保护,则它可能会增加客户计算机遭遇恶意软件的漏洞。
    如何修复: 在链接应用时应用所需链接器选项 – SAFESEH、DYNAMICBASE、NXCOMPAT 和 APPCONTAINER。

    第二个:
    支持的 API
    发现错误: 支持的 API 测试检测到以下错误:
    此应用程序类型不支持 d3d12.dll 中的 API D3D12GetDebugInterface。UnityPlayer.dll 调用此 API。
    未修复时会产生影响: 使用不在用于 Windows 应用商店应用的 Windows SDK 中的 API 与 Windows 应用商店认证要求冲突。
    如何修复: 查看错误消息以确定不属于适用于 Windows 应用商店应用的 Windows SDK 的 API。请注意,在调试配置中生成的应用或未根据需要启用 .NET Native 的应用可能无法通过此测试,因为这些环境可能拉入不支持的 API。请使用发布配置重新测试你的应用,并根据需要启用 .NET Native。

    请问一下如何解决?希望楼主借有空闲时间给予指点,谢谢!
    (个人QQ:602121896)

    • 非常抱歉,这块我就真的不专业了,你可以用google搜索一下,用英文,或者去微软的开发者论坛上问问,他们有专业人士回复,地址:https://social.msdn.microsoft.com/Forums/windowsapps/zh-cn/home

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.