天天看點

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裡,可以幫你快速找出問題所在。

寫了這些,其實知道都是很笨的法子,如果水準高,完全不用這麼麻煩浪費這麼多時間。。

繼續閱讀