1. .Net 2.0 Subset

顾名思义,.Net 2.0 Subset 是 .Net 的一个子集。Unity 在导出Windows8 & WindowsPhone平台的时候会默认将API Level设置成.Net2.0 Subset 来减小程序包的体积,并减少应用程序启动时间。


但是一般情况下,这个Subset是不够用的。如果你想要把一个PC端或者网页端的一个游戏导出到WindowsPhone平台,你会在编译的时候吃到大量的错误。所以这一项一定要设置为“None”。

但是即便如此,情况依然不容乐观。因为我们即使获得了完整的.Net2.0,还是要为.Net4.5以及2.0之间坑爹的兼容性付出代价。所以在写代码之前,最好查一下MSDN,了解一下哪些API是已经被遗弃了的,以避免在Unity内部一帆风顺但是导出到手机上出各种诡异的毛病。

另外,其实WindowsPhone与Winodws8都用的不是百分之百完整的.Net,这两个平台的.Net版本都面向平台自身做了一些“优化”(姑且说是优化吧。我想起来一个桥段,在美帝的阿波罗13号事故中,登月舱和指令舱居然不能共用一个空气净化器,因为一个接口是方的,一个接口是圆的。扯远了呵呵)。他们虽然是.Net4.5的子集,但是实现了两套完全不同的API。举例来说吧:如果你想上APP Store,那么,WindowsPhone自带的计费API带有应用内付费(IAP)的功能,但是Windows8没有。如果你的游戏需要打开屏幕键盘,那么好吧,Windows8不允许这么做,但是WindowsPhone可以。如果你觉得只面向Windows8或者WindowsPhone二者其一就可以避免兼容性问题,那么你错了。Windows8有8.0和8.1两个版本。这两个版本的某些API是完全不兼容的。比如还是游戏开发者最关心的IAP问题,同样的功能,实现方法确不尽相同。具体我就不细说了,我现在已经放弃使用微软内置的付费渠道来进行计费。感兴趣的请到MSDN去找代码范例。

前车之鉴,至少以下.NET API万万不可用,如果真的需要,那么自己实现或者用别的代替:


String.Format
IClone
XmlElement,XmlNode
HashTable
ArrayList
WWW.threadPriority
Type.IsAssignableFrom
BindingFlags
StreamReader
File


2. 导出工程类型


这一部分主要是关于Windows8平台。WindowsPhone的工程类型相当于下面要介绍的XAML C# SOLUTION


如了个图,这里是Windows8输出的四种主要的工程类型。不管哪一种工程,Unity官方都给出了详细的导出文档,这一点感兴趣可以自己去找。我这里主要讲需要填坑的部分,也就是不好解决的部分。好解决的问题都不是问题。

我要说的是,如果你的游戏要上Windows8平台,并且带有文字输入框,那么你一定要使用最后一种方式进行导出,也就是XAML C# SOLUTION。

这是为什么呢?

因为Windows8的API不让你弹出虚拟键盘!在Windows8平台,除非你使用微软提供的文字输入控件,否则不会让你主动弹出键盘并且不会给你任何方法让你获取到虚拟键盘上输入的文字。如果你想在NGUI输入框中输入点文字,不好意思,没门!这一部分我会着重介绍,因为我当时处理这个问题的时候搜索遍国内外大量的技术文章都没有说这个问题。而且我发现Windows8平台的3d游戏几乎都没有输入框。。。。。。

另外就是版本号,8.0和8.1.除了API会有不兼容的现象以外,还会有一个更坑爹的问题:屏幕坐标算法不一样!也就是说,如果你用8.0的API生成了一个程序,放到了8.1系统上,那么会有一定的几率出现图像缩放异常的情况。但是如果你用8.1的API生成应用程序,那么根本就没有办法在使用了WindowsRT或8.0的电脑上运行。我的看法是,两个版本要分别生成。微软给提供了这样的功能:你可以再APP Store上上传两个文件包,他们会根据用户的机器提供正确的应用程序包以供下载。