2014年8月31日 星期日

Unity4.6 Beta 版本功能說明

2014年8月20日,Unity在西雅圖舉辦Unity 全球開發者大會,Unity CEO David Helgason宣佈Unity 4.6 Beta版本正式開放下載。
下載網址(英文):http://unity3d.com/unity/beta/4.6

為了方便Unity開發者們瞭解Unity 4.6 Beta版本的資訊,本文分享版本功能:

新特性:
新的UI系統:基於UI框架的新元件和視覺化工具,能讓你輕鬆在遊戲和應用中構建遊戲UI介面,可創建透視或非透視的UI,支援圖片對齊、可以在空間中輕鬆地創建互動。

• 新的Layout系統支援邊、角對齊或與父物件中的自訂點對齊,還支援根據父物件的寬高按照百分比拉伸或全拉伸。二者結合讓用戶所見即所得控制調整UI。

•可基於圖片、文字或遮罩和效果等構建自訂的控制項。所有的圖形元件都完全支援自訂的材質和光線。

•內建按鈕、滑動條、滾動棒、輸入區域等等,為所有平台部署設置,完美支援觸控和滑鼠以及搖桿、手柄。

•UI系統中整合了Unity的動畫系統(Mecanim System)。可以使用狀態機或者原本的動畫功能來控制你的UI。

•UI系統可擴展,可以組裝或擴展現有的控制項屬性,或創建全新的控制項。

•透過Inspector面板中的委託系統(persistent delegate system),你可以很輕易的設定UI的事件回傳。不需要寫任何程式就可以掛載很多功能到你的UI上。

新的編輯工具(Rect tool):在以前的版本中,只在2D模式下使用編輯工具,而且只能用於SpriteRenderers。新的UI編輯工具是一個2D和3D混合的工具,更方便設計你的UI。可用於圖片、UI、或其它物件。編輯工具被重新設計讓它有更廣泛的用途。
•Rect handles不但支援Pivot/Center模式,同時也支援Local/Global模式。
•當使用編輯模式時按下shift鍵,縮放(按住Control/Command拖曳大小時)不再是面積縮放而是體積縮放。
•在場景中,編輯模式下圖片中間的小圓盤可以用來在平面內移動物體。當縮放的時候小圓盤會淡入淡出。

可擴展的事件消息系統(Event Messaging system):使用或擴展新的事件系統框架。該系統用於發送和接收新的使用者介面的事件,但你可以擴展它支持自訂的輸入裝置或者自訂的事件邏輯。
•支援觸控和PC平臺。
•支援2D、3D和UI元件
•可擴展性:增加自訂輸入裝置和自訂事件。

事件委託(Unity事件):一種新的方式去綁定回傳函數。代表沒有程式經驗的人透過編輯器可以更快更有效的增加功能。

改進:

核心部分:
•增加了GetComponents<List<T>> ,透過該方法可獲取List<T>的元件清單。同樣增加了該方法的非泛型版本。
•增加StopCoroutine(Coroutine)方法
•MonoBehaviour中增加OnTransformParentChanged回傳方法。當transform或者父物體的transform更改後觸發。
•Transform中增加SetParent方法,使用該方法可以在不改變本地位置、角度、縮放的情況下,設置父級的transform。對於RectTransform同樣不改變sizeDelta。
•實現並開放了Transform.TransformVector與Transform.InverseTransformVector,從而在使用縮放變換向量的時候不再需要使用localToWorldMatrix與WorldToLocalMatrix。
•增加Vector2.SmoothDamp,行為與Vector3.SmoothDamp, Mathf.SmoothDamp等保持一致。
•增加新API TouchScreenKeyboard.isSupported用於檢查平台是否支援螢幕鍵盤。

編輯器:
•根據3D、2D、光源等重新分類GameObject子功能表項,當然功能性也提高了。在hierarchy的下拉面板中增加了“Create Empty”,hierarchy的內容功能表支援直接新建子物體。
•已經加入的元件與新加元件因不相容產生的失敗會有更詳細的錯誤資訊。
•在播放模式下,當hierarchy視窗需要太長時間來獲取新資料時,警告圖示會提醒使用者畫面播放速率因為層級排序受到了影響。
•使用固定比例的乘法來配置鏡頭的遠近,而不是使用向量的範圍。新的範圍在遠近切換上會有一個比較好的轉換,降低閃面的問題。
•使用CameraEditor指定主遊戲視角,並且可以使用Canvas做最後的檢查。
Mecanim
•允許在動畫視窗中使用PPtr類型的動畫(貼圖、圖片、材質等)
•SendTransformChanged 只可以發送到有動畫的transforms。沒有動畫的不會接收到SendTransformChanged。
•只有SendTransformChanged可以有效的更改RectTransform。


