CSVやtxtファイル等の外部ファイルに入っているテキストファイルを読み込むことをやってみる。キャラの名前とそのキャラのしゃべる文章を1行として、IDで管理することを想定。テキストは下記のようなものをタブ区切りで用意。これらを分解して2次配列にして管理するまでの内容です。
#ID Name Message
1 やすし こんにちは!
2 たけし はい、こんにちは!
3 やすし あなたはピチョンさんですか?
4 たけし いいえ、私はピチョンではありません、たけしです。
Text[0,0] == 1
Text[0,1] == やすし
Text[0,2] == こんにちは!
このようにしたかった訳です。
#事前準備
上記のテキストファイルをいれるフォルダを作る。"Resources"というフォルダを作成してやると、ソースコード上からリソースのロードができるようになる特別なフォルダになります。
この中に上記のテキストファイルを入れます。
#概要
処理の流れは下記のように実行。
- テキストをまるっと全部取り込む
- まるっと取り込んだテキスト1行1行を1次配列に入れ込む
- テキストの行数と列数を取得して最終的に入れ込む2次配列のサイズを決める
- 2で取り込んだ1行1行をタブ区切りで2次配列にfor文で入れ込む
以下コード。
public class LoadText : MonoBehaviour {
public string[] textMessage; //テキストの加工前の一行を入れる変数
public string[,] textWords; //テキストの複数列を入れる2次元は配列
private int rowLength; //テキスト内の行数を取得する変数
private int columnLength; //テキスト内の列数を取得する変数
private void Start()
{
TextAsset textasset = new TextAsset(); //テキストファイルのデータを取得するインスタンスを作成
textasset = Resources.Load("Test", typeof(TextAsset) )as TextAsset; //Resourcesフォルダから対象テキストを取得
string TextLines = textasset.text; //テキスト全体をstring型で入れる変数を用意して入れる
//Splitで一行づつを代入した1次配列を作成
textMessage = TextLines.Split('\n'); //
//行数と列数を取得
columnLength = textMessage[0].Split('\t').Length;
rowLength = textMessage.Length;
//2次配列を定義
textWords = new string[rowLength, columnLength];
for(int i = 0; i < rowLength; i++)
{
string[] tempWords = textMessage[i].Split('\t'); //textMessageをカンマごとに分けたものを一時的にtempWordsに代入
for (int n = 0; n < columnLength; n++)
{
textWords[i, n] = tempWords[n]; //2次配列textWordsにカンマごとに分けたtempWordsを代入していく
Debug.Log(textWords[i, n]);
}
}
}
}
###変数
テキストを入れ込む段階で一時的に使う1次配列と、最終的に管理したい2次配列を用意。あとは2次配列を作る際に必要なサイズを決めるのに使う行数と列数を取得する変数を用意します。
public string[] textMessage; //テキストの加工前の一行を入れる変数
public string[,] textWords; //テキストの複数列を入れる2次元は配列
private int rowLength; //テキスト内の行数を取得する変数
private int columnLength; //テキスト内の列数を取得する変数
###TextAsset
テキストファイルをまるっと丸ごと入れ込む箱はTextAsset型のインスタンスを作成。その中にResourceフォルダ内にあるテキストファイルを読み込んで入れ込みました。このままではどうやらまだTextAssetの状態(?)ならしく、これをデータとしてきちんと扱えるようにsrting型に直してやる必要があるようです。なのでそのstring型のデータを入れる変数を用意しtextasst.textでこれまたまるっとstring型の中へ入れました。
private void Start()
{
TextAsset textasset = new TextAsset(); //テキストファイルのデータを取得する変数を用意
textasset = Resources.Load("Test", typeof(TextAsset) )as TextAsset; //Resourcesフォルダから対象テキストを取得
string TextLines = textasset.text; //テキスト全体をstring型で入れる変数を用意して入れる
###基準の文字を元に行ごとに分割する
Splitを使用します。今はテキストファイル全体がstring型で収納されているので、それをエスケープ文字を基準に分割します。textMessageは最初に用意してあげた1次的に使用する1次配列です。
//Splitで一行づつを代入した1次配列を作成
textMessage = TextLines.Split('\n'); //
このSplitでの行ごとの分割ですが、特に配列側で添え字で指定してあげなくても勝手に配列を作ってくれます。一番上のテキストの例ですと5行あるので、textMessage[0]~textMessage[4]まで自動で作られます。ですが、2次配列で同じようなことをやるとなぜかエラーが出てできませんでしたので、きちんと2次配列のサイズを決めてあげる必要がありました。それが次。
###テキストの列数と行数を取得
columnLength = textMessage[0].Split('\t').Length;
rowLength = TextLines.Split('\n').Length;
分割したものの数を数えていれています。(rowLength = TextLines.Split('\n').Length;
となっていたものをrowLength = textMessage.Length;
に修正!@sh_akiraさんご指摘ありがとうございます!)
###2次配列を定義してデータを入れ込み
//2次配列を定義
textWords = new string[rowLength, columnLength];
for(int i = 0; i < rowLength; i++)
{
string[] tempWords = textMessage[i].Split('\t'); //textMessageをカンマごとに分けたものを一時的にtempWordsに代入
for (int n = 0; n < columnLength; n++)
{
textWords[i, n] = tempWords[n]; //2次配列textWordsにカンマごとに分けたtempWordsを代入していく
Debug.Log(textWords[i, n]);
}
}
2次配列のサイズを定義してあげて、あとはよくあるforの入れ子でデータを入れ込み。Debug.Logでコンソールに書き出してチェックします。
無事読み込まれていることが確認できました!