質問するログイン新規登録

回答編集履歴

1

補足

2019/10/31 01:34

投稿

hogefugapiyo
hogefugapiyo

スコア3311

answer CHANGED
@@ -42,4 +42,125 @@
42
42
  fact2,あなたは猫好き?,Do you like cat?
43
43
  ```
44
44
 
45
- 質問1のときはfact1の行のデータを取得して、日本語なら2列目のテキスト、英語なら3列目のテキストを引っ張ってくる…みたいなやり方でしょうか。
45
+ 質問1のときはfact1の行のデータを取得して、日本語なら2列目のテキスト、英語なら3列目のテキストを引っ張ってくる…みたいなやり方でしょうか。
46
+
47
+ #追記(2019/10/31)
48
+ 思いついた内容を実装したサンプルなので、これが必ずしも正解というわけではありませんが外部化してみるテストです。(質問者さんのListを使いまわしたいという願望からは外れます)
49
+
50
+ まず、翻訳用データのテキストファィルを2つ作成します。UTF-8などの文字コードで保存してください。
51
+ 保存先はアセットフォルダに【Resources】というフォルダを作成し、更に【Language】というフォルダを作成し、【language_**.txt】という形式で保存します。
52
+ (例:【Resources\Language\language_ja.txt】)
53
+
54
+ ● language_ja.txt
55
+ ```txt
56
+ fact1,こんにちは
57
+ fact2,おはよう!
58
+ fact3,さよなら!
59
+ fact4,僕ドラえもんです
60
+ fact5,僕はおにぎりが大好きなんだなぁ
61
+ fact6,おっす、おら悟空!
62
+ fact7,月にかわってお仕置きよ!
63
+ ```
64
+
65
+ ● language_en.txt
66
+ ```txt
67
+ fact1,Hello!
68
+ fact2,Good morning.
69
+ fact3,Good-bye.
70
+ fact4,Hello, I'm Doraemon
71
+ fact5,I love Riceball
72
+ fact6,Hi. this is Goku!
73
+ fact7,In the name of the Moon I shall punish you!
74
+ ```
75
+
76
+ テキストIDに対するテキストがそれぞれ保存されていることがわかります。
77
+ (例: fact1 であれば こんにちは (英語ならHello!))
78
+
79
+ では、これを読み込んで表示するスクリプトを書いてみます。
80
+
81
+ ● LocalizeTest.cs
82
+ ```cs
83
+ using System.Collections;
84
+ using System.Collections.Generic;
85
+ using UnityEngine;
86
+
87
+ public class LocalizeTest : MonoBehaviour {
88
+
89
+ // 現在の言語設定
90
+ string currentLanguage = "ja"; // ja,en
91
+
92
+ // キーを並べた会話データ。この順番に会話が進む
93
+ private List<string> gameTextID = new List<string>() {
94
+ "fact1",
95
+ "fact3",
96
+ "fact4",
97
+ "fact2",
98
+ "fact5",
99
+ "fact6",
100
+ "fact7",
101
+ };
102
+
103
+ // 翻訳データ。選択中の言語のデータがロードされる
104
+ public Dictionary<string, string> textData = new Dictionary<string, string>();
105
+
106
+ // 会話の現在の場所を表す変数
107
+ int clickCounter = 0;
108
+
109
+ private void Start() {
110
+ Debug.Log("現在の言語は " + currentLanguage + " です。マウスクリックで次の会話が表示されます");
111
+ LoadLanguageData();
112
+ }
113
+
114
+ // 翻訳データをテキストファイルから読み込む
115
+ private void LoadLanguageData() {
116
+
117
+ // Resources/Language/language_*.txt を読み込んでいる
118
+ var loadLanguageText = Resources.Load<TextAsset>("Language/language_" + currentLanguage);
119
+
120
+ // 読み込んだテキストデータを改行で区切って配列に代入
121
+ var languageTextData = loadLanguageText.text.Split('\n');
122
+
123
+ // キー,テキストデータ という構成なので、更に,で区切ってDictionaryに入れる
124
+ foreach (string text in languageTextData) {
125
+ // 得た1行を更にカンマで区切る。
126
+ var myText = text.Split(',');
127
+ // 区切られた文字列は テキストID と テキスト なのでDictionaryに追加
128
+ textData.Add(myText[0], myText[1]);
129
+ }
130
+
131
+ }
132
+
133
+ void Update() {
134
+
135
+ // マウスクリックで会話が進む
136
+ if (Input.GetMouseButtonDown(0)) {
137
+
138
+ // テキストデータのキーから現在の会話IDをチェック
139
+ var currentText = textData[gameTextID[clickCounter]];
140
+
141
+ // データが見つからなければ戻す
142
+ if (currentText == null || currentText == "") { return; }
143
+
144
+ // テキストを表示
145
+ Debug.Log("[" + gameTextID[clickCounter] + "]" + currentText);
146
+
147
+ // 会話を1つすすめる。カウンターが会話データよりも多ければ0に戻す
148
+ clickCounter = clickCounter + 1 >= gameTextID.Count ? 0 : clickCounter + 1;
149
+ }
150
+
151
+ }
152
+
153
+ }
154
+ ```
155
+ 適当なオブジェクトにアタッチして起動したら画面をクリックしてみてください。コンソールに会話文がどんどん表示されるかと思います。
156
+
157
+ ``currentLanguage`` で現在の言語設定を設定しています。jaなら日本語、enなら英語データをロードしにいきます。
158
+
159
+ キーをあてがって会話文を外部化したので、呼び出したい会話をキーでセットしておけば言語設定に沿った内容が表示されることが期待できます。``gameTextID``では会話の順番をテキストIDで指定しています。
160
+
161
+ 翻訳データ取得のところでは【Resources\Language\language_ja.txt】などのテキストファイルをロードして、その内容を改行ごとにわけて配列に代入しさらにそれをカンマで区切ってDictionary<string,string>にキーとテキストとして代入していきます。
162
+ ※ よく考えると今回は英語ローカライズとかもするのでカンマは悪手でした、何か区切り文字を他のものに変えても良さそうです(|とか)
163
+
164
+ あとは画面クリックする度に、会話の順番のテキストIDを使ってDictionaryから該当するテキストデータを探し、それを表示しています。外部化するメリットは、たとえば中国語対応をしたいなと思ったらlanguage_cn.txt を追加して中身をガリガリ書けば良いという感じのところです。
165
+
166
+ ゲームの日本語化作業とかで得た断片的な知識で書いているだけで、ローカライズが仕事とかではないのであまり鵜呑みにせずこんなこと思いついた人がいる程度に見て頂ければと思います