2011年6月5日 星期日

Unity 在 iPhone 上如何偵測到系統的語言設定

使用 Unity 設計遊戲有個優勢就是跨平台,但除了跨平台之外,遊戲能夠同時支援多種語言就更完美了,在這方面,Unity 也幫我們考慮到了,所以要判斷使用者系統使用的語言是相當容易的,可惜的事,在 iPhone 的系統上卻不是這麼回事;所以在遊戲中只能多個語言設定的功能讓玩家自己設定要使用哪種語言,這樣也是支援多語言環境,但似乎有點美中不足的感覺,如果玩家進入遊戲就能自動切換適當的語言環境,不是更便利嗎!! 那麼在 iPhone 上應該如何辦到呢?


一般而言,要知道使用者的系統設定語言,只需要使用 Application.systemLanguage 就能得知,例如 Application.systemLanguage == SystemLanguage.Chinese 就幫玩家切換到中文版;如果 Application.systemLanguage == SystemLanguage.English 就切換到英文版(請參考官網的 http://unity3d.com/support/documentation/ScriptReference/Application-systemLanguage.htmlhttp://unity3d.com/support/documentation/ScriptReference/SystemLanguage.html),然而這種方法雖然使用在 windows 和 mac 上都沒問題,但在 iPhone 上,Application.systemLanguage 竟然是 SystemLanguage.Unknown,不管把 iPhone 切換到任何語言或是地區都是同樣的結果。

經過在網路上搜索,發現許多人也遇到相同的問題,解決的方式很多種,有些方式還蠻複雜的,有些方式只是治標,並不能很準確得知玩家使用的語言,經過測試,以下提供一個我個人覺得最簡單直接又最根本解決的辦法,就是透過 Objective C 取得系統語言再儲存下來給 Unity 讀取出來判斷,對於未研究過 Objective C 的人,這方法好像有點難度,以下提供實作流程,照著做就能解決問題囉~



  1. 當 Unity 編譯輸出為 iPhone 應用程式完成之後,會開啟 Xcode ,在此找出 AppController.mm 。
  2. 在 - (id) initWithFrame:(CGRect)frame { ... } 的大括號中插入這句 [[NSUserDefaults standardUserDefaults] setObject: [[NSLocale preferredLanguages] objectAtIndex:0] forKey: @"YourLanguageKey"];
  3. 把以上這句代碼的 YourLanguageKey 改為自己喜歡的字串(不改也沒關係^_^)。
  4. 然後在 Unity 任意的 Script 中,只要呼叫 PlayerPrefs.GetString("YourLanguageKey") 就能取得代表語系的字串;en 代表英文、zh-Hant 代表中文繁體、zh-Hans 代表中文簡體。

以上,是我的使用經驗,步驟 2 的代碼會在 Awake() 之前執行,所以我把 PlayerPrefs.GetString("YourLanguageKey") 放在 Awake() 中判斷語系,並切換適當的語言環境給玩家;另外,也可在做這個判斷之前使用 if(Application.platform == RuntimePlatform.IPhonePlayer) { ... } 來分辨目前的執行平台,畢竟只有在 iPhone 才需要這樣特別處理嘛~

如此,是不是很簡單呢!!

雖然已完成語言的判斷,但 Unity 使用中文字型的話,在 iPhone 上似乎無法顯示( Android 好像也無法顯示,還沒親自證實過),所以對於文字的部份,我都是以圖檔取代,只是這樣做的話,如果遊戲中的文字內容較多,而且又支援較多種語言的話,似乎要付出的代價就比較大;目前查的資料顯示可能是中文字型檔的材料貼圖過大的關係,所以如果自製字型,只放入會使用到的文字,或許就能解決此問題,此部份還沒實作過,如果確認解決辦法,再另行發佈文章分享給大家,如果有哪位先進有相關的辦法,也請不吝指教哦~