更改:
·2D的Sprite Packer預設打開了
·編輯工具預設快速鍵是T。Sprite Editor預設快速鍵改為SHIFT+T。
·編輯工具預設非同步縮放,按下SHIFT是一致縮放。
·新增腳本預設語言更改為C#。
在Unity Free版本中Stencil緩衝已可使用。

更多資訊請參考:
http://unity3d.com/unity/beta/4.6/release-notes

2014年8月22日 星期五

Unity發佈組件原始碼,搭建全球開源社群


作者:Na'Tosha Bard
原文連結:http://blogs.unity3d.com/2014/08/20/more-open-source-initiatives-from-unity/

Unity 作為一款世界級的遊戲開發引擎,在越來越依賴網路的市場大環境下,Unity 不僅僅用於遊戲開發和應用,也有像是建築地產、醫療、虛擬實境、AR、導覽等方面的應用。為了給開發者更好的使用者體驗,Unity決定實行部分組件開放原始碼的政策,同時也鼓勵和希望更多的開發者能夠加入Unity 全球開源社群,協助Unity創意開發!

我們希望透過開放Unity 元件原始碼(或Unity 相關工具源碼)幫助開發者以下目標
1. 給予你常用的元件原始碼可以降低風險
2. 給予你自訂工具的權利,進而增加組件的靈活性和適用性
3. 開發者能用前所未有的方式來擴展Unity。

以下就開源共用的內容,做詳細解答
1. 哪些原始程式碼將開放?原始程式碼公佈計畫是怎麼樣的?

第一階段:我們開放的第一個項目就是最近才更新的UnityTest Tool。我們把原始碼放在Bitbucket的中供大家下載並修改成為自己的。同時也非常歡迎開發者通過Pull Requests分享他們的版本。



Bitbucket 資料庫:https://bitbucket.org/Unity-Technologies
使用者指南:http://docs.unity3d.com/Manual/ContributingToUnity.html

第二階段:下一個計畫開源的部分是大家期待已久的新UI系統。我們相信一旦取得原始碼您將做些很棒的事情!

第三階段:目前在醞釀籌備階段。這些元件(比如新UI系統)將會從Unity中獨立出來,讓用戶可以修改,用戶自己修改的版本可以與官方發佈的Unity一起使用。

2. 發佈的開原始碼授權標準?
我們使用MIT/X11 作為我們的許可標準。我們不希望通過許可來限制使用原始碼,以免增加開發者的負擔。


因為我們基於MIT/ X11許可下發佈我們的原始碼,我們也希望能從社區中獲得大家基於MIT/ X11許可下所做出的貢獻。

3. 是否需要Unity Pro許可權,才能獲得原始程式碼?
不需要!只要是使用Unity正版軟體的開發者我們都給予免費的提供。

Unity 的開源歷史
Unity 一直致力於開源技術的相關研究和發展。我們的腳本引擎基於Mono,並作為Mono在GitHub 上的分支保持公開,同樣開源的還有我們的渲染交叉編譯工具(hlsl2glslfork和GLSL優化器)。

我們內部還使用了大量的開源工具:我們在BitBucket 上的構建/測試自動化伺服器,對Mercurial 做的自訂擴展以及我們使用的版本控制系統。

同時,Unity 也獲得了來自全球的諸多開發者參與到我們的開源計畫項目中,具體可參閱:http://selenic.com/hg/search/?rev=unity3d.com&revcount=500

Unity 開啟全球開源共用社區新紀元
Unity 以開發大眾化為發展宗旨,立足於全球戰略眼光,海納百川,彙聚群賢,這次開啟全球開源共用社區的計畫,希望能夠催生更多便捷易用的元件工具和技術,激發源源不斷的動力和創新力,共同引領開發事業積極向上的發展。期待你的加入



2014年8月14日 星期四

開發者建設和維護的價值

開發者建設和維護的價值
作者:Brett Bibby
原文連結:http://blogs.unity3d.com/2014/08/14/building-and-maintaining-value-for-developers/

不敢相信,再過一周就是Unite開發者大會了!我們很期待可以和你們交流,而且我們今年會有比以往更多的工程師協助解決你們的問題,我們準備在Unite發表很多新的消息,也會發表一些很有價值的計劃,但我想先分享幾件事情給各位
在過去的十年裏,Unity從一個默默無名的開發工具蛻變成為最受歡迎的遊戲開發平台,現在Unity有來自超過100個國家的使用者,每個月高達上百萬的使用時數,真的很驚人!
我們能走到這一步都是因為我們傾聽社群的聲音,我們也會持續這麼做

