今回はテキストファイルをUnityに取り込んでその中に記述してあるテキストをスクリプトから操作してみます。
これが出来ると何がいいかと言うとRPGやサウンドノベルゲームで会話のテキストをスクリプト内に記述してもいいですが、
テキスト量が多くなり処理内容を探すだけでウインドウを多くスクロールする必要が出てきます。
スクリプト内には処理する内容だけを記述し、実際に表示するテキストと分けておいた方が管理しやすくなります。
(テキストだけを記述したクラス等を作成して、表示したいテキストを返すようにするのもいいかもしれません)
テキストファイルを取りこむサンプルの作成
テキストファイルを取り込むサンプルを作成していきます。
テキストファイルの作成
まずはパソコン内にテキストファイルを作成します。
↑のように普通のテキストファイル(.txt)を作成します。
↑のようにサンプルのテキストを記述します(↑はテキストファイルの中身です)。
ここでは適当にテキストを入力してください。
スクリプトで1回に表示するのは改行までになります。
Unityに作成したテキストファイルを取りこみResourcesフォルダに入れる
Unityに作成したテキストファイルを取り込んで使ってみます。
UnityのメニューのAssets→Import New Asset…を選択し、さきほど作成したテキストファイルを選択します。
Unityに取り込むとテキストファイルは↑のようになります。
取り込んだテキストファイルをダブルクリックするとデフォルトではMonoDevelopが起動しテキストの内容を変更する事が出来ます。
Unity内でテキストファイルの作成は出来ないんかな?(謎)
Unityでテキストファイルの中身を作るには一旦ダミーのテキストファイルを取り込んだ後に中身を編集する必要があるかもしれませんね。
次にUnityに取り込んだTest.txtをCtrl+Dキーでコピーし名前をTest2とします。
Test2ファイルの中身は
↑のようにしました。
その後ProjectタブのAssetsフォルダで右クリック→Create→Folderを選択し、名前をResourcesとします。
フォルダをResourcesとすると特別なフォルダとなります。
Resourcesフォルダにあるアセットやオブジェクトを直接読み込む事が出来ます。
スクリプトから指定のテキストファイルを選択する時に直接ファイル名で読みだす事が出来ます。
このフォルダにTest2ファイルを移動させます。
これでテキストファイルの準備が出来たので、次は左クリックした時にTestファイルの中身を、右クリックした時にTest2ファイルの中身を表示するようにしてみます。
テキストファイルの中身表示用UIを作成
まずはテキストファイルの中身を表示するUIを作成します。
↑のようにシンプルにCanvas直下にTextを作成します。
テキストファイルの中身を読み込むLoadTextスクリプトの作成
Canvasには新しくLoadTextスクリプトを作成し取りつけておきます。
LoadTextは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | using UnityEngine; using System.Collections; using UnityEngine.UI; public class LoadText : MonoBehaviour { // 読み込んだテキストを出力するUIテキスト [SerializeField] private Text dataText; // 読む込むテキストが書き込まれている.txtファイル [SerializeField] private TextAsset textAsset; // テキストファイルから読み込んだデータ private string loadText1; // Resourcesフォルダから直接テキストを読み込む private string loadText2; // 改行で分割して配列に入れる private string[] splitText1; // 改行で分割して配列に入れる private string[] splitText2; // 現在表示中テキスト1番号 private int textNum1; // 現在表示中テキスト2番号 private int textNum2; void Start () { loadText1 = textAsset.text; loadText2 = (Resources.Load("Test2", typeof(TextAsset)) as TextAsset).text; splitText1 = loadText1.Split(char.Parse("\n")); splitText2 = loadText2.Split(char.Parse("\n")); textNum1 = 0; textNum2 = 0; dataText.text = "マウスの左クリックで通常のテキストファイルの読み込み、右クリックでResourcesフォルダ内のテキストファイル読み込みしたテキストが表示されます。"; } void Update () { // 読み込んだテキストファイルの内容を表示 if(Input.GetButtonDown("Fire1")) { if(splitText1[textNum1] != "") { dataText.text = splitText1[textNum1]; textNum1++; if(textNum1 >= splitText1.Length) { textNum1 = 0; } } else { dataText.text = ""; textNum1++; } // Resourcesフォルダに配置したテキストファイルの内容を表示 } else if(Input.GetButtonDown("Fire2")) { if(splitText2[textNum2] != "") { dataText.text = splitText2[textNum2]; textNum2++; if(textNum2 >= splitText2.Length) { textNum2 = 0; } } else { dataText.text = ""; textNum2++; } } } } |
それでは中身を少し見てみましょう。
LoadTextスクリプトの解説
1 2 3 4 5 6 7 8 9 10 11 | void Start () { loadText1 = textAsset.text; loadText2 = (Resources.Load("Test2", typeof(TextAsset)) as TextAsset).text; splitText1 = loadText1.Split(char.Parse("\n")); splitText2 = loadText2.Split(char.Parse("\n")); textNum1 = 0; textNum2 = 0; dataText.text = "マウスの左クリックで通常のテキストファイルの読み込み、右クリックでResourcesフォルダ内のテキストファイル読み込みしたテキストが表示されます。"; } |
テキストファイルを扱うにはTextAssetを使用する必要があります。
その参照変数をtextAssetとしたら
1 2 3 | textAsset.text |
で中身を全部取り出せます。
ResourcesフォルダのTest2ファイルを取り出すには
Resources.Load関数を使用し第1引数にファイル名、第2引数にそのファイルの型を指定します。
読み込んだテキストファイルは改行文字(¥n)を含んだ形で記述されていますので、Split関数を使用して\nを使って分割し文字列型の配列に入れます。
Splitは引数の文字で分割し、文字列型の配列を値として返します。
通常のJavaScriptであれば
『分割したい文字列』.Split(“\n”);
で分割出来るんですがUnityだと”(ダブルクォーテーション)、’(シングルクォーテーション)どちらでもstring型と判断されてしまう為、あえて
1 2 3 | char.Parse("\n") |
として、\nを1つの文字に変換して使用しています。
Parseはその型に変換する事が出来ます。
1 2 3 4 | float.Parse("3.14"); // 文字列をfloatに変換 int.Parse("2"); // 文字列をintに変換 |
一番難しい部分は説明し終えました。
後は配列に入れたメッセージを順番に表示しているだけです。
ただ\nで分割しているので連続で改行文字が来た場合は配列の中身が空の場合があります。
そういった時は会話が終了した時と判断し会話を終わらせたりして、次の会話がくるまで待たせたりする事が出来ます。
テキストファイルの読み込みを確認する
ではUnityを実行してメッセージが表示されるか確認してみましょう。
LoadTextは↑のように設定します。
↑のようになりました。
改行文字でメッセージが区切られている為マウスボタンを押すたびに次の文字列が表示されています。
サンプル動画では最後適当に連打していますが気にしないでください・・・・・(^_^;)