上記の設定から下記のイメージの様に文章を作成し、シーン内のテキストにリスト内の24の文章が表示される様に設定したのですがプログラミングの経験も浅くUnityでの初めてのアプリ作成でもあり、どの様にローカライゼーションするべきか分からずにいます。I2 Localizationをインポートしてみたのですがリストへの適用は難しそうだったのでここで質問させてもらいました。
Localization++も使用しようと試してみたのですが現在の自分では柔軟に使いこなせそうにありませんでした。C#やUnityでのローカライゼーションに明るい方がいましたらアドバイスを頂けないでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
汎用性に欠けちゃうんですが、リストをそのまま使いまわしたいってことなら最悪既存クラスの拡張で対応とか…は駄目ですかね? 24個ぐらいならこれでも書けるかなーとは思うのですが
cs
1 [System.Serializable] 2 public class Question { 3 public string fact; // 日本語 4 public string factEN; // 英語 5 public string factCN; // 中国語 6 } 7 8 Language currentLanguage = Language.JP; // とりあえず日本語選択 9 10 enum Language { 11 JP, 12 EN, 13 CN 14 } 15 16 17 void SetCurrentQuestion() { 18 currentQuestion = unansweredQuestions[currentQuestionIndex]; 19 switch (currentLanguage) { 20 case Language.EN: 21 factText.text = currentQuestion.factEN; 22 break; 23 case Language.CN: 24 factText.text = currentQuestion.factCN; 25 break; 26 default: 27 factText.text = currentQuestion.fact; 28 break; 29 } 30 } 31
もっと汎用的や拡張性を考えると、キーなどを決めて対応する言語を入力して外部に翻訳データを作っていくとかになると思います。
主キー,日本語,英語 fact1,あなたは犬好き?,Do you like dog? fact2,あなたは猫好き?,Do you like cat?
質問1のときはfact1の行のデータを取得して、日本語なら2列目のテキスト、英語なら3列目のテキストを引っ張ってくる…みたいなやり方でしょうか。
#追記(2019/10/31)
思いついた内容を実装したサンプルなので、これが必ずしも正解というわけではありませんが外部化してみるテストです。(質問者さんのListを使いまわしたいという願望からは外れます)
まず、翻訳用データのテキストファィルを2つ作成します。UTF-8などの文字コードで保存してください。
保存先はアセットフォルダに【Resources】というフォルダを作成し、更に【Language】というフォルダを作成し、【language_**.txt】という形式で保存します。
(例:【Resources\Language\language_ja.txt】)
● language_ja.txt
txt
1fact1,こんにちは 2fact2,おはよう! 3fact3,さよなら! 4fact4,僕ドラえもんです 5fact5,僕はおにぎりが大好きなんだなぁ 6fact6,おっす、おら悟空! 7fact7,月にかわってお仕置きよ!
● language_en.txt
txt
1fact1,Hello! 2fact2,Good morning. 3fact3,Good-bye. 4fact4,Hello, I'm Doraemon 5fact5,I love Riceball 6fact6,Hi. this is Goku! 7fact7,In the name of the Moon I shall punish you!
テキストIDに対するテキストがそれぞれ保存されていることがわかります。
(例: fact1 であれば こんにちは (英語ならHello!))
では、これを読み込んで表示するスクリプトを書いてみます。
● LocalizeTest.cs
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class LocalizeTest : MonoBehaviour { 6 7 // 現在の言語設定 8 string currentLanguage = "ja"; // ja,en 9 10 // キーを並べた会話データ。この順番に会話が進む 11 private List<string> gameTextID = new List<string>() { 12 "fact1", 13 "fact3", 14 "fact4", 15 "fact2", 16 "fact5", 17 "fact6", 18 "fact7", 19 }; 20 21 // 翻訳データ。選択中の言語のデータがロードされる 22 public Dictionary<string, string> textData = new Dictionary<string, string>(); 23 24 // 会話の現在の場所を表す変数 25 int clickCounter = 0; 26 27 private void Start() { 28 Debug.Log("現在の言語は " + currentLanguage + " です。マウスクリックで次の会話が表示されます"); 29 LoadLanguageData(); 30 } 31 32 // 翻訳データをテキストファイルから読み込む 33 private void LoadLanguageData() { 34 35 // Resources/Language/language_*.txt を読み込んでいる 36 var loadLanguageText = Resources.Load<TextAsset>("Language/language_" + currentLanguage); 37 38 // 読み込んだテキストデータを改行で区切って配列に代入 39 var languageTextData = loadLanguageText.text.Split('\n'); 40 41 // キー,テキストデータ という構成なので、更に,で区切ってDictionaryに入れる 42 foreach (string text in languageTextData) { 43 // 得た1行を更にカンマで区切る。 44 var myText = text.Split(','); 45 // 区切られた文字列は テキストID と テキスト なのでDictionaryに追加 46 textData.Add(myText[0], myText[1]); 47 } 48 49 } 50 51 void Update() { 52 53 // マウスクリックで会話が進む 54 if (Input.GetMouseButtonDown(0)) { 55 56 // テキストデータのキーから現在の会話IDをチェック 57 var currentText = textData[gameTextID[clickCounter]]; 58 59 // データが見つからなければ戻す 60 if (currentText == null || currentText == "") { return; } 61 62 // テキストを表示 63 Debug.Log("[" + gameTextID[clickCounter] + "]" + currentText); 64 65 // 会話を1つすすめる。カウンターが会話データよりも多ければ0に戻す 66 clickCounter = clickCounter + 1 >= gameTextID.Count ? 0 : clickCounter + 1; 67 } 68 69 } 70 71}
適当なオブジェクトにアタッチして起動したら画面をクリックしてみてください。コンソールに会話文がどんどん表示されるかと思います。
currentLanguage
で現在の言語設定を設定しています。jaなら日本語、enなら英語データをロードしにいきます。
キーをあてがって会話文を外部化したので、呼び出したい会話をキーでセットしておけば言語設定に沿った内容が表示されることが期待できます。gameTextID
では会話の順番をテキストIDで指定しています。
翻訳データ取得のところでは【Resources\Language\language_ja.txt】などのテキストファイルをロードして、その内容を改行ごとにわけて配列に代入しさらにそれをカンマで区切ってDictionary<string,string>にキーとテキストとして代入していきます。
※ よく考えると今回は英語ローカライズとかもするのでカンマは悪手でした、何か区切り文字を他のものに変えても良さそうです(|とか)
あとは画面クリックする度に、会話の順番のテキストIDを使ってDictionaryから該当するテキストデータを探し、それを表示しています。外部化するメリットは、たとえば中国語対応をしたいなと思ったらlanguage_cn.txt を追加して中身をガリガリ書けば良いという感じのところです。
ゲームの日本語化作業とかで得た断片的な知識で書いているだけで、ローカライズが仕事とかではないのであまり鵜呑みにせずこんなこと思いついた人がいる程度に見て頂ければと思います
投稿2019/10/29 00:58
編集2019/10/31 01:34総合スコア3302
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/30 08:23
2019/10/31 01:35
2019/10/31 08:05