社群裏一直希望我們可以提升我們的渲染品質,我們已經努力在達成這個指標,早些時候我們也展示過Unity 5如脫繮野馬般的高品質並支援全平台的能力,這將會賦予開發者們用新且有趣的方式把你的創意帶入生活裡


我們也理解各位對引擎品質的要求,維護工程師甚至提出希望可以每週都有更新可以下載的方案,我們不斷的除錯,積極的讓流程更快個有效率,我們不會就此止步,並且還會有幾項針對降低風險並提高開發靈活度的措施會在下個月發表,敬請期待!

我們也很清楚一旦你完成了遊戲後,就會需要導入喜歡你遊戲的玩家,這就是為什麼我們正努力整合我們所收購的服務公司,像是Unity Ads和Everyplay可以幫助你找到適合的玩家玩你的遊戲,並且讓他們持續的留在你的遊戲裡,這可以提升你產品成功的機會

Unity 5 的 WebGL
Unity一直,也會持續的協助開發者在任何平台上找到他們的客群,我們聽說許多人對於WebGL很有興趣,但一直不確定市場方向是否值得投入,所以我們決定讓WebGL以免費插件的形式,可以在Unity 5 免費版與付費版本發佈WebGL,你將更輕易做出不需要下載任何插件的遊戲,進而提升WebGL的普及率

再加上 Windows, Mac, Linux, Web Player, iOS, Android, BlackBerry 10, Windows Phone 8, Windows Runtime, Wii U, Xbox One 和 PlayStation Mobile for Vita等13個免費發佈平台的量,找不到這麼多免費又直接的支援了



價值和價格

在過去的幾個月裡,我們一直在論壇裡面參與討論關於我們的價值主張是否是時候該做個調整了,我們花了幾個月的時間和世界各地的開發者們交換意見,絕大多數的開發者都認為我們提供的產品超乎價值,但事實上,也有許多人特別關心引擎工具之間的相互競爭讓他們不知道應該要投入誰的懷抱,我們也收到許多人對於版權授權模式(royalty-based)的強烈建議,這麼多年來我們一直把賺來的錢再投入我們的產品裡,我相信你們也可以把錢用在正確的地方
雖然我們認為目前訂定的商業模式和軟體售價是為了確保我們可以有能力繼續維護讓開發者可以順利輕鬆地開發遊戲,但凡事不可能永遠,未來我們也許會重新審視我們的商業模式和軟體定價

我們期待與您在Unite見面,如果你無法前來,你也可以透過視訊串流參與我們的keynote,時間將會在8月21號凌晨1點

2014年8月13日 星期三

XBox One的Unity發佈套件來了!

Unity for Xbox One is here!
作者:Scott Flynn


Unity很高興的宣布我們發佈了Preview版本的Unity Xbox One發佈套件,Unity和微軟已經達成協議,這個套件將會是免費提供給所有註冊ID@Xbox的開發人員。


所以要怎樣取得這個套件呢?

任何擁有Xbox One development kit 的用戶都可以免費獲取Unity for Xbox One發佈套件,更多關於Xbox One註冊獨立開發者的資訊請先到www.xbox.com/id 上,註冊成為Xbox one開發者。

一旦您有了開發工具,將會有一位微軟的窗口與您聯繫,協助您設定軟體和工具的存取權限,同時也會收到免費的Unity for Xbox One發佈套件。對於Unity Pro用戶, Xbox One支援將會被加到你已有的授權中。對於Unity Free用戶會提供一份受限的Xbox One授權。

Xbox One特性以及外掛程式

Xbox One新特性以及API列表是很多的,我們將主要的核心功能直接整合在Unity中,將大多數平台相關功能作為外掛程式提供給開發者,也包含原始碼。我們相信這是最好的方式,它可以讓你擴展這些系統來符合您開發的需求。

編寫原生外掛程式並管理封裝資料總是很困難,還好Xbox One提供了高階非同步API,官版的外掛程式使開發人員很容易把Microsoft API和Unity整合一起,例如提供類似Event Queue的功能更好的呼叫Unity.

我現在就可以用Unity for Xbox One發佈遊戲嗎?

當然!現在有一些遊戲準備發佈到Xbox One,下面將介紹一些相關的遊戲項目:
由Asteroid Base 開發的 Lovers in a Dangerous Spacetime

Lovers in a Dangerous Spacetime是由Asteroid Base公司開發的一款單人或雙人的動作遊戲,支援PC與MAC。遊戲中玩家要在一個不斷產生星球的星系中保護一艘螢光粉紅飛船。這個非常考驗玩家團隊協作能力哦。

Moon Studios 開發的 Ori and the Blind Forest

