2011年9月16日 星期五

為 Unity 的不同版本及發佈平台編寫專用的程式碼


當製作跨平台遊戲時,雖然 Unity 已經相當方便了,但因為各平台間的效能及功能差異,我們常常需要附加專用的程式碼來做一些處理,儘管 Unity 的 API 已經有 Application.platform 來讓我們進行判斷,但有些 Runtime Classes 在不適用的平台 Bulid 時會回報錯誤,像是 iPhoneSettings 或是 iPhoneKeyboard 在 Bulid 成 PC 平台遊戲時就會直接報錯而無法 Bulid。

另外,當 Unity 有新版本發行,在 Script 的語法上也可能做些變動,像是近期的 3.4,官方的更新詳細內容說明頁面上就有提到對於 Javascript 的變動,也有提醒舊有程式可能在更新到新版 Unity 後可能會報錯,此時,我們就必須自行調整程式內容,才能使遊戲正常運作。

基於這些在編譯時就會發生的錯誤,即使我們在程式中加入 Application.platform 或 Application.unityVersion 來判斷執行平台或 Unity 版本,也沒多大幫助,所以只好在不同平台編譯時將暫時不能用的程式區段註解起來,以免發生錯誤,但是這種做法實在是不方便,特別是當程式越寫越多時,出問題的機會就更大了;幸好,Unity 在 2.6 及 3.0 之後分別為版本及平台提供了解決之道,所以我們只要為不同平台或 Unity 版本都撰寫專用的程式碼,然後利用 #if 、#else 及 #endif 將這些程式碼區隔開來,那麼編譯時就只會去編輯到需要的部份,可以直接排除這一類編譯期發生的錯誤。



用來判斷平台的常數有...

UNITY_EDITOR
UNITY_STANDALONE_OSX
UNITY_DASHBOARD_WIDGET
UNITY_STANDALONE_WIN
UNITY_WEBPLAYER
UNITY_WII
UNITY_IPHONE
UNITY_ANDROID
UNITY_PS3
UNITY_XBOX360

在 Unity 編輯器中,這些常數就已是有效用的,而不用等到輸出時才會生效,例如在 Build Settings 中是將平台切換到 Web Player ,此時雖然未將遊戲輸出,在程式碼中判斷為 UNITY_WEBPLAYER 可執行的區域就會被編譯,如此也大大增加了製作時期的便利性。

用來判斷版本的常數則有...

UNITY_2_6
UNITY_2_6_1
UNITY_3_0
UNITY_3_0_0
UNITY_3_1
UNITY_3_2
UNITY_3_3
UNITY_3_4

更詳細的說明可直接查看官網的 http://unity3d.com/support/documentation/Manual/Platform%20Dependent%20Compilation.html

官網這個說明相當淺顯易懂,而且此方法通用於 Javascript、C#、Boo 三種語言,如此就方便多了,另外,個人覺得這是在編輯期就做好的判斷與處理,所以執行期應該就不需要持續去判斷平台或版本了,對於執行效率多少也會有些幫助吧!