天天看点

Unity项目移植WP8碰到的问题与解决方案。

移植前的准备

Unity

Unity只有4.3以上的Pro版本才可以选择Windows Phone平台,设置平台的方法为:File-->buildsettings中选择windows phone平台。

系统

操作系统要求为windows 8以上。

SDK

进行测试与打包需要windows phone sdk的支持。

IDE

visual studio 2012,2013.

虚拟机

如果需要用到wp8虚拟机来测试的话,Hyper-v服务需要开启,开启方法在 控制面板-->程序-->程序和功能-->启用或关闭windows功能,下拉可以看到Hyper-v服务,部分主板不支持的无法开启。

问题和注意事项

1. vs 2013找不到sdk在哪里?

sdk可以从官网获得,如果没有安装vs会自动安装vs express,安装过的会变成一个附加组件,官网是这么写的,但是实际过程中,因为sdk装的是2012,所以装有vs 2013的并不会出现在2013界面中,也在找不到项目模板,但是你可以找到vs express for phone 单独打开。我没有测试2012的情况,对于2013,在第一次安装的时候是可以选择安装windows phone sdk的,没有选择的事后装sdk会出现独立安装的结果。

所以解决方案就是重新打开vs 2013的安装程序,点击修改,然后将phone sdk那一项打上勾然后点确定。

2.虚拟机不能联网

可以删除该虚拟机然后vs 2013在使用虚拟机的时候会重新创建虚拟机,并询问是否连接网络。会造成连接不了网络的情况包括开了代理以及部分服务未打开,还有时会出现提示与宿主机ip地址重合的情况。

代理问题:点击右下角网络右键打开网络和共享中心,点击Internet选项->连接->局域网设置->取消所有勾,确定。

服务:一般不会出现这个问题,出现了就自己去系统服务项里手动启动,非常好找,全是hyper-v开头。

ip地址重叠:一般发生在无线网络下,有可能你禁用了一些虚拟网络适配器,在网络和共享中心里点击管理适配器,看是否有被禁用的。不行了就重新打开一次虚拟机就可以。

3.vmware与hyper-v的兼容问题。

有很多人吐槽hyper-v,但是hyper-v是win8自带的,如果启动hyper-v,vmware是启动不了的。我也不喜欢hyper-v,因为他没有3d加速,而我闲暇时喜欢测试一些带毒的破解补丁与登录器,登不了游戏很蛋疼。这个解决方案见我另一篇文章。

移植

很多项目并不是针对wp8编写的,在引用类的时候也不会过多考虑,但是对于wp8来说,一个不能忽视的问题就是.net版本的问题,wp8使用的是基于.net 4.5的精简版本,而unity editor是基于.net 2.0,所附带的mono是.net 3.5并且使用了一部分自有类,这造成了在editor里可以编译通过并能运行,但是在打包时却会失败的情况。这里说几个我遇到的例子,同时给出我的解决方案。

Doesn‘t exist in target framework

NGUI

http://www.tasharen.com/forum/index.php?topic=6625.msg31102#msg31102,目标框架不存在该方法可以说是最常见的因为plugin引起的问题。这个问题的解决方法是像帖子内建议的加上WP8标签。

LitJson

很多人使用这个库来解析Json数据,但是在标准Json库中引用的一些方法是不被wp8支持的,在litjson中,使用的IOrderedDictionary接口在wp8中不支持另外还有几处有些记不太清楚了。。

解决方法:下载源码并修改JsonData.cs,在其中加入IOrderedDictionary接口,记得继承。

<pre name="code" class="csharp">namespace LitJson
{
    public interface IOrderedDictionary : IDictionary, ICollection, IEnumerable
    {
        object this[int index] { get; set; }
        IDictionaryEnumerator GetEnumerator();
        void Insert(int index, object key, object value);
        void RemoveAt(int index);
    }

    public class JsonData : IJsonWrapper, IEquatable<JsonData>,IOrderedDictionary
           

SharpZipLib,SharpCompress。。

所有关于解压缩的dll我都试过了一遍,没有适用于wp8的,那怎么办呢?

接下来就说说如何解决dll不适配,不兼容。

1.最直接,最快速,也最容易失望的方法

要相信你遇到的问题别人肯定也遇到过,可以去github,codeplex搜索有没有人提供移动版的dll,这个搜索百度的帮助不大,因为不能破墙,但是这些dll都是来自国外,所以,大家自己解决吧。

成功了?先别急,打完包去游戏里看一下,如果没问题,恭喜你。

失败了很正常,就我的例子来讲,我前后找了不下10个,都是失败的,唯一一个成功的进入游戏也出现了解析错误。那这时候,你也许会遇到类似internal compiler error,failed to run reference rewriter以及failed to run serialization weaver,以及仍然不消失的Doesn‘t exist in target framework。

解决方案一:

下载源码。如果你成功安装了sdk,新建项目时,c#分支下应该有windows phone选项,点开,选择windows phone类库,将源代码(不包括properties和object以及reference,纯代码)复制到该项目中,重新编译。

这个方法成功率很高,原因是这些dll都是年代久远的古物。。很多已经在几年前停止更新了,而.net已经有了比较大的变化,但是这些dll还是在引用比较老旧的版本,重新编译会替换成新引用,同时unity也能识别了。

解决方案二:

如果还是不能成功,那就只能一个个改了,对着报错提示改吧,看着很长的列表其实一般都是引用不存在,解决掉一个引用问题就能清空一大片。把不支持的引用替换掉或者自己实现都是可以很快速的解决问题的。像有些只是引用接口的更简单。

在解决dll问题的过程中,非常有用的一个网址是:

http://msdn.microsoft.com/en-us/library/windows/apps/jj207211(v=vs.105).aspx

这里列出了wp8使用的.net API。如果发现Doesn‘t exist in target framework 就可以先来查询一下,因为有些方法并不是取消了,而是改变了参数类型。

然后一些基本问题如如何制作plugin,去官网自己看吧:

http://docs.unity3d.com/Manual/WP8.html

另外,编译完成后会生成pdb文件,这个也放到unity里,可以帮你快速找出问题所在。

写了这些,其实知道都是很笨的法子,如果水平高,完全不用这么麻烦浪费这么多时间。。

继续阅读