Moon Studios正努力給他們的"故事驅動"的"開放世界"中每一個場景獨特豐富的手繪感覺。這款備受期待的遊戲將玩家的探索與動人的情感故事很完美的融合在一起。



No Goblin開發的 Roundabout

在Roundabout的世界中,玩家駕馭著一輛滿載乘客的豪華大巴士在不同場景中變換。這款遊戲是1970年由傳奇司機Georgio Manos為背景一款半開放世界、半益智遊戲、所有都是扭曲的故事。





Studio MDHR 開發的 Cuphead

Cuphead是一款有1930年代畫風的手繪卡通風格遊戲,這款打Boss動作遊戲的開發團隊只有5個開發人員。




用戶體驗回饋
下面是3 Sprockets公司的測試者Seon Rozenblum關於將項目移植到Xbox one的感想

“我們花不到四小時的時間從沒有任何Xbox開發套件的把一款遊戲移植到PC,並可以順利的在Xbox One上面玩Fight The Dragon。

這是一個令人難以置信的結果,因為Unity for Xbox One開發團隊提供的Unity介面和特性的完美串接讓我們可以非常迅速且有效的控制一切。
4天之後,我們100%移植了Steam上的功能到Xbox One上! 這真太讓我們高興了!"

下一步是什麼?

我們還有很多工作要做,我們正在不斷的改進Unity for Xbox One,優化你們的開發體驗。我們會繼續封裝更多Xbox One的功能並使之更加成熟。

需要說明的是
目前發佈的Unity for Xbox One版都是相容於Unity 4.3版本。

由於一些原因,Unity4.5版本將不會支援Xbox One ,而是會直接跳到Unity5.0版本,Unity 5.0將會是我們對於Xbox One開發者建議的版本。當然我們會繼續更新Unity 4.3版包括XDK更新,直到2015年,這樣可以確保使用該版本開發的產品可以繼續正常發佈。

我們非常期待看到您使用Unity開發次世代遊戲,給玩家帶來更多更好的體驗。

2014年8月11日 星期一

淺談Unity收購Everyplay對開發者的意義

淺談Unity收購Everyplay對開發者的意義
作者:Oscar Clark

作為一名已經開發過線上遊戲、手機遊戲和家機遊戲工作多年的老兵我早已適應觀念日新月異的改變通常這些改變都是因為現狀已經無法滿足所需

我最近一次體驗到改變是在今年的3月份,也就是Unity收購Applifier的時候聽起來這似乎只是一次普通的收購行為但就我來看這代表遊戲製作行業會有一場意義深遠的變革令我著實感到興奮不已

為何我會如此興奮?事實上我們都知道,當蘋果的APP Store出現,尤其是“免費遊戲”的概念開始盛行時,一場革命就已經開始了。遊戲的數量開始呈現爆發式的增長,隨之而來的是各種盈利的模式。而市場的變化與諸多的因素,成就了一批像Unity這樣的遊戲開發工具,也造就了遊戲開發民主化的全新理念。

創意之門由此被打開,蜂擁而來的個人開發者們不斷為市場帶來在他們眼中真正的遊戲,那些能夠為玩家帶來絕妙一刻的遊戲。如果你也熱衷於玩遊戲,那你一定明白我在說什麼這是一種無法被預知的愉悅。我依然記得當我拼盡全力在《Badland罪惡之地》中的某一關內集齊7個以上異形生物的時刻;我也記得當我在《Skyline Skaters 天空滑者》中第一次集齊所有字母並獲得一次飛速衝刺獎勵的時刻;我還記得在《Fat Cat Rush 肥貓快跑》中掉出畫面時的情形(實際上這只是遊戲中的一個錯誤但我覺得它特別搞笑)——這些就是絕妙一刻

我們渴望在遊戲中得到類似的體驗並且也會因此而沉迷於一款遊戲。而實際上在這種愉悅體驗的過程中,還有一種潛在的能量,一種只有在我們“分享”的時候才會真正地釋放出來的能量,分享是製造愉悅至關重要的一環。我們會遵循一些原則來進行分享,譬如將內容分享給那些理解我們所作所為並樂於共用趣味的人們。分享是人類的重要標誌之一,同時也將我們與其他的人群區隔開來,那些不玩遊戲的人。

當一個朋友向我們展示他們所鍾愛的遊戲時,我們會更加樂意去嘗試一下,而Everyplay便在這一理念下應運而生。它的遊戲錄製功能讓我們得以充分利用網路的力量,將遊戲中的“絕妙一刻”分享給更多的觀眾。它成為了UGC(使用者原創內容)的一種形式,適用於任何遊戲。“嘿!兄弟!看看我是怎麼過這關的!”玩家得以在分享的過程中展現他們與所鍾愛遊戲之間的親密關聯。不要誤解,這並非意味著分享的內容必須有多複雜或是壯觀,實際上恰恰相反。真正重要的是在這分享的過程中,玩家們享受了屬於他們自己的樂趣。

