为什么unity 安装完模块还是找不到sdk_Unity填坑笔记(四)——移植UWP平台
0. 絮絮念
本來不想寫這篇文章,一來做完這一波之后我再也不想做WSA平臺……二來我覺得會做這個平臺的人并不多,所以寫下來意義也不大。不過在移植過程中ToLua的作者蒙哥給了我不少幫助,也說斷斷續續有人問他移植WSA平臺的問題,我如果搞完了最好分享一下經驗,再加上我擔心“真香”定律之后在我身上應驗,所以還是做一些記錄的好。
但因為公司對于uwp平臺也沒有寄予特別高的期望,不計劃投入特別多的時間精力,因此很多做法是短平快糙猛,怎么快怎么來。所以這里分享的一些做法是在短時間內為了解決問題而選取或查找到的解決方案,未必適合所有團隊,還請讀者自己斟酌取舍。
1. 移植目標
Windows 10 introduces the Universal Windows Platform (UWP), which provides a common app platform on every device that runs Windows 10.UWP平臺是微軟提出的一個挺偉大的構想,希望統一自己的各個設備上的開發工作。我覺得愿景挺好的,只是推廣力度和結果不太令人滿意,Windows Store上的App質量與數量都和iOS平臺差距非常大,有興趣的朋友可以去看看。
微軟構想下的Universal Apps但蚊子腿也是肉,有用戶就有需求,在一個合作伙伴的建議下,我們嘗試把手游項目移植到這個平臺。在最初做了基本的調研和評估之后,我還比較樂觀,覺得大約1人月的工作量應該可以搞定,只能說結果證明了我的幼稚,整個移植和踩坑的過程花了大約2人月左右的時間,現在還在做一些收尾的工作。
2. Unity打包配置注意事項
在打包過程中有一些需要注意的配置,這里列舉下:
1.將Build Platform切換到 Windows Store Apps。UWP平臺在Unity上叫做Windows Store Apps,貌似從5.x版本開始已經支持,我們用的是5.6.6f2版本。
最早以為合作方要的是windows版本,導致先搞了2天windows版本,所以還是先問清楚具體需求。另外也有朋友直接用微軟提供的win32轉UWP的工具來制作,但是貌似只能在Windows上跑,surface上并不支持。2. Player Settings里使用IL2CPP、.Net 4.6的配置,否則工程會有很多接口不存在導致報錯。(這個組合是我自己嘗試出來的,也如果可以使用Mono的話更好,后續比如瀏覽器等插件很多都只支持Mono,不過Mono我沒搞定,只能用這個打包方式……)
3. 先安裝VS需要的組件,主要是通用Winidows平臺開發,其中包含Windows 10 SDK。如果不安裝組件直接Build的話,找不到Local Machine等運行方式,也會一直有編譯錯誤。
4. 注意在Build頁面選擇好對應的配置,我使用的是如下的配置方式(注意,如果遇到了“Cannot resolve Assembly or Windows Metadata file 'Windows.Foundation.UniversalApiContract.winmd'”這樣的錯誤提示,可能會是UWP SDK版本選擇有問題。):
5. 需要的DLL要配置好WSAPlayer平臺,否則不會放置到生成的VS工程里。
6. Graphics APIs選擇DX11,我忘記為什么要這么做了,可能是有材質編譯錯誤之類的,如果遇到了可以考慮修改。
7. 打包好了之后不做修改編譯成uwp軟件的話是沒有任何權限的,需要點開項目里的Package.appxmanifest這個文件,點擊功能,把網絡權限勾上才能聯網。(這個坑了我好久,我一直以為是服務器沒有配置好……)也可以在Unity里的Player Settings里進行配置。
Unitty內的功能配置頁面Unity內的功能配置頁面8. Windows 10 SDK最好安裝在C盤,有同事因為空間原因放在別的盤符了,提示“Could not find SDK "WindowsMobile, Version=10.0.xxxx.”,也許可以在某些地方配置,這個沒繼續排查。
9. 在windows設置里開啟開發人員模式,確保目標設備已啟用了開發人員模式,否則會報錯。
3. ToLua的UWP平臺編譯
本來是直接使用了與Windows平臺相同的ToLua.dll,在PC和Surface設備上運行都沒有問題,以為就可以這樣風平浪靜地過去了。但是在提交審核的時候因為“支持的API測試”一項有問題而無法通過Windows Store的自動審核,最終還是選擇自己編譯一個uwp版本的dll,中間解決各種問題也花費了一周左右的時間,記錄一下如下:
2. windows版本的Tolua.dll在提交審核的時候,“支持的API測試”項會提示如下圖所示的失敗結果。這里要重新使用通用windows的dll格式的工程重新編譯一個版本。
3. 建立通用windows的ToLua Dll工程:
4. 使用luavm而非luajit。最初我查看了下ToLua和SLua的工程,都沒有提供uwp的編譯方式,而XLua提供了一個版本,使用的是Lua 5.3。因為luajit在編譯時會有一些代碼生成,這塊實在不熟悉,因此選擇了看上去可行的Luavm來進行ToLua的構建。將需要的相關代碼引入VS工程中,其中luavm代碼放置在lua下。
5. 配置附加包含目錄,這里暴力地使用絕對路徑……
6. 配置Lua的幾個預定義宏:
7. 修復微軟認為不安全的相關代碼,Lua 5.1比Luajit要少很多了,主要包括:
- strerror --> strerror_s
- fopen --> fopen_s
- freopen --> freopen_s
- 不支持pclose和popen操作,上層邏輯不需要,直接內部處理掉;
- tmpfile --> tmpfile_s
- fscanf --> fscanf_s
- sprintf --> sprintf_s
- strncpy --> strncpy_s
- strcpy --> strcpy_s
- strcat --> strcat_s
- strncat --> strncat_s
- gmtime --> gmtime_s
- localtime --> localtime_s
- tmpnam --> tmpnam_s
這里主要是相關函數的替換,修改為安全的版本,花費一些時間但是并不困難。這里要開啟SDL檢查才會報出相應的錯誤,通過關閉SDL檢查或者添加_CRT_INSECURE_DEPRECATE宏是可以在編譯器不顯示這些錯誤,但是提交Windows Store審核時會提示不允許使用這些接口。
8. release版本的優化開啟會導致Lua中所有的false被認為是true。這個坑是在ToLua.dll編譯的后期遇到的一個奇怪的現象,當時是發現debug的版本跑通了流程,但是release的版本界面無法關閉,排查發現代碼中的所有false都當作了true來處理,逐項對比編譯差異才發現是優化的選項導致的,最初使用關閉優化的方式來解決,后來蒙哥也提供了解決思路:
對于return bool 的函數都標記為 [return: MarshalAs(UnmanagedType.I1)]:[DllImport("ToLua.dll", CallingConvention = CallingConvention.Cdecl)][return: MarshalAs(UnmanagedType.I1)] //這里指定return bool 類型
public static extern bool Lua_xxxx();
簡單測試可行,另外蒙哥也說可以嘗試把Lua的C代碼中的所有的bool換成BOOL來處理,這種方式可能更穩妥,但是修改代價稍微大一些,因此沒有測試過。
9. 關注下Luajit和Luavm的區別。一方面是比如bit庫是有差異的,另外一方面是對于...參數的處理。比如我們提供了一個tryCall函數來封裝pcall,并在遇到Traceback的時候上報給錯誤收集服務器。
local最初的版本已經踩了這個坑,當時在MacOS平臺上使用luavm,如果使用xpcall,則...的可變參數傳遞會丟失,因此在uwp平臺上也使用和MacOS平臺相似的處理。
10. 如果要調試ToLua.dll中的代碼的話,我使用的是?Attach到進程的方式。首先要在調試配置里選擇dll為可調式程序集:
然后可以在編譯的后處理里把dll和pdb拷貝到目標工程的運行目錄(或者每次自己手動拷貝),接著Ctrl+F5運行游戲(不要調試,因為無法掛接兩個調試器),然后在ToLua的工程里附加到進程:
這樣就可以斷點調試了。如果出了錯誤,在游戲功能Debug的時候也可以看到Dll的堆棧,所以也許有不需要附加到進程的方式,暫時沒有去搞這塊,知道的朋友也歡迎提供信息。
4. 結語
零零散散記錄一些遇到的問題和解決方式,在處理中也解決了不少游戲內的問題,但是和平臺移植關系性不大,就不在此記錄了。
總之,希望這些零散的記錄可以幫要做uwp移植的朋友繞過一些坑,節省一些開發時間,有問題也歡迎交流。對于uwp版本的tolua.dll的編譯工程,我會做一些整理嘗試merge到github上,目前需要的朋友可以暫時按照文章里已經列舉的流程來做。
總結
以上是生活随笔為你收集整理的为什么unity 安装完模块还是找不到sdk_Unity填坑笔记(四)——移植UWP平台的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle11g sp 1503,Or
- 下一篇: 程序员的数学_数学公式太晦涩,不如用代码