手遊快速測試:Unity5和WebGL移植指南

【Gamelook專稿,轉載請註明出處】

Gamelook報道/對於手遊開發者來說,更新版本往往意味着非常複雜的過程,你需要根據反饋做更新、測試、提交然後等待審覈,而由於不需要客戶端依賴,頁遊往往是快速測試遊戲版本的最佳途徑,很多人可能都知道Unity 5可以再不用Unity Web Player的情況下把手遊移植到頁遊平臺測試,再加上谷歌決定放棄對NPAPI的支持,未來WebGL對於頁遊移植是非常重要的。最近,海外開發者Leandro Gonzalez在博客中提供了詳細的移植指南:

很多人長期以來都用Unity研發手遊,那麼你們可能都聽說過使用過Unity 5可以在不使用Unity Web Player的情況下把遊戲移植成頁遊。聽起來很不錯對嗎?但是,在使用WebGL做你的頁遊之前,有一些事情是有必要知道的,接下來我們就逐個回答以下的幾個問題:

1.WebGL對於遊戲研發如此重要?

對於新手開發者來說,網頁遊戲是一個擁有固定玩家數量的強大平臺,在寫本稿件的時候,WebGL可以在所有帶有現代瀏覽器的桌面平臺不用安裝任何額外插件就能讓你的遊戲運行。

但除此之外,做頁遊版本最重要的優勢在於,你可以控制遊戲的分銷。別想着把你的版本送去審覈或者通過後臺上傳並等待幾個小時測試,網頁技術需要的只是讓你通過FTP上傳文件並且能夠實時看到遊戲的改變。

11

這對於快速調整遊戲並且測試最新版本來說是很大的優勢,還有一點值得提到的是,Google Chrome最近放棄了對(Flash Player)NPAPI的支持,意味着用Unity Web Player之類插件研發的遊戲可能都不會在網頁遊戲平臺留存太久,未來其他的瀏覽器也很可能做出這種決定,所以作爲開發者最好是早作準備。

但是,介紹就到此結束,我們不妨探討更有趣的話題。和所有的平臺一樣,當你用Unity 5爲WebGL做遊戲的時候,還是需要考慮一些事情。

以下是我們的首款遊戲從安卓/iOS平臺移植到Facebook Unity文檔的時候遇到的問題:

重要的事情先說:不支持的命名空間(Unsupported Namespaces)

所有在System.Net(特別是System.Net.Socket)命名空間下的東西都無法在WebGL中使用。據Unity文檔,這種原因是:由於安全問題,JavaScript代碼無法直接通過IP Sockets進行網絡連接。

如果你需要在WebGL裏使用網絡,目前可以選擇使用WWW或者Unity引擎裏的UnityWebRequest classes,或者使用新的Unity Networking功能。這可能會因爲CORS(也就是跨域資源共享)而帶來一些讓人頭疼的問題,因爲這基本上意味着只要沒有和你的遊戲的服務器在同一個域名內,就沒辦法登上其他的URL。這或許是你在把遊戲移植到WebGL的時候遇到最大的問題

如果你想要知道的話:同樣的問題也適用於UnityEngine.Network classes,也不能在WebGL裏使用。

我們需要澄清的是,這並非Unity的錯,畢竟網頁平臺本來就不是這麼工作的。WebGL是一個AOT(ahead of time)平臺,所以是不允許使用System.Reflection.Emit生成動態代碼的。基本來說,System.Threading命名空間裏的所有東西都是不被支持的。

目前我們已經解決了不支持命名空間的問題,對我們來說,解決這個問題的方法就是使用Visual Studio 2015的搜索工具在我們文件的的Entire Solutions,隨後我們會直接給!UNITY_WEBGL增加一個預處理器,並且找到解決所有在命名空間衝突而被移除的時候解決所有錯誤。

比如:

#if !UNITY_WEBGL
using System.Threading;
#endif

第二:資源包

在WebGL平臺使用AssetBundles的時候需要考慮以下這些問題:

當你要在AssetBundle裏使用主版本沒有用過的class類型的時候,這可能會讓Unity直接把這些代碼從版本中移除,所以從AssetBundle里加載資源的時候就會失敗,你可以在這裏找到英文版的解決辦法。

由於WebGL並不支持Threading,而且http下載只有在完成的時候才能使用,當下載完成的時候,Unity WebGL版本需要在主線程上解壓縮AssetBundle,所以要屏蔽主線程。爲了避免這種問題,你可能想要避免爲你的AssetBundle使用默認的LZMA格式,轉而使用LZ4進行壓縮,該工具解壓縮的效率比較高。如果你需要比LZ4更小的壓縮尺寸,可以把網頁服務器設置成在http協議層面用gzip壓縮文件。

第三:Building與測試

這或許是使用WebGL最糟糕的一部分,還不清楚每個設置對於最終版本的影響,也無法確定如何對遊戲進行測試和debug,你可以通過這裏的鏈接(英文)找到答案(拿好不謝)。

在大多數的瀏覽器裏,你都可以通過直接打開index.html文件的方式瀏覽WebGL播放器。出於安全考慮,Chrome對於從本地文件://URLs打開的腳本都設了限制,所以該技術也是不能使用的。如果你使用Unity的Build&Run指令(menu:File>Build & Run),隨後文件會被暫時放在本地網頁服務器上,並且從localhost URL打開(這樣可以避開安全限制)。你還可以運行Chrome並且執行—disable-web-security命令選擇允許從file:urls加載內容。
在我們的案例中,我們創作了一個簡單的*.bat腳本並且只用了下面這一行代碼(如果你的Chrome安裝路徑不同可以做修改):