我們知道很多開發者都不太願意在他們的遊戲中再多加一個SDK,而我們也已經嘗試盡可能簡化這一操作。開發者們需要做的僅僅是從Assets Store中下載這個插件,並設定啟動和終止錄製的規則。我們投入了大量的精力來確保在影片錄製的過程中不會損失硬體的校能,對GPU不產生任何影響,對CPU性能的影響也幾乎微乎其微,因此影片被直接寫到快閃記憶體中而不是通過記憶體中轉,避免可能的衝突。同時,我們採用了H.264的編碼格式,這意味著每分鐘的影片內容僅佔用4MB的空間。我們甚至讓你可以建立迴圈錄製的機制,僅保留最後數分鐘的錄製內容以確保影片檔不會過大。

當然,這篇博客的目的並不是讓你知道這個SDK。而是想分享一些我的切身體會,希望以此給廣大開發者們提供經驗與參考。

1.   預設開啟錄影:儘管此功能並非預設打開,但我們強烈建議你開啟這一功能。否則的話,玩家們會錯過那些“碰巧”發生的絕妙一刻。
2.   使用縮圖功能:我們為每一個影片都抓取了一幀畫面作為縮圖。我們發現這一功能在用來顯示使用者歷史行為時被廣泛使用(大大提升了識別的效率)。
3.   中繼資料:Everyplay能夠在影片檔中嵌入中繼資料。中繼資料可以通過各種途徑來取用,特別是你需要在遊戲中取得影片內容的時候。何不使用這功能在“排行榜”中顯示那些獲得高分的玩家影片?這樣的玩家會拼命遊戲以求超越那些獲得高分的朋友們。同樣的,為什麼不加一個類似“人氣榜”用來顯示玩家在Everyplay中分享的影片有多收歡迎呢。
4.   社區:花點時間在Everyplay社區上創建一個帳號是非常值得的,你可以通過它和你遊戲的關注者們進行交流。我們的多元化社區擁用一群樂於探索和分享的遊戲玩家。加入他們,體驗如何分享、讚和評論影片,以及關注其他的玩家和遊戲。

5.   激勵:激勵玩家們分享影片非常有效,但是我們需要在激勵的方式上非常謹慎。有時候,分享本身帶來的“社會化效應”要比來自外部的激勵更有吸引力。例如,你可以在遊戲中遇到“絕妙一刻”,譬如達成某個成就或是擊敗某個BOSS時,引導玩家進行分享。當然,你也可以使用彈出提示的方法來鼓勵用戶分享。

6.   記錄玩家的表情:當你的玩家因為在遊戲中緊張或受挫而變得情緒化時,強大的Everyplay可以使用前置鏡頭(目前僅支援iOS設備)記錄他們的表情。但是你必須謹慎使用這個功能(特別是當遊戲目標是小孩時),並且清楚地告知玩家發生了什麼。我們會將即時的錄製畫面預覽框顯示在螢幕中,玩家可以在錄製時或者錄製後關閉。錄製的影片只有在玩家確認後才會上傳,而且他們可以在上傳前刪除表情內容。同時,我們會對Everyplay中的影片進行審核,避免其中包含不雅或侮辱性的畫面,這會造成部分影片出現延遲上線的情況。


目前已經有超過600多款遊戲支援Everyplay,而且這個數字依舊在持續上升,因此不免會帶來部分問題。我們會在部落格中分享更多有用的實戰經驗!如果有任何問題,也請隨時聯繫我們。

2014年8月10日 星期日

透過 Unity測試工具(Unity Test Tools)來進行快速的測試

原文標題:Unit testing at the speed of light with Unity Test Tools
作者: Dmitriy Mindra
原文網址:http://blogs.unity3d.com/2014/07/28/unit-testing-at-the-speed-of-light-with-unity-test-tools/


現在是時候來瞭解更多關於 NSubstitute library 以及使用它的方法。
NSubstitute library 包含在Unity測試工具(Unity Test Tools)可以在Asset Store免費下載。

每個軟體系統都由若干功能單元組成。在物件導向程式設計語言中,最小的功能單位是方法(Method)。這些方法通常都依賴於其它方法。如果你需要測試這些方法,那麼你就要面臨一些挑戰。

