一般而言,要知道使用者的系統設定語言,只需要使用 Application.systemLanguage 就能得知,例如 Application.systemLanguage == SystemLanguage.Chinese 就幫玩家切換到中文版;如果 Application.systemLanguage == SystemLanguage.English 就切換到英文版(請參考官網的 http://unity3d.com/support/documentation/ScriptReference/Application-systemLanguage.html 及 http://unity3d.com/support/documentation/ScriptReference/SystemLanguage.html),然而這種方法雖然使用在 windows 和 mac 上都沒問題,但在 iPhone 上,Application.systemLanguage 竟然是 SystemLanguage.Unknown,不管把 iPhone 切換到任何語言或是地區都是同樣的結果。
經過在網路上搜索,發現許多人也遇到相同的問題,解決的方式很多種,有些方式還蠻複雜的,有些方式只是治標,並不能很準確得知玩家使用的語言,經過測試,以下提供一個我個人覺得最簡單直接又最根本解決的辦法,就是透過 Objective C 取得系統語言再儲存下來給 Unity 讀取出來判斷,對於未研究過 Objective C 的人,這方法好像有點難度,以下提供實作流程,照著做就能解決問題囉~
- 當 Unity 編譯輸出為 iPhone 應用程式完成之後,會開啟 Xcode ,在此找出 AppController.mm 。
- 在 - (id) initWithFrame:(CGRect)frame { ... } 的大括號中插入這句 [[NSUserDefaults standardUserDefaults] setObject: [[NSLocale preferredLanguages] objectAtIndex:0] forKey: @"YourLanguageKey"];
- 把以上這句代碼的 YourLanguageKey 改為自己喜歡的字串(不改也沒關係^_^)。
- 然後在 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 好像也無法顯示,還沒親自證實過),所以對於文字的部份,我都是以圖檔取代,只是這樣做的話,如果遊戲中的文字內容較多,而且又支援較多種語言的話,似乎要付出的代價就比較大;目前查的資料顯示可能是中文字型檔的材料貼圖過大的關係,所以如果自製字型,只放入會使用到的文字,或許就能解決此問題,此部份還沒實作過,如果確認解決辦法,再另行發佈文章分享給大家,如果有哪位先進有相關的辦法,也請不吝指教哦~