“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” –disable-web-security

至少在Windows系統下,你可以在桌面系統運行腳本並且雙擊打開一個允許CORS的Chrome窗口,我們發現這是隨時測試版本最簡單的方式並且在我們研發過程中使用了該方法,它甚至對於在服務器上的版本也可以運用。

building建議:

這些都是從Unity文檔裏引用的話,但我們標記了在最終版本大小和表現方面最有效的部分。

根據項目的不同,在Texture Importer裏給所有壓縮紋理定義Crunch紋理壓縮格式;不要調用Development版本,它們是未經壓縮或者最小化的,所以它們的文件會大很多;把優化等級(Optimization Level)設置成最快;如果你的版本不需要例外情況的話,在玩家設置中把Enable Exceptions(允許例外)設置成None;在玩家設置中把Strip Engine Code設置爲啓用(對於版本大小很重要);當使用第三方dll的時候要小心謹慎,因爲者可能會帶來大量的dependency並且明顯增加代碼大小(對我們沒有什麼影響),需要補充的是,如果你的代碼需要取決於Exceptions才能正常執行,把例外設置成none就可能帶來不少的問題,不如調用服務器,你必須親自測試並且找到適合你遊戲的最佳方法。

Profiling WebGL

你可以在WebGL裏使用Unity profiler,就像和其他平臺一樣。不過一個重要的區別之處在於,WebGL裏你不能鏈接運行的播放器,因爲WebGL使用WEbSockets作爲通信方式,所以不會允許來自瀏覽器方面的鏈接。相反,你應該在版本設置裏使用Autoconnect profile複選框,還需要注意的是,目前draw call還不能爲WebGL做profile。

Debugging WebGL

這方面就祝你好運了。目前WebGL版本還沒辦法做debug,我們在做的時候採取了舊式的方法,並且爲所有遇到問題的地方增加了Debug.log calls,每個瀏覽器都有自己的開發者後臺,通常按F12就可以開啓。

瀏覽器兼容性

你可以在這裏看到所有瀏覽器和版本的最新消息。

也就是說,最好是考慮一些不兼容WebGL的老瀏覽器,比如IE,這時候最好使用Unity Web Player並且加載一個或者根據瀏覽器的支持程度選擇另外一個。

另一方面,Google Chrome完全放棄了Unity Web Player支持,所以唯一的選擇就是爲IE之外的所有瀏覽器使用WebGL。需要註明的是,這種方式非常適合Edge瀏覽器,據我的體驗,Chrome瀏覽器用起來還行,火狐瀏覽器是使用WebGL效果最差的。

內存問題

這是另一個大問題,如果你分配了太多的內存,瀏覽器就會出問題,但如果你分配的內存不足,它又會直接崩潰,所以基本上來說,找到合適的內存分配量是靠實踐的,但與此同時我們還不能在run-time期間導致崩潰。

在啓動的時候,有兩種方式可以改變遊戲內存:第一種方法是使用Unity編輯器裏的玩家設定。在WebGL設定中,選擇發行設定並且輸入內存大小,默認是256MB,在我們的案例中,這對於發佈版本已經足夠了(90MB),但對於開發版本來說還不夠用(大約需要300MB左右)。

這時候火狐對我們來說就是最難用的,所有其他的瀏覽器都可以在研發版本中爲研發版分配512MB的內存。當然,也並不是那麼差,不過如果你的遊戲比我們的還大,那麼很可能你的發佈版本都沒辦法運行。我們目前在這方面還在研究,如果有新發行會更新文章。

更新:據有人在Reddit評論中提到,這是因爲火狐在其他標籤中已經使用了太多的內存,而不是因爲它不能分配512MB的內存,關閉並重新開啓火狐瀏覽器就可以解決了。

第二種方式就是通過打開Unity生成的index.html文件內存大小的方式進行。代碼如下:

5

TOTAL_MEMORY的值來反映你的遊戲內存的需求(以字節爲單位),比如268435456意味着256MB。

第四,Facebook Canvas

如果你希望FB登錄像在iOS和安卓平臺的那樣,你就需要進入FB應用裏的高級設置,激活Web OAuth Login設置。然後你需要增加一個Valid OAuth更改URL(可以喝你的安全URL相同),否則Facebook不會允許你保存更改的。

6

Canvas.Pay:Bigfoot Games的小夥伴們專門發博客講述了這個問題,你們可以點擊查看

對於你希望銷售的產品,一定要投入特別的注意力確定*.html文件配置。

當你再次使用Unity的時候,需要記住的是自他們發佈了博客之後,FB sdk已經做了些許改動,結果中不會再出現一個response.txt field

參考Facebook更新指南:https://developers.facebook.com/docs/unity/upgrading-7.x

簡單總結一下:

現在Method callback已經輸入,而且有差異明顯的result classes。比如:FB.API將會返回一個IGraphResult,而FB.Canvas.Pay則會返回一個IPayResult。

在7.X SDK中,你將必須替換所有反response.txt串行序列化的代碼,然後進入status field,使用更簡單的方式:

response.ResultDictionary[“status”]

這是處理Buy按鈕點擊活動的method裏的C#代碼:

7

這份博客中還有些沒提到的是,你需要進入Facebook開發者便攜版的應用配置頁面,在Canvas Payments左邊菜單選項創造一個新的公司,遵循這些步驟,你很快就可以掌握。

有用的資源:

Unity文檔: http://docs.unity3d.com/Manual/webgl.html

Facebook文檔:https://developers.facebook.com/docs/unity/getting-started/canvas