第一個挑戰是外部依賴的關係不容易建立,有些物件需要很複雜的初始化過程。
第二個挑戰是測試驗證某些執行路徑,需要呼叫其他的類別來驗證。
最後,呼叫外部類別方法可能會改變一些環境變數導致無法返回,例如刪除資料庫中的資料。

單元測試的作用是在一個隔離的環境中測試功能。隔離意味著所有的依賴關係項都是模擬出來的。代表測試工作在只有一個可能執行路徑的特殊環境中測試。

測試替身(Test double)技術透過在測試中替換真正的依賴對象,產生測試環境來使單元測試更加快捷和可靠。

下面要介紹5個測試替身模式:Dummy Object、Test Stub、Test Spy、Mock、Fake

Dummy Object
這裡使用了一個簡單的太空商船遊戲的複製來作為展示測試替身以及NSubstitute。這是一個以玩家控制的太空船遊戲。

玩家可以用武器裝備海盜戰艦。太空船有武器庫,武器可以安裝在任意的空武器架上。

測試模擬:確定在裝載武器的時候武器架是否已經被佔用
  • 找一個有一個空武器架的太空船
  • 找把武器
  • 裝載武器
  • 確認武器架已滿




手動建立Dummy Object來測試一下



透過基於NSubstitute 虛擬對象的測試

武器物件在這個測試場景中只是名義上的,物件的方法以及屬性在這個執行路徑中不會被使用到。它只需要一個參數,然後我們可以在所有IWeapon的介面使用這物件,如果方法沒有空指標檢查的話甚至可以使用null。那麼使用的這種物件就叫做虛擬物件模式

有兩種方式可以創建虛擬物件。

第一種方式是手動創建虛擬物件。通常每一種物件/介面應該只創建一個虛擬物件。IDE功能可以幫你產生介面。使用這樣的方法產生虛擬物件和存檔非常容易。

第二種方式是透過在Unity測試工具中的NSubstitute:



傳遞null值到沒有null參數檢查的方法中也可以被認為是虛擬物件模式。這裡就不介紹何謂Null了。上面介紹的方法都可行且易用。

Test Stub
如果太空船物件需要返回一些值,且這個值是從武器獲取的怎麼辦?在這種情況下,武器物件就不能是一個虛擬物件,就要用Test Stub

Test Stub傳回測試一個特定執行路徑的值,例如BrokenWeaponStub, IncompatibleWeaponStub以及其它可以用於測試特定場景的物件。

測試模擬: 確保太空船中裝備的可工作的武器至少發射了一發
  • 找一艘只有一個武器架的太空船
  • 裝載武器
  • 發射武器
  • 檢查太空船回合至少發射一次


透過手動建立的Test Stub來測試。
FunctionalWeaponStub 實現了IWeapon介面但是返回硬編碼(Hardcoded)的值。










與虛擬物件不同,Stub包含了硬編碼的值,用於在特定的情況下作為值來返回。

我們也可以通過NSubstitute來創建同樣的Stub


透過Substitute.For 創建的物件實現了IWeapon介面並返回一個IWeapon類型。但實際上它只是一個代理物件,它的行為是可以被修改的。Returns 是NSubstitute庫中的一個修改代理物件屬性的擴展方法,當Shoot方法被呼叫,返回在Returns()方法中指定的值。當然也可以提供一個值的序列或者委託。
返回值的序列的範例如下:


第一次呼叫任意參數的randomNumberService.Range()方法會返回0,下一次調用返回2並且依此類推。
NSubstitute中另外一個很有用的方法是可以比對範本中的參數。

在下面的範例中,預設屬性會被重寫使所有對Range(10,100)方法的調用都會返回80。更詳細的細節請參考NSubstitute手冊

在測試隨機事件中使用亂數產生的Stub是非常高效的,因為這樣可以虛擬所需要的亂數序列。
手動產生Stub非常容易,並且正確的命名可以使我們的測試程式碼更乾淨和易讀。使用NSubstitute可以減少程式碼量並且更加靈活。

Test Spy
如果我們需要記錄物件行為的怎麼辦?比如我們的對手被擊中了多少次?如果測試替身需要記錄功能,那麼就需要使用Test Spy
遭遇的代表在星際中行進的路上碰到其它物體。玩家可以在遭遇時選擇一些動作。例如如果對方是星際警察則通行,如果是海盜船則攻擊。

測試模擬:確保在遭遇中對手被擊中
  • 選擇一個對手
  • 選擇一個有兩個武器艙的太空船
  • 裝備兩個武器
  • 創建一個遭遇行為
  • 選擇遭遇中使用的攻擊動作
  • 檢查對手是否被擊中

遭遇需要兩條太空船以及一個亂數產生器來計算可能的結果。AlwaysMaxRandomNumber方法永遠返回最大值,這樣就會讓對手永遠無法避開這次打擊。這個測試走的是一個非常特殊的執行路徑。
在這次遭遇中,玩家的太空船是一個真實的物件,但是對手則是一個Spy。這個Spy包含了Stub以及記錄功能。它記錄了在測試中隨後可能檢查的擊中次數。












可以通過NSubstitute中的Arg.Do<>以及 When… Do…方法來創建Test Spy。

在傳遞參數時,NSubstitute使用特殊的參數比對器來對Arg.Do執行委派。這代表hitCount+=x.Count()會在每個方法呼叫時被執行。

Mock Object
Spy只是記錄資料,驗證就交給了開發人員。如果把驗證資料的工作交給Spy會怎麼樣?
帶驗證能力的Spy被稱為Mock Object(注:本文介紹的是非精確模擬)。
測試模擬:確保在太空船的射擊被呼叫後每一個武器都會發射
  • 找一台有兩個武器架的太空船
  • 裝備兩個武器
  • 射擊
  • 檢查是否每個武器的Shoot方法都被呼叫了
 
這個測試範例很特殊,不單是因為它使用了Mock Object模式,而且它還驗證了太空船的行為而不是狀態。(透過倫敦和芝加哥測試驅動開發學校瞭解更多)

測試替身中的測試不管返回值,它只確保特定參數值的特定方法被呼叫。這裡我們假設一個太空船使用了正確參數值的正確方法在外部系統被呼叫,那麼它的工作就是正確的。

手動創建模擬可能會很花時間。更好的選擇是使用NSubstitute來獲取Mock Object。

NSubstitute還可以驗證在一個特定的序列中方法是否被調用。



Mock Object不止記錄呼叫並且驗證呼叫。它是一個帶驗證的Test Spy。

Fake Object
如果一個測試替身需要一些邏輯怎麼辦?

包含了邏輯的測試替身叫做Fake Object,這個東西是一頭危險的野獸。這是唯一包含邏輯以及模擬真實系統的元件。Fake本身是很複雜的,它用於模擬Stub無法模擬的真實系統。常見的範例是用記憶體中資料庫替換真實的資料庫,或模擬web服務來替代真實的web服務。

最好可以能不使用Fake物件就不使用,因為它們對被替換的元件影響很大,如果沒有妥善的測試很容易發生問題。

總結
簡單的結論如下:
手動創立Dummy Object、Stub、Spy並不複雜,正確的命名可以使程式更可讀和乾淨。
NSubstitutes設計出來是用於模擬並用來更好設計模擬物件。
測試工具用來檢查行為和狀態都很好用。採用最簡單的方法。
盡可能的在測試替身中避免使用Fake(邏輯)

祝測試愉快!
範例代碼可以從GitHub上獲取。

另:

不同的書籍會使用不同的術語,請參考terminology in books。NSubstitute功能非常強大,使用前最好看一下相關文件,並遵循其中的準則。如果你仍然不清楚Fake和Stub的區別,參考文章“Mocks aren't Stubs”Arrange Act Assert(AAA) 在本文中使用來構成單元測試。這裏還有一個太空商船的開源遊戲,很值得一玩。

2014年8月5日 星期二

Unity 5.x 多場景編輯功能(Multi Scene Editing)

作者:Steen Lund

雖然Unity 5.x週期會有許多令人興奮的功能釋出,但我們也仍然在改進現有的功能和工作流程,其中一塊就是我們的關卡管理和場景編輯.

在特別的情況下,有時我們需要將遊戲的關卡放在多個不同的場景(Scenes),可能是因為關卡很大或是你想要用串流的方式來載入關卡,也可能是因為想要用簡單點的方法讓不同的開發人員共同開發一個關卡而避免產生太多衝突。

不管你把關卡分成很多場景檔的理由是甚麼,你可能得寫一些編輯工具來支援你的場景,如果你是為了做串流,那你也許會需要一個在編輯器可以把多個場景排好成一個關卡的工具,或是你會需要再執行之前先把多個場景組合成為一個關卡的功能。

現在Unity在執行時已經可以支援用像是Application.LoadLevelAdditive這樣的API呼叫,可以一次載入多個場景,可惜的是UnloadLevel並不能有效地釋放,因此當你直接載入額外的資料,想要釋放乾淨必須要你自己做像是物件紀錄或結構化場景的資料來讓釋放能完全一點。

如果你對於這類問題很關切,我們向你介紹場景管理器 SceneManager ,這個管理器是一個新的API,用來管理執行週期的場景,他能管理場景裡的物件,讓開發者在釋放關卡時不需要擔心物件釋放問題。

載入一個額外的場景只要簡單的呼叫 SceneManager.LoadSceneAdditive(“場景名稱”),要釋放場景只需要呼叫 SceneManager.UnloadScene(“場景名稱”)

還有一些API用來處理新建立的物件要放在哪個場景,或是將物件在不同的場景間移動(層hierarchically (非場景空間) ,以及非同步載入API,這樣你就可以邊玩邊載入你的遊戲關卡。

在管理器的上面你可以依照需求為遊戲規劃關卡載入或串流,完全取決於你!

我們用場景管理器來規劃所謂的多場景編輯,這個功能允許你同時載入多個場景,看起來會像是影片這樣:


你可以很容易排好你的關卡及在不同的場景間移動物件,我們正在研究如何在多場景編輯中支援像是導航(navmesh), 光照貼圖(lightmap)和 遮擋剔除(occlusion culling)等功能,目標是讓這些功能可以一起運作順暢。

這個工作流程提升帶來的好處是,場景的編輯狀態將會被紀錄在還原系統(Undo System),這將會減少許多像是場景被標記為已編輯而重整,或沒有用過的場景被不斷的檢查等等的奇怪問題。

註: 這個功能將不會再5.0釋出,我們正努力趕工讓他在5.x週期內釋出

原文連結:
http://blogs.unity3d.com/2014/08/04/multi-scene-editing/

2014年8月2日 星期六

Frame Debugger in Unity 5.0


作者:Aras Pranckevičius

你是否曾經思考過到底Unity中的圖形效果到底是如何一步一步的渲染出來的呢?

想要了解流程,可以通過一些擴展工具來實現這個目的,如果你使用的系統是Windows。你可以用一個Standalone版本的遊戲,通過Visual Studio 圖像除錯工具, Intel GPA, RenderDoc, NVIDIA NSight或 AMD GPU PerfStudio這些工具 ,然後擷取其中一張Frame,並從Draw call或是其他圖形事件來看出發生哪些事情。

上面這種方式很有用,因為這些工具可以提供非常底層的詳細資訊,但流程也比較復雜,你得需要建立一個Windows 專案並執行這些工具。所以我們一直在想:是否可以做一個簡單易用的工具呢?

因此,Unity5.0裡我們開發了Frame除錯工具。

進入Frame除錯工具

   執行Unity,在介面功能表中選擇Frame Debugger,你就可以看到在這個Frame中繪制呼叫的列表。透過幾個步驟可以查看點上渲染了什麽。或是檢查陰影紋理、材質、deferred g-buffer以及類似的東西。

    Frame除錯工具的介面相當簡單。在右邊有一個Draw Call的樹狀結構以及其它有趣的事件,左邊則顯示細節。多數的Draw Call顯示為一個網格預覽,繪制的對象會高亮顯示。

   下圖用gif動畫表示深度貼圖的Draw Call事件

   然後,在這Frame中一個光源渲染它的陰影

   再然後,圖型開始處理後製。您可以看到光暈和光斑的效果影響,做了模糊處理放回去,接著是光暈的閃爍效果

渲染目標顯示選項

對於某些效果,你可以很方便的看到目標每個獨立的繪製通道。下圖是一個通過Unity的方向性光源陰影產生的螢幕空間緩存

或只顯示紅色通道:

顯示的顏色範圍可以從工具欄上的滑桿來調整。這個對於HDR渲染特別有用

當一次渲染到多個目標時,你可以選擇在遊戲視圖中顯示哪一個。下面分別展示的是在5.0中延遲陰影模式中漫反射,鏡面反射,常規以及輻射/光源緩存。


實施注意事項
Frame除錯工具的執行流程就好像是一個可愛的駭客行為,實際上並沒有“Frame擷取”這個行為,我們就是在特定的Draw Call呼叫後停止渲染。所以如果你查看一個渲染了100個物體的Frame,並且你正在看第10號物體,那其實我們只是跳過其餘90個物體的渲染。如果在這個點上正好渲染到了一個紋理,那麽我們就會把它顯示在畫面上。

   這就代表把這功能做出來並不難,只需要幾天的工作量,基本功能就能完成(然後花了幾個星期循環來製作UI)。這種方式的缺點是只能在編輯模式中使用。如果你在除錯的時候渲染發生了變化(例如禁止一些物體,或者改變遊戲視圖的尺寸),那麽你會突然看到一個不同的繪制呼叫列表。

不過即使有這些限制,我們認為它還是一個檢查你遊戲中圖像效果強有力的工具。

在Unity5.0版本中,開發者就能夠使用到這工具,如果有任何使用問題和建議,歡迎反饋給我們。

祝 除錯愉快